Page 76 - 《软件学报》2025年第9期
P. 76
韩柳彤 等: 面向 RISC-V 向量扩展的高性能算法库优化方法 3987
平台的向量类型和向量操作, 暴露一套通用内建函数接口, 并使用该通用接口编写优化算法, 从而解决面向不同处
理器平台的代码碎片化问题. 使用通用内建函数编写的向量加速代码可以通过编译时调度, 在不同平台上调用各
平台特定的内建函数, 从而实现同一套加速代码的跨平台使用, 提高算法库在不同平台上的性能.
目前的 SIMD 指令集扩展大多具有固定长度的向量寄存器, OpenCV 的通用内建函数也基于定长的 SIMD 扩
[9]
展而设计. 然而, RISC-V 的向量扩展 (RISC-V vector extension, RVV) 采用了可变长的向量寄存器设计, 即对于不
同的 RISC-V 向量扩展硬件实现, 其向量寄存器长度可以是不同的. 这使 RISC-V 向量扩展难以作为 OpenCV 通用
内建函数的后端平台, 极大地影响了 RISC-V 设备在 OpenCV 算法库中的应用前景. OpenCV 目前将 RISC-V 向量
扩展视为固定长度的 SIMD 扩展, 从而在兼容现有硬件抽象层设计的情况下添加对 RISC-V 平台的支持, 但这反
而影响了其在 RISC-V 设备上的性能表现. 考虑到 OpenCV 广泛应用于工业和学术界, 是许多项目和研究的基础,
如果无法在 RISC-V 平台上支持这一重要算法库的关键基础设施, 可能会阻碍该架构在研究和开发领域的应用与
推广, 在一定程度上会限制 RISC-V 软件生态的发展.
针对上述问题, 本文提出了一种面向 RISC-V 向量扩展和其他主流 SIMD 扩展的算法库优化方法, 并据此为
OpenCV 算法库设计了全新的通用内建函数框架, 进而实现了 OpenCV 算法库中通用内建函数的 RISC-V 后端及
其他 RISC-V 向量优化. 本文将应用了 RISC-V 向量优化的 OpenCV 算法库与原版算法库进行性能比较, 实验结果
表明本方法可以将 RISC-V 向量扩展引入到现有算法库的优化机制中, 从而提升算法库在 RISC-V 设备上的执行
性能, 验证了方法的有效性. 此外, 本文所述工作已经开源, 并被 OpenCV 社区接受和集成到其源代码中, 体现了本
方法的实用性和应用价值.
本文第 1 节介绍背景知识和相关工作, 分析 RISC-V 向量扩展与其他 SIMD 扩展的核心差异, 并讨论 OpenCV
通用内建函数设计的局限性. 第 2 节提出面向 RISC-V 向量扩展的算法库优化方法. 第 3 节介绍将 RISC-V 向量扩
展作为通用内建函数后端的设计挑战, 以及适用于可变长向量体系结构的通用内建函数的设计与实现方案. 第 4
节通过实验评估上述通用内建函数的执行效率. 第 5 节进行总结和展望, 并讨论了此方法的局限性.
1 背景知识与相关工作
1.1 算法库的并行优化方法
算法库并行优化方法的设计需要在性能、开发难度和可维护性之间进行权衡. 算法库通常专门针对领域特定
的计算需求, 采用不同的编程策略以实现高性能. 编程策略从通用到专用可以分为 4 类: 高级编程语言、特定硬件
的通用编程模型、特定硬件的专用编程模型以及特定硬件的专用内联汇编.
使用高级编程语言进行算法库设计的方法具有较低的开发难度和较强的可维护性. 由于这种方法是硬件无关的,
其性能表现依赖于编译器的优化能力, 例如 GCC 或 LLVM 的自动向量化 [10] , 以及面向领域特定编程语言 Halide [11]
的算法实现与编译调度分离策略. 尽管其编程方法具有广泛的通用性, 但计算负载的实现到硬件指令无法实现最
优化映射, 通常需要针对特定硬件进行长时间的调优以提高性能.
使用特定硬件的通用编程模型进行算法库设计的方法可以在性能、开发难度和可维护性之间达到相对平衡.
这类编程模型在高级编程语言的基础上提供硬件抽象层, 使用此抽象层接口来实现领域特定的计算负载. 具体实
现分为算法库集成的编程接口和独立的硬件编程库. 其中, 算法库集成的编程接口为特定算法库服务, 接口的抽象
级别和颗粒度可专门为算法库所面向的领域设计. 例如, OpenCV 的通用内建函数面向图像处理领域设计了统一
的高性能编程接口, 集成了各种平台特定的 SIMD 及向量计算操作. 而如 C++ SIMD 库 [12] 及 Google Highway [13] 等
独立的硬件编程库提供了较为全面的硬件抽象, 但其面向通用计算需求抽象出的向量操作语义并不完全适合于特
定领域的计算需求. 此外, 在大型开源软件中引入额外的开源第三方库还可能存在许可证不兼容或上游开源软件
供应链“投毒”的风险 [14] . 因此, 第三方的硬件编程库在高性能算法库的跨平台性能优化中的应用也较为有限.
使用特定硬件专用编程模型进行算法库设计的方法拥有性能优势, 被高性能算法库广泛采用. 但该方法需要
单独对每一种硬件架构进行优化算法的实现与维护, 存在重复开发的问题, 降低了算法库的开发效率和可维护性.

