Page 385 - 《软件学报》2025年第10期
P. 385
4782 软件学报 2025 年第 36 卷第 10 期
方法上使用 SIMD 指令向量化无法达到加速效果, 原因在于计算向量化带来的性能提升无法覆盖由 vector.gather
操作引入的不连续访存开销.
表 4 脉冲传播操作运行时间优化评测 (s)
神经元发放率(%)/连接密度(%)
发放状态稀疏性 连接矩阵稀疏性 SIMD向量化
1/10 5/10 10/10 1/100 5/100 10/100
稠密 稠密 × 87.710 83.314 83.558 84.175 83.884 84.846
稀疏 稠密 × 0.854 3.826 7.898 0.853 3.859 7.824
稀疏 稠密 √ 0.257 0.876 1.880 0.255 0.853 2.011
稀疏 稀疏 × 0.571 1.042 1.519 5.476 11.740 20.521
稀疏 稀疏 √ 0.562 1.107 1.836 5.185 11.693 19.965
需要指出的是, 测试表明, 针对连接矩阵与发放状态的不同稀疏度, 不存在一个一致的最优方法 (见表 4); 可
以通过应用描述层的相关附加属性由使用者来给出编译指示, 如连接矩阵与发放状态的存储方式 (这一属性将递
降为 SNN 方言中的属性“sparse_tensor encoding”, 见表 3. 比如在发放状态属性为“compressed” (表示稀疏, 即压缩
后仅存非零元) 的前提下, 连接矩阵属性若为“dense”, 则采用“SIMD 向量化”优化, 取值“compressed”则不采用, 但
是进行稀疏计算优化等).
4.2 合并与向量化优化评测
我们评测了神经元组的合并以及计算向量化所带来的性能变化. 计算神经学应用的网络往往包含多个相同类
型神经元组, 可以将其合并成一个更大的神经元组. 首先构造了一个包含 8 个大小为 10 000 的 LIF 神经元组的网
络, 并将其合并为 4 个大小为 20 000、2 个大小为 40 000、1 个大小为 80 000 的神经元组, 对比不同合并粒度的性
能提升. 同时, 也对比了使用 SIMD 向量计算对神经元计算 (浮点计算) 的性能提升. 具体的, 对比了在 vector 方言
中设定不同向量长度带来的性能变化 (如 vector<8xf32> 将 8 个 32 位浮点数视作一个单位, 参与访存以及运算).
vector 方言最终被转换为 AVX256 指令进行运算.
5
图 4 为重复执行神经元更新过程 10 次后的测试结果. 由结果可知, 神经元合并与向量化都可以带来性能提
升. 当向量长度为 1 时 (以串行方式执行), 整体运行时间最慢. 随着向量长度不断增加 (2、4、8、16), 神经元更
新的并行性逐渐被挖掘, 运行时间逐渐减少; 当向量长度等于 16 时, 整体性能达到最优, 与向量长度为 1 时 (不使
用 SIMD 指令加速) 相比可达到 6.7 倍的性能加速. 但随着向量长度的进一步增大 (32、64、128), 运行时间则略
微增加. 经过分析不同向量长度所对应的汇编指令, 发现性能降低的原因是由于向量寄存器数目有限, 当向量长
度增加时, 不足以同时存储所有内部状态, 对于超出部分会发生溢出 (spilling, 即将部分寄存器的值转移到栈上,
并直到需要参与计算时再将这些值从栈上重新转移回寄存器中), 从而导致部分不必要的内存移动, 在执行时增
加了额外开销.
20
16.45
15
性能倍数 10
5
2.35
0
SpikingJelly NEST
图 4 CPU 后端上相比于其他实现的性能优势
4.3 CPU 后端的端到端的测试
Brunel 和 MNIST 推理任务分别代表计算神经学和 D-SNN 方向的典型类脑应用. 我们测试了由 BIVM 编译

