Page 91 - 《软件学报》2025年第9期
P. 91

4002                                                       软件学报  2025  年第  36  卷第  9  期



                                                                                 图像读取
                                        本文方法                                     图像操作
                                高斯模糊                                             图像存储
                                          标量


                                        本文方法
                                边缘检测
                                          标量

                                        本文方法
                               二维码检测
                                          标量
                                              0     5 000  10 000  15 000      65 000  70 000
                                                               执行时间 (ms)
                                      图 7 计算机视觉应用程序在         RISC-V  开发板上的执行时间

                    而  RISC-V  向量扩展的寄存器分组功能允许将两个向量寄存器视为一组, 此时, 即便使用通用内建函数编写
                 的算法仅使用了不超过        16 个向量寄存器, 在其映射到       RISC-V  向量扩展的后端实现后, 此算法将能够使用            RISC-V
                 向量扩展设备中不超过        32  个物理向量寄存器, 从而更加充分地利用硬件资源. 在              RISC-V  向量扩展的内建函数中,
                 针对寄存器分组特性提供了相应的向量类型表示和向量操作表示. 例如, vfloat32m1_t 表示不分组的浮点数向量类
                 型, 而  vfloat32m2_t 表示将两个向量寄存器视为一组的浮点数向量类型, 本文提出的硬件抽象层中的通用向量类
                 型  v_float32  就映射到该类型上, 从而使用寄存器分组特性进一步提升优化效果. 类似地, 对                   vfloat32m2_t 类型进
                 行加法操作的函数定义为__riscv_vfadd_vv_f32m2, 硬件抽象层中的           v_add  函数映射到该函数上, 最终由编译器生
                 成相应的状态寄存器配置指令, 从而实现分组使用寄存器资源.
                    表  7  对比了不使用寄存器分组       (m1, 即向量寄存器各为一组) 和将两个向量寄存器视为一组                 (m2, 本文方法采
                 用) 时, 核心模块的测试用例在不同开发板上的加速比. 结果显示, 在大部分测试用例中, 采用将两个向量寄存器视
                 为一组的设计方案有助于提高性能表现.


                                       表 7 不同寄存器分组在        OpenCV  核心模块中的加速比

                                                    BPI-F3                         CanMV-K230
                       测试用例类别
                                              m1             m2               m1               m2
                        Abs/Absdiff          3.95            4.60            3.26             3.79
                          Add                3.48            4.34            2.75             3.20
                        BitwiseLogic         5.72            5.34            4.94             5.39
                        Clone/Copy           1.54            1.61            1.27             1.35
                         Compare             2.78            2.89            2.24             2.71
                         Convert             3.37            4.91            1.74             2.51
                       CountNonZero          4.59            6.22            2.33             3.46
                        CustomPtr            6.52            6.74            5.24             6.10
                        Decompose            1.00            1.01            1.00             1.01
                          Divide             4.18            4.65            1.81             2.12
                           Dot               4.02            5.09            2.62             3.83
                         InRange             2.83            3.11            2.20             2.45
                         KMeans              1.24            0.90            1.29             1.06
                          Max                7.90            8.44            6.91             7.79
                          Mean               1.17            1.14            1.01             0.99
                          Merge              1.12            0.93            1.21             1.02
   86   87   88   89   90   91   92   93   94   95   96