【ISSCC】论文详解-34.6 28nm 72.12TFLOPS/W混合存内计算架构

2024-09-04 23:04

本文主要是介绍【ISSCC】论文详解-34.6 28nm 72.12TFLOPS/W混合存内计算架构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文介绍ISSCC34.6文章,题目是《A 28nm 72.12TFLOPS/W Hybrid-Domain Outer-Product Based Floating-Point SRAM Computing-in-Memory Macro with Logarithm Bit-Width Residual ADC》(一种28nm 72.12TFLOPS/W混合域外积浮点SRAM存内计算宏单元,具有对数位宽残差ADC)。该研究结合数字存内计算电路结构和模拟存内计算电路结构的特点,提出了一种新型数模混合存内计算计算架构,并立足于高精确计算,展开了一系列研究。下面是对文章基本信息及创新点的详细介绍。

一、基本信息介绍

本文第一作者为中国科学院微电子研究所的2021级直博生袁易扬,共同作者来自中国科学院大学、北京理工大学、澳门大学等研究单位。

本研究立足于当前存内计算技术面临的计算精度不足以满足新型AI应用需求的问题,分析当前数字和模拟两种存内计算范式所面临的挑战:(1)模拟存内计算技术虽然因为使用晶体管计算而具备较低的阵列输入消耗,但ADC和阵列输出消耗高;数字存内计算技术中的加法树器件虽然具备较低的阵列输出和移位累加消耗,但计算阵列由于使用逻辑门而具备较高的阵列输入消耗。如何结合两种计算范式的优势,以实现最佳能效是当前存内计算技术所面临的挑战(2)ADC器件的精度、吞吐量和面积难以取得平衡,是模拟存内计算技术的重要挑战(3)数字存内计算核内部需要多个多级加法树,以实现高比特精度部分积和内积的计算。并基于上述挑战提出了三个创新点。

图1 文章背景及面临的挑战

二、创新点解析

  1. 数字和模拟计算范式的融合

本文提出了一种混合域8b CIM宏,分别使用模拟CIM进行高效阵列内比特乘法、使用数字CIM进行高效阵列外多比特移位累加,综合利用了模拟和数字CIM的优势。其中,模拟CIM比数字CIM的内嵌逻辑门可以用更少的晶体管进行更高效的阵列内比特乘法,而数字CIM加法器在进行阵列外多位移位和累加时比大型高精度模拟CIM ADC的效率要高得多。因此,本文提出一种方法来分离比特乘法和计算过程中的多比特移位和累加,以结合模拟和数字CIM的优势。

以具体的乘累加操作为例,如下图2所示,对于W[7:0]×A[7:0]的乘累加操作,首先通过如下所示的公式转换可以将其分为乘法和累加两种操作,分别用橙色和蓝色标注,橙色部分用模拟CIM执行,蓝色部分用数字CIM执行。

 

图2 数模混合公式转换

如下图3所示,在具体的电路实施上,模拟CIM用一个由传输端口和电流镜组成的阵列来处理乘法操作;数字CIM通过8周期累加对经过ADC转换之后的数据进行移位累加操纵。这种电路结构重复结合了模拟和数字CIM的优点,从而显著地提高了CIM宏性能。

图3 数模混合电路示意图

本文的数模混合方式的原理为将乘累加操作分别拆分为乘法和累加操作,再根据模拟和数字CIM的优势,分别让其进行乘法和累加操作。同年ISSCC 34.3中也提出了一种新颖的数模混合结构——“类闪电式”,这种数模混合方式的原理为拆分乘累加的比特数,分别用数字和模拟CIM进行处理。图4展示了“类闪电式”混合SRAM CIM宏架构,支持累加器长度可扩展。图中蓝色为数字计算部分,黄色为模拟计算部分,通过将高位、低位数字单元(HDU与LDU)与高位、低位模拟单元(HAU、LAU)进行排列组合(两个子阵列与HDU和LDU对组合,四个子阵列与HDU和LAU对组合,其余两个子阵列与HAU和LAU对组合),以此来进行高效的8位整数乘累加操作。这种方案大大减少了所需的ADC转换次数和存储需求,同时支持更大的累加长度,而无需存储大量的部分和,适合于CNN与Transformer。

