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

杨乐 等: BIVM: 类脑计算编译框架及其原型研究                                                      4775


                 对不同硬件选择不同优化策略). 对于一个新的后端架构, 将适配过程尽量变为各类方言与编译优化方法的选取、
                 定制与融合过程, 简化开发过程.
                    第  3  层  IR  是针对特定目标硬件的    IR, 如针对通用芯片的      LLVM IR  或者对应某类具体硬件的         SNN  底层  IR.
                 我们也针对部分后端提出专属方言, 承接第              2  层  IR  中的计算描述过程, 并将神经网络计算过程映射到目标硬件
                 上  (支持调用目标硬件的运行时库接口或者其原生编译器等方式), 以展示在高生产力和高可移植性方面的潜力.

                                                    表 2 3  层  IR  优化示意

                    层级             存储优化                   并行计算优化                       其他优化
                           利用SNN发放状态全为0/1特性,
                   第1层IR   设计脉冲向量类型, 利用稀疏性                    -                           -
                           节省空间
                  第1层IR → 利用SNN计算的时空并行特性, 在空间维度上合并相似神经元/突触结                               -
                   第2层IR   构, 提高数据局部性, 并利于后续提高计算并行度
                   第2层IR   面向不同的类脑处理器架构选择不同粒度的抽象, 以便在第3层递降过程中, 可以针对不同硬件选择不同优化策略
                                                 利用SNN并行特性:                  (1) 面向CPU后端, 利用SNN稀疏特性优
                                                 (1) 面向CPU后端, 采用单指令流多数据
                           面向CPU后端, 仅保存发放状态                                  化脉冲传播计算, 使用稀疏格式索引发
                  第2层IR →  的下标, 将连接矩阵保存为稀疏       流 (SIMD)方式并行化神经元更新与脉        放状态与连接矩阵, 减少不必要运算
                   第3层IR                         冲传播计算
                           格式节省空间                                            (2) 面向ReRAM后端, 将脉冲传播操作
                                                 (2) 面向GaBAN后端, 转化为对应的类      转化为交叉开关阵列对应的指令
                                                 脑计算指令集
                           (1) 面向CPU后端, 采用通用优化 (如常量传播、无用代码消除)
                   第3层IR   (2) 面向ReRAM后端, 采用精度微调优化, 使用较低精度计算也能保持任务的高精度结果
                           (3) 面向GaBAN后端, 采用向量指令优化计算过程

                  3   各层  IR  设计与示例

                    本节首先给出      BIVM  的各层  IR  设计以及各层所体现出的针对         SNN  计算特点的编译优化技术, 并以一个经典
                 的生物神经网络为示例, 来说明每一层            IR  的设计和递降过程. 该示例网络为         Brunel [37] , 用于表示一类随机连接的
                 生物网络结构, 常被用作生物神经网络仿真的基准测试之一. 该网络包含                      10 000  个  LIF  神经元, 被分割为  1:4 两部
                 分, 之间以  10%  的概率使用静态突触相互连接.
                    特别的, 在充分复用      MLIR  框架及其已有方言的前提下, 针对          3  种不同类型的类脑计算后端硬件, 我们设计了
                 不同的底层方言, 来体现这类基于编译框架的开发方法的便捷性.
                  3.1   应用描述层
                    应用描述层是类脑计算编译框架的输入, 为用户提供                  Python  函数接口来声明   SNN  神经网络的结构和计算流
                 程, 其设计可以是灵活多样的. 目前我们参照             PyNN  [38] 的  Python  接口设计该层——PyNN  是一种与模拟器无关的
                 SNN  通用编程与声明接口, 可以确保该层完备、易移植且为领域开发人员所熟悉.
                    声明包含以下几部分: (1) 神经元组的数量、类型、内部变量的初始值; (2) 突触组的数量、类型、内部变量
                 的初始值, 以及神经元组的网络连接方式; (3) 神经元更新和脉冲传播的计算流程; (4) 对神经元组、突触组、神经
                 元更新以及脉冲传播的属性描述, 这些附加属性会影响后续递降过程中的具体编译优化过程, 如连接矩阵或者发
                 放状态的存储格式会影响脉冲传播操作的具体实现. Brunel 神经网络的结构和计算流程如后文图                             3(a) 所示. 将应
                 用描述层中的声明和       MLIR  操作进行匹配, 可以得到       MLIR  中第  1  层的  IR  表示.
                  3.2   第  1  层  IR
                    第  1  层  IR  主要由我们提出的   SNN  方言构成, 包含   SNN  应用相关的操作     (operations)、属性  (attributes) 和数
                 据类型   (data types), 主要描述神经元组、突触组、神经元更新过程、脉冲传播流程                   (见图  1  中的  neuron_upd  和
                 spike_prop  函数) 等  SNN  高层概念  (见表  3; 方言的形式化描述请见附录       A  中的表  A1). 第  1  层  IR  中的变量与操
                 作具有   SNN  高层语义, 在描述以及递降为下一层          IR  的过程中可以利用语义进行编译优化.
   373   374   375   376   377   378   379   380   381   382   383