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  编译
   380   381   382   383   384   385   386   387   388   389   390