Page 75 - 《软件学报》2025年第9期
P. 75
3986 软件学报 2025 年第 36 卷第 9 期
fails to accommodate the variable-length vector register introduced by the RISC-V vector extension. Treating RISC-V vector extensions as
fixed-length vectors within traditional HAL designs results in unnecessary overhead and performance degradation. To address this problem,
the study proposes a HAL design method compatible with both variable-length vector extensions and fixed-length SIMD extensions. Using
this approach, the universal intrinsic functions in the OpenCV library are redesigned and optimized to better support RISC-V vector
extension devices while maintaining compatibility with existing SIMD platforms. Performance comparisons between the optimized and
original OpenCV libraries reveal that the redesigned universal intrinsic function efficiently integrates RISC-V vector extensions into the
HAL optimization framework, achieving a 3.93× performance improvement in core modules. These results validate the effectiveness of the
proposed method, significantly enhancing the execution performance of high-performance libraries on RISC-V devices. In addition, the
proposed approach has been open-sourced and integrated into the OpenCV repository, demonstrating its practicality and application value.
Key words: RISC-V vector extension; data-level parallelism; high-performance library optimization; open source computer vision library
(OpenCV)
高性能算法库是专门设计用于执行复杂计算任务并优化其计算效率的软件库, 能够在多种硬件平台上高效运
行. 这种算法库提供高效的算法实现, 并通过应用硬件加速与并行计算等方法, 减少开发者从零开始编写复杂算法
的需求, 显著提高了程序的开发效率和运行性能, 在软件生态中的意义重大. 高性能算法库在满足计算机视觉应用
的高性能计算需求方面也起到了至关重要的作用. 如今, 计算机视觉应用已经被广泛使用于人类生产生活的诸多
领域, 通常涉及多种计算机视觉算法, 随着各个应用场景对于多媒体数据处理的实时性需求不断增加, 如何提高计
算机视觉算法的执行性能已成为该领域的研究热点之一.
计算机视觉算法需要对于输入的多媒体数据进行转换、调整和一系列运算, 而这些运算通常需要重复施加于
不同的数据上 (如视频中的每一帧或图像中的每个通道及像素). 基于这样的计算特征, 计算机视觉算法的计算负
载非常适合使用数据级并行技术来提高计算性能. 数据级并行是一种在多个处理单元上同时处理不同数据的技
术, 随着该技术的发展, 图形处理单元 (GPU) 和单指令多数据 (SIMD) 体系结构被相继提出, 能够极大地提高计算
机视觉算法的执行性能.
想要充分利用特定体系结构的硬件能力提高算法的执行性能, 通常需要使用与之对应的编程模型. 例如,
[1]
[2]
CUDA 是 NVIDIA 针对其 GPU 设备提供的并行编程模型, OpenCL 则是一个更为开放的标准框架, 适用于更多
的 GPU 和其他异构设备. 而与 GPU 设备不同, SIMD 体系结构更多被设计为通用处理器的多媒体扩展. 现今, 主
流的桌面/服务器处理器和部分嵌入式处理器都拥有 SIMD 扩展, 如 Intel x86 架构的 SSE 和 AVX/AVX2/AVX-512
指令集扩展 [3] , ARM 架构中的 Neon 和 SVE/SVE2 指令集扩展 [4] , 以及龙芯 LoongArch 指令集架构的 LSX 和 LASX
指令集扩展 [5] . RISC-V 作为一种新兴的开源精简指令集架构, 其向量扩展和压缩 SIMD 扩展也提供了数据级并
[6]
行处理能力.
不同的指令集扩展具有互不兼容的操作指令和能够发挥各自硬件优势的编程模型. 因此, 高性能算法库的维
护者在面对多种指令集扩展时, 通常需要为同一算法编写多个版本的优化实现, 以适配不同的硬件特性和优化需
求. 例如, 在图像处理算法的优化实现时, 使用 x86 的 AVX-512 指令集提供的向量指令编写该算法可以显著提升
其处理数据的速度, 但这段代码在 ARM 设备、RISC-V 设备、甚至是仅支持 AVX2 的 x86 设备上都无法运行. 如
果希望该算法能够在不同平台上均获得性能提升, 就需要维护同一个算法在多个平台上的不同实现版本. 这种方
案对于在小型项目中将某几个算法优化到有限的平台上的应用场景而言是可行的, 但对于包含大量算法的算法库
来说, 实现和维护数量庞大的算法到多种平台上会带来组合爆炸的重复实现与代码碎片化的问题, 这不仅会消耗
大量的资源和时间, 还将会提高软件的错误率和复杂度. 因此, 有效组织和优化面向不同平台的代码成为了高性能
算法库开发与维护过程中的一个重要挑战.
[7]
OpenCV 是世界上规模最大的计算机视觉领域高性能算法库, 包含诸如滤波、增强、色彩空间转换和卷积
等计算密集型算法的高效实现, 提供了多种通用的计算机视觉和图像处理功能, 被广泛用于对象识别、图像分割、
相机校准、运动跟踪等领域. OpenCV 还具备硬件跨平台的能力, 力图实现在不同平台设备上的优秀性能. 因此也
面临着上文提到的“多算法-多平台”之间的代码碎片化问题.
[8]
为了解决该问题, OpenCV 内部设计了名为通用内建函数 (universal intrinsic) 的硬件抽象层. 其通过抽象各个

