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

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


                 特定硬件平台的专用编程模型针对高性能硬件指令提供了高级语言层面的编程语法和语义, 允许开发者为硬件平
                 台实现特定的优化算法. 例如图像处理领域的 libjpeg-turbo          [15] , Intel integrated performance primitives (IPP) 库等, 由
                 于其实现方式依赖于平台特定内建函数, 在添加 RISC-V 向量扩展支持时需要大量的移植, 并且从实践经验来看,
                 增加一种平台的内建函数支持会使整个算法库的维护难度骤增. 因此, 对可扩展性更强的 RISC-V 指令集生态来
                 说, 使用特定硬件的专用编程模型进行算法库的优化并不利于                    RISC-V  软硬件生态的健康发展.
                    使用特定硬件专用内联汇编进行算法库设计的方法可以达到极致的性能表现, 但这也带来了极高的开发和维
                 护难度. 这种方法在一些算法数量少且迭代升级周期长的优化场景中具备一定的可行性, 例如                              OpenSSL  中对于加
                 密算法就大量采用内联汇编的方法追求极致的性能表现. 此外, 一些领域特定的硬件加速器也使用内联汇编作为
                 其软件栈提供软硬件接口, 例如 RISC-V 生态中的 Gemmini           [16]  加速器通过内联汇编实现深度学习的算子库. 这种
                 方法虽在特定场景下有优势, 但当算法库的规模较大或有更新与重构需求时, 其开发和维护成本可能变得难以承
                 受, 因此其应用场景十分有限.

                 1.2   RISC-V 向量扩展及其特性
                    RISC-V 是一种新兴的开源精简指令集架构, 其模块化的特性使得                   RISC-V  架构能够更好地适应不同场景和
                 需求下的处理器设计. RISC-V       向量扩展是指令集的可选模块之一, 旨在提供数据级并行能力, 从而大幅提升数据
                 处理效率. 此扩展定义了一组向量指令及相关寄存器, 从而允许程序使用向量运算部件对大量数据进行并行处理.
                 Li 等人  [17] 评估了  RISC-V  向量扩展在提升计算机视觉算法效率方面的效果, 指出性能提升可达                   2.98  倍, 展现了
                 RISC-V  向量扩展在高性能计算领域的应用前景. 相较于其他支持数据级并行的指令集架构, RISC-V                         向量扩展具
                 有如下特性.
                    RISC-V 向量扩展的一个核心特性是向量长度不可知                (vector length agnostic, VLA). 这意味着寄存器的长度可
                 以根据不同硬件实现的需要而有所不同. 根据                RISC-V  向量扩展的标准规范, 寄存器长度          (VLEN) 可以是   32–
                 65 536  之间任意  2  的幂. 这种灵活的寄存器长度设计允许不同的硬件实现根据其需求和目标应用来选择最适合的
                 向量长度, 也使不同长度的向量寄存器            (如  128  位和  1 024  位) 能够共享相同的指令集, 并实现完全一致的功能, 无
                 需进行代码移植. 例如, 一个处理         2 048  个  32  位元素的程序, 在  128  位的向量平台上每次处理       4  个元素, 需循环
                 512  次; 而在  256  位平台上, 则每次可处理    8  个元素, 只需循环   256  次. 因此, 正确编写的   RISC-V  向量扩展程序可
                 以在不同寄存器长度的硬件设备上都获得最佳性能, 而避免产生硬件资源浪费.
                    另一个特性是寄存器分组, 通过设置相关参数将多个向量寄存器组成寄存器组. 依据                           RISC-V  向量扩展规范,
                 每个处理器核心配备        32  个向量寄存器, 每个向量寄存器具有         VLEN  长度. 规范还允许将      2/4/8  个寄存器视为一组
                 使用, 从而使得指令可以操作相应倍数            VLEN  长度的寄存器组, 此时可用的寄存器数量也相应减少. 采用适当的
                 寄存器组策略可以使单条向量指令处理更多数据, 节约指令条数并在循环结构中减少循环迭代次数, 进而在数据
                 量大的可并行程序中获得一定的性能提升.
                    第  3  个特性是具有向量长度寄存器, 它保存一个无符号整数, 指定向量指令操作的元素数量. 在编程模型中,
                 此寄存器常用于尾循环处理, 即处理数据结尾的少量元素以防止内存越界. 与传统                          SIMD  运算器单次处理固定数
                 量的数据不同, RISC-V    向量扩展允许通过控制指令设置向量长度寄存器, 从而动态调整循环迭代中向量操作处理
                 的数据数量. 这样, 在处理尾循环时, 向量长度可以精确设置为剩余元素数量, 确保加载、运算和存储操作的边界
                 安全, 而无需使用向量掩码或添加额外的标量循环, 从而更高效地实现算法功能.

                 2   面向  RISC-V  向量扩展的算法库优化设计方法

                    算法的性能优化可以通过使用特定平台的内建函数来实现, 而算法库的性能优化则往往需要引入统一的硬件
                 抽象层, 从而提高算法优化的通用性, 避免“多算法-多平台”之间的组合爆炸引发的代码碎片化问题. RISC-V                             向量
                 扩展与传统    SIMD  扩展的架构差异为硬件抽象层的设计带来了新的挑战, 本文基于现有传统                       SIMD  扩展架构的硬
                 件抽象, 结合   RISC-V  向量扩展架构的特点, 提出了面向          RISC-V  向量扩展的高性能算法库优化方法. 下面将具体
   72   73   74   75   76   77   78   79   80   81   82