图4 闪电式混合SRAM CIM宏架构

(2)零消折叠ADC架构(a zerocancelling folded-ADC architecture)

下图展示了对数位宽残差ADC的工作原理和电路结构。由模拟位乘法器得到的最大模拟电流值仅为单位电流的8倍,因此该残差ADC可以通过log₂8=3位有效区分非零状态,以避免直接使用折叠ADC(Folding ADC)而导致判断如下图所示的0~8的数据时出现模糊状态。

图5 零消结构对ADC的影响

即使是INT16或FP32等更高精度的需求,这种对数关系也依然成立,这极大地降低了ADC的位宽需求,从而提高计算能效。此外,减小的位宽允许更大的信号裕度,从而提高了精度。输入电流通过二极管连接的晶体管转换为电压,并被引导至两个串联的反相器,从而激活ADC。当没有电流输入时,残差ADC(Redisual ADC)会关闭以节省功耗,否则将基于残差比较原理工作。

图6 本研究ADC电路结构图

该ADC架构展示了与Flash ADC相当的吞吐量,并具有与SAR ADC相当的能耗。在模拟域中执行8位输入乘8位权重操作时,3位残差ADC的能效比ISSCC2021中J.-W. Su提出的3位SAR+2位斜率ADC提高了70%,比ISSCC2023中S.-E. Hsieh提出的8位SAR ADC提高了2.6倍。

两篇对比文献的全名为ISSCC2021,J.-W. Su,A 28nm 384kb 6T-SRAM Computation-in-Memory Macro with 8b Precision for AI Edge Chips;ISSCC2023,S.-E. Hsieh,A 70.85-86.27TOPS/W PVT-Insensitive 8b Word-Wise ACIM with Post-Processing Relaxation。

图7 本研究创新点二对比其他研究

(3)数模混合架构

论文中的Figure 34.6.5显示了基于外积的FP/INT双模CIM块的详细结构(The structure of the outer-product based FP/INT-CIM block),接下来我们对于这个架构中的每个模块分别进行分析。

图8 Outer Product CIM Architecture

首先,论文先介绍了外积计算(Outer-Product)的原理,与传统的内积计算不同,内积需要对多个部分和的乘积进行累加。而外积架构通过直接将激活矩阵的元素(element)与权重矩阵的向量(vector)相乘来生成结果。与内积计算相比,外积计算可以避免多层复杂的加法计算,可以减少计算复杂度并改善延迟,进一步提升能效(EF)。

图9 Outer Product Math Principle

架构中的稀疏控制电路(Sparsity Control Circuit,绿色部分)旨在优化对于稀疏矩阵的计算效率,进一步提升能效(EF)。论文采用了压缩稀疏行(CSR Format)的数据格式来储存稀疏矩阵中的数据,索引(Indices)记录非零元素所在的列号,索引指针(Index Pointers)来记录矩阵每一行的起始位置,也即每一行第一个非零元素在索引数组中的位置。在这种数据格式的存储下,稀疏控制电路可以利用CSR格式跳过零元素的计算,先通过索引指针找到每一行的起始位置,再通过索引定位非零元素的具体位置。

 

图10 Sparsity Control Circuit

架构包含可实现INT/FP双模计算的乘法器,如下图所示。在INT模式下,可以选择16比特权重存储单元的高位或低位的8比特传输到计算宏中,与1位权重值在宏中进行外积计算,此时无需调用指数&符号数计算模块(Exp&Sign Calc);在FP模式下,BF16的尾数传输至计算宏中,而符号和指数被发送到Exp&Sign Calc组件中分开计算,最终的计算结果还需要进行标准化和化整(Normalize & Round)并打包(Pack)实现BF16格式的输出。

