Page 84 - 《软件学报》2026年第6期
P. 84

刘佳玮 等: 面向   RISC-V  架构的深度学习算子测试                                                 2403


                 复杂度下显著受益于       RVV: 算子  45 (MatMul) 的  CPU  时间比值在高复杂度下明显低于中、低复杂度, 表明其在大
                 规模计算场景中能够更充分地受益于向量化执行. 同样, 算子                  7 (Conv2D) 和算子  41 (BatchNorm) 在高复杂度配置
                 下的  CPU  时间、用户态    CPU  占比及缺页率比值整体低于中、低复杂度, 显示出在较大数据规模下更稳定的性能
                 表现. 相比之下, 部分算子在启用         RVV  后未表现出一致的性能收益. 例如, 算子          24 (Mean) 和算子  33 (Softmax) 在
                 中复杂度下的缺页率比值明显升高, 表明归约类算子在该配置下, 其内存访问模式可能对缓存局部性产生一定影
                 响, 从而增加内存访问开销.

                                                      2.0                                          2.0
                      常驻内存                                         常驻内存
                       缺页率                            1.5           缺页率                            1.5
                  用户态CPU占比                            1.0  rw/rv比值  用户态CPU占比                       1.0  rw/rv比值
                      CPU时间                           0.7          CPU时间                           0.7
                      精度损失                            0.5          精度损失                            0.5
                           1  5  9 13 17 21 25 29 33 37 41 45 47         1  5  9 13 17 21 25 29 33 37 41 45 47
                                     算子编号                                         算子编号
                 图 6    深度学习算子在向量扩展指令支持下的多维度                   图 7    深度学习算子在向量扩展指令支持下的多维度
                              性能表现   (高复杂度)                                性能表现    (中复杂度)


                                                                             2.0
                                             常驻内存
                                              缺页率                            1.5
                                         用户态CPU占比                            1.0  rw/rv比值
                                             CPU时间                           0.7
                                             精度损失                            0.5
                                                  1  5  9 13 17 21 25 29 33 37 41 45 47
                                                            算子编号
                                图 8    深度学习算子在向量扩展指令支持下的多维度性能表现                  (低复杂度)
                    进一步分析发现, RVV      带来的性能变化与数据规模具有显著相关性. 算子                4 (Cast) 的  CPU  时间比值从高复杂
                 度到中、低复杂度呈现逐步回升趋势, 表明在小规模数据场景中, 向量化的启动与配置开销在总执行时间中占据
                 更高比例, 从而削弱了向量化带来的收益. 在低复杂度下, 算子                  29 (ReLU) 等激活函数的    CPU  时间比值接近    1.0,
                 但在高复杂度下有明显下降, 同样验证了这一规律. 此外, 算子                  6 (Concatenation) 和算子  12 (ExpandDims) 等张量
                 操作在所有层级的       CPU  时间比值变化都不大, 但缺页率比值从低复杂度到高复杂度有明显上升, 表明这类算子
                 的  RVV  优化主要体现在内存布局效率而非计算加速.
                    基于上述实验观察, 可以看出         RIVdoo  在刻画  RVV  适用范围方面的分析能力. 第一, RIVdoo        的复杂度分组策
                 略使得   RVV  在不同负载区间下的性能行为得以系统呈现. 通过高、中、低这                    3  个层级的系统测试, RIVdoo     发现
                 计算密集型算子      (MatMul、Conv2D) 在高复杂度下     RVV  收益显著, 而部分算子      (Div、Mean) 反而性能劣化, 且这
                 种差异在不同复杂度层级呈现不同模式. 这些结果为                 RISC-V  平台上  RVV  的选择性启用和参数配置提供了实验
                 依据, 而非简单的“启用或禁用”结论. 第二, RIVdoo         的多维度监控揭示了        RVV  优化的系统级副作用. 除       CPU  时间
                 外, 缺页率和用户态      CPU  占比等指标暴露了向量化可能带来的缓存失效和系统开销增加问题, 帮助开发者避免
                 “看似加速实则引入新瓶颈”的优化陷阱. 第三, 47 个算子的大规模覆盖确保了结论的可靠性, 成功识别出                           Div、Mean
                 等  RVV  适配薄弱的特殊案例, 为后续       RVV  优化策略的改进和验证提供了参考样本.
                    现有的深度学习算子测试方法主要采用固定参数配置或单一场景验证, 无法发现这些复杂度相关的性能分化
                 问题. 值得注意的是, 图     3−图  8 中的精度损失维度在所有算子和所有复杂度层级下均呈现白色                    (比值≈1),表明  TFLite
                 和  TVM  的精度误差保持在相同的数量级          (10E–5  到  10E–6), 复杂度变化对算子输出精度的影响微乎其微. 这一结
                 果说明, 上述性能差异主要体现为实现层面的架构适配行为, 而非数值计算正确性问题. 更重要的是, 现有方法聚
                 焦于算子的输出正确性而忽略效率、内存和系统层面的适配质量, 无法全面反映算子在资源受限的                                 RISC-V  环境
                 下的真实部署表现. 本研究发现的性能分化问题               (如  TVM  的缺页率异常、TFLite 的内存占用翻倍) 均未伴随精度
                 损失, 说明这些问题属于实现层面的架构适配行为而非算法层面的正确性错误, 传统基于输出验证的测试方法难
                 以识别此类隐蔽的质量问题.
   79   80   81   82   83   84   85   86   87   88   89