Page 381 - 《软件学报》2025年第10期
P. 381

4778                                                      软件学报  2025  年第  36  卷第  10  期


                 脉冲传播阶段前完成即可. 这样相同类型的神经元组更新可以并行处理, 而由下面的                          IR  层级决定具体并行化策略;
                 同样可以对脉冲传播阶段做类似并行化处理. 此类优化与后续的优化措施是相互独立的.
                    具体实例请见图      3(b2): 将第  1 层  IR (图  3(b1)) 中的相同类型的神经元组  (2 个  snn.newlif 声明) 和突触组  (4 个
                 snn.newstatic 声明) 分别合并为规模更大的单一神经元组和单一突触组, 即图               3(b2) 中的  snn.newlif 与  snn.newstatic,
                 并且在计算阶段只需调用一次计算过程; 这给予了下面                  IR  层级更大优化空间.
                  3.3   第  2  层  IR

                    针对不同后端架构的计算特性, 第           2  层  IR  可灵活地组合不同粒度的计算过程描述. 在第           1  层  IR  到第  2  层  IR
                 的递降过程中, 可以选择沿用第          1  层  IR  中的粗粒度描述方式, 或是使用更低级的         MLIR  方言对各个操作的存储、
                 计算以及控制流进行详细描述. 粗粒度的             IR  描述了操作的类型与其输入输出变量, 这种表示适用于                 TrueNorth、
                 BrainScaleS  等类脑芯片, 它们将神经元模型粒度的硬件功能暴露出来作为粗粒度接口. 细粒度的                        IR  则描述了操
                 作内部的计算过程, 通过       MLIR  中内置的  memref、scf、arith 和  linalg 等方言对计算过程进行描述, 从而适合如      CPU、
                 SpiNNaker 等采用通用指令集的架构. 组合不同粒度的             IR  描述可以发挥   MLIR  中  progressivity  的特性, 提高复用
                 与开发效率, 并使得底层优化技术可自由选用, 实现不同后端上的高性能.
                    例如, 数据流    ReRAM  后端可使用交叉开关阵列对脉冲传播计算进行加速, 所以其脉冲传播操作在第                          2  层  IR
                 中需要维持粗粒度的描述方式, 此方式可直接将突触权值、脉冲发放状态映射到交叉开关阵列上, 而无需将其递
                 降为更细粒度的描述方式. 但同时, 神经元更新操作仍需递降为细粒度描述.
                    图  3(c) 展示了  Brunel 神经网络的第   2  层  IR. 在网络模拟阶段, 神经元更新操作可以维持第           1  层  IR  中的粗粒
                 度表示   (x1); 也可以递降为细粒度表示       (x2), 使用循环操作描述每一个神经元根据方程更新内部状态的计算过程.
                 同理, 脉冲传播操作可以根据后端选用粗粒度表示                (y1) 或细粒度表示    (y2).
                    第  2  层  IR  的细粒度表示主要使用    MLIR  内置方言对各类操作的存储、计算及控制流进行表示, 具体如下.
                    ● memref 方言用作   SNN  模型中的神经元内部状态存储, 通过声明            memory buffer 来指示变量的存储空间. 由
                 于  SNN  中存储的变量会被反复改写, 因此不适合使用             MLIR  中的  tensor 方言来存储  (MLIR  中的  tensor 值无法被
                 修改, 多用于存储     DNN  中的  feature maps).
                    ● sparse tensor 方言用作稀疏张量存储. sparse tensor 方言提供了一套通用的张量稀疏存储格式, 例如可声明
                 突触权值矩阵使用稀疏格式进行存储. 其优势还在于实现了一系列稀疏张量操作, 在操作过程中只需要附加稀疏
                 属性, 而不会破坏张量运算描述的原有结构.
                    ● scf 方言和  linalg  方言用作描述  SNN  计算流程中的控制流. linalg   方言是对高层控制流的描述, 可以抽象地
                 表示一个张量计算的过程, 并且自动完成到低层的递降. scf 方言则通过                    if 操作和  for 操作来描述低层控制流, 在
                 计算规则较为固定的时候可以更好地实现优化.
                    ● arith  方言用于描述  SNN  的核心计算. arith  可以实现对标量或向量的基础计算, 是一个             MLIR  核心方言, 贯
                 穿整个递降过程.
                  3.4   第  3  层  IR
                    在  MLIR  框架下不同后端的第       3  层  IR  既有差异部分, 也有复用部分, 从而在确保定制优化的前提下, 提高开
                 发效率. 不失一般性, 本文工作主要针对           3  类硬件后端, 即传统控制流后端        CPU、基于   ReRAM  交叉开关结构实现
                 的数据流后端     (简称为   ReRAM  后端)、基于   FPGA  实现的混合架构后端芯片         GaBAN (简称为   GaBAN  后端). 第  2
                 层  IR  到第  3 层  IR  的递降过程需要结合硬件后端特性, 针对特定操作进行改写与递降以适配计算方式.
                    具体而言, 控制流架构在第         3  层  IR  中继续延续第  2  层  IR  中的细粒度描述, 利用  SNN  的底层语义对网络中神
                 经元/突触的存储、更新传播过程中的内部状态计算, 以及模拟过程的控制流进行优化                         (见第  3.4.1 节). 数据流  ReRAM
                 后端通过其完成计算的功能主体 (交叉开关结构), 对脉冲传播计算进行加速, 即通过对第                          2  层  IR  中粗粒度的脉冲
                 传播过程进行改写, 并额外处理其存储和计算过程, 使其与交叉开关结构的计算方式相匹配                             (ReRAM  后端的详细
                 说明请见附录     B); 而对神经元更新操作, 仍采用第          2  层  IR  的细粒度描述  (见第  3.4.2  节). GaBAN  后端的第  3  层
   376   377   378   379   380   381   382   383   384   385   386