图11 INT/FP双模乘法器

架构包含可实现INT/FP双模计算的累加器,如下图所示。在INT模式下,累加器接收来自乘法器的输出结果,进行移位累加;在BF16模式下,累加器会进行指数位对齐、尾数移位并累加等操作,在累加的过程中,如果尾数位发生溢出,可能还要对指数进行进一步的调整(Exp Adjust)。

三、总结

在本篇论文结尾,作者给出研究成果芯片对比其他文献的数据如下。

芯片图及参数总结表入下图所示。

本文提出的数模混合存内计算架构颇具特色,对比同年34.3的成果在更精细尺度上将数字和模拟存内计算范式的特色进行了结合,感兴趣的读者可以阅读我们之前对34.3文献的解析。

在零消折叠ADC架构中,作者使用了对数压缩的方式使ADC在能效、吞吐量中取得了平衡,为模拟电路设计提供了一种可能的思路和方向。

在基于外积的双模CIM架构中,文章使用了多种方法以提升能效EF,使用CSR格式存储数据以处理稀疏矩阵、执行外积运算以避免使用大扇入的多级加法器树,但是文章在进行双模计算时有着组件空闲的问题,在INT模式下,有关指数、符号数等计算组件处于空闲状态,双模情况下的硬件利用率仍是一个具有挑战性的问题。这一点在ISSCC2024 34.2中提出了一种解决办法,感兴趣的读者可以读我们之前对于34.2的解读。

这篇关于【ISSCC】论文详解-34.6 28nm 72.12TFLOPS/W混合存内计算架构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1137283

相关文章

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

MySQL中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be

python中的flask_sqlalchemy的使用及示例详解

《python中的flask_sqlalchemy的使用及示例详解》文章主要介绍了在使用SQLAlchemy创建模型实例时,通过元类动态创建实例的方式,并说明了如何在实例化时执行__init__方法,... 目录@orm.reconstructorSQLAlchemy的回滚关联其他模型数据库基本操作将数据添

Java中ArrayList与顺序表示例详解

《Java中ArrayList与顺序表示例详解》顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,:本文主要介绍Java中ArrayList与... 目录前言一、Java集合框架核心接口与分类ArrayList二、顺序表数据结构中的顺序表三、常用代码手动

JAVA线程的周期及调度机制详解

《JAVA线程的周期及调度机制详解》Java线程的生命周期包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,线程调度依赖操作系统,采用抢占... 目录Java线程的生命周期线程状态转换示例代码JAVA线程调度机制优先级设置示例注意事项JAVA线程

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

C++构造函数中explicit详解

《C++构造函数中explicit详解》explicit关键字用于修饰单参数构造函数或可以看作单参数的构造函数,阻止编译器进行隐式类型转换或拷贝初始化,本文就来介绍explicit的使用,感兴趣的可以... 目录1. 什么是explicit2. 隐式转换的问题3.explicit的使用示例基本用法多参数构造

Android使用java实现网络连通性检查详解

《Android使用java实现网络连通性检查详解》这篇文章主要为大家详细介绍了Android使用java实现网络连通性检查的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录NetCheck.Java(可直接拷贝)使用示例(Activity/Fragment 内)权限要求

MyBatis中的两种参数传递类型详解(示例代码)

《MyBatis中的两种参数传递类型详解(示例代码)》文章介绍了MyBatis中传递多个参数的两种方式,使用Map和使用@Param注解或封装POJO,Map方式适用于动态、不固定的参数,但可读性和安... 目录✅ android方式一:使用Map<String, Object>✅ 方式二:使用@Param

JAVA transient 关键字作用详解

《JAVAtransient关键字作用详解》Java的transient关键字用于修饰成员变量,使其不参与序列化过程,通过自定义序列化方法,可以手动控制transient变量的序列化行为,本文给大... 目录一、transient关键字作用二、原理详解三、典型使用场景四、代码示例五、注意事项六、与 stat