浮点CIM技术杂谈
前言
直到2022年之前,基本上CIM技术支持的数制都以定点数为主导,大致经过了一个从低精度(INT1到INT4)到高精度(INT8为主流)的发展过程,不过定点只能用在推理场景,基本上没法搞定训练,于是2022年的ISSCC上出现了一篇浮点数字CIM的代表作[1]。随后由于CIM基本上卷无可卷,折腾浮点CIM技术成为了23到25年ISSCC上的一个非常热门的topic。
2023年ISSCC CIM session中9篇有2篇支持了浮点,2024年9篇有4篇是浮点,2025年7篇有4篇是浮点。
从分类角度来说,以2025年为界,前面的大部分工作以预对齐(align-fisrt/pre-alignment)为主流,而25年开始后对齐(multiply-first/post-alignment)成为了主流。
这篇文章会讲解一下两种方式的差异,以及当下浮点CIM的trend。
align-fisrt/pre-alignment的浮点CIM
浮点乘累加可以分为三个过程:乘法,对阶和加法。相比于定点乘累加,浮点的特殊之处就在于对阶上,浮点数需要对齐指数后才能进行加法操作,而这个对阶操作其实是个开销很大的环节。举个例子,在12nm上做的综合实验,fp32的乘法器面积206um2,加法器262um2,乘法器功耗0.3mW,加法器0.37W,都是浮点加法显著大于乘法,因为浮点加法中包含了对阶,加上对阶之后,出现了加法开销远超乘法的奇观。
除了开销大的问题之外,对阶的电路设计起来也比较麻烦,得先比较两个浮点的指数,找到大的一个之后,两者做差,然后再根据差值对尾数做移位,总共包含了比较-求差-移位三个环节。
开销大和设计复杂两个问题,导致早期的浮点CIM考虑找一条绕过对阶这件麻烦事的技术路径,最好能让浮点CIM直接复用定点CIM上的成果,于是预对阶技术就被采用了。
简单介绍一下预对阶,所谓预对阶就是将要计算的浮点数的指数在乘累加计算之前就预先做对齐,由于指数已经做完了对齐处理,因此浮点乘累加只剩下了定点乘法和加法操作,从而就能直接利用定点CIM的方法来做浮点CIM了。严格来说预对阶这件事并不是什么新鲜事,很早搞DSP的人就提出了块浮点技术,和这里的预对齐可以说一模一样,块浮点技术的优势显而易见,减少了开销的同时也简化了设计。
典型的预对阶CIM结构[1:1][2][3]主要分成两个环节,浮点权重采用片外预对阶,浮点激活采用片上预对阶。片上预对阶电路的设计主要是对输入的激活进行一个全局的比较-求差-移位,然后输出的就是指数对齐的尾数,可以直接和片外对齐好的浮点权重直接定点乘累加,做完之后,最后还有个规格化的过程,但此处不做详述了。
听上去很完美,但代价是什么呢?实际上做了一阵子后大伙发现预对阶听着很好,但其实很多情况下精度损失问题严重。具体来说,在预对阶过程中,尾数被移位之后,为了避免后面做定点乘累加时位数太大,一般会直接做一步截位操作,常规情况下,典型的BF16/INT8双数制的CIM设计[1:2][4]会把尾数截断到8位,从而直接复用INT8的乘累加。对于指数分布偏差较大的情况,预对阶操作可能会导致大量的数的低位直接被截断舍弃。更大的问题在于,预对阶技术把权重和激活两部分的对齐分离处理,但实际上真正的浮点乘累加过程,是得先算一下乘法后的部分积的指数,再去对阶的,因为可能有某个的指数比较大,而另一个比较小的情况,但两两相乘后结果还是比较大的情况,而把权重和激活的对阶分离处理显然忽略了这一点,较小的那个数会在对齐过程中被干掉很多精度,导致最后的结果也出现很大的误差。
一种优化思路是把预对阶的粒度做小,因为上述的问题主要是由于指数分布大引发的,粒度做小可以比较有效的规避这种问题,这个思路的典型CIM也是有的[5][6],实际上和现在正在发展的micro-scaling(MX)格式有异曲同工之妙。
multiply-first/post-alignment的浮点CIM
鉴于预对阶的浮点CIM存在上述问题,25年的ISSCC上出现了多篇后对阶的浮点CIM工作,具体来说就是把片上对阶操作放到了浮点乘法的后面,先做完浮点乘法,再去对阶然后做定点加法。这个思路实际上海力士的PIM设计里就这么干过[7],评估下来比堆一堆浮点加法器还是要好的。
但是从开销的角度上来说,后对阶的浮点CIM实际上会增加不少片上对阶的开销。之前预对阶的CIM的MVM操作中,整个片上对阶只发生了一次,对阶后的结果被所有的MAC电路直接复用。而后对阶的浮点CIM中,整个MVM操作中的每个VVM操作都需要一次对阶,因此对阶的开销会有一个显著的提升,具体增大多少由CIM的计算规模决定。
但是这样做的好处也是显著的,后对齐的精度相比预对齐显著提升,即使在累加过程中做更多的截断,依然可以保持很好的精度。
目前来说,后对齐的方法是眼下浮点CIM后续发展的主流方向,台积电在今年的VLSI上也发布了一个后对齐的3nm浮点CIM工作[8]。相比于预对齐浮点CIM向上搞不定训练,向下比推理能效比不过定点的尴尬处境,后对齐浮点CIM基本上可以cover训练和推理的场景。不过对阶开销的增大问题也会是后面的一个重点问题,目前还没有看到非常好的解决方案出来:)
总结
本文论述了浮点CIM技术的发源以及演进过程,讨论了两种典型技术各自的优缺点以及未来的技术方向,此外浮点CIM在支持的浮点数制上也有不断的发展(如FP8[6:1],Microscaling[9]格式等),期待该技术的后续进步。
引用
A 28nm 29.2TFLOPS/W BF16 and 36.5TOPS/W INT8 Reconfigurable Digital CIM Processor with Unified FP/INT Pipeline and Bitwise In-Memory Booth Multiplication for Cloud Deep Learning Acceleration ↩︎ ↩︎ ↩︎
A 28nm 64-kb 31.6-TFLOPS/W Digital-Domain Floating-Point-Computing-Unit and Double-Bit 6T-SRAM Computing-in-Memory Macro for Floating-Point CNNs ↩︎
A 28nm 128TFLOPS/W Computing-In-Memory Engine Supporting One-Shot Floating-Point NN Inference and On-Device Fine-Tuning for Edge AI ↩︎
A 16nm 96Kb Integer/Floating-Point Dual-Mode-Gain-Cell-Computing-in-Memory Macro Achieving 73.3-163.3TOPS/W and 33.2-91.2TFLOPS/W for AI-Edge Devices ↩︎
A 22nm 16Mb Floating-Point ReRAM Compute-in-Memory Macro with 31.2TFLOPS/W for AI Edge Devices ↩︎
A 28nm 192.3TFLOPS/W Accurate/Approximate Dual-Mode Transpose Digital 6T-SRAM CIM Macro for Floating-Point Edge Training and Inference ↩︎ ↩︎
A 1ynm 1.25V 8Gb, 16Gb/s/pin GDDR6-based Accelerator-in-Memory supporting 1TFLOPS MAC Operation and Various Activation Functions for Deep-Learning Applications ↩︎
A 3nm 125 TOPS/W-29 TFLOPS/W, 90 TOPS/mm2-17 TFLOPS/mm2 SRAM-Based INT8 and FP16 Digital-CIM Compiler with Multi-Weight Update/Cycle ↩︎
A 16nm 216kb, 188.4TOPS/W and 133.5TFLOPS/W Microscaling Multi-Mode Gain-Cell CIM Macro Edge-AI Devices ↩︎

浙公网安备 33010602011771号