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

