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 的过程中可以利用语义进行编译优化.

