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

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


                    ● 访存操作: 包含向量加载和存储操作, 实现向量寄存器和内存之间的数据移动;
                    ● 算术与逻辑运算操作: 包含算术、逻辑、比较、移位等运算操作;
                    ● 归约操作: 包含向量元素求和、求极值等操作, 将向量类型归约为标量类型;
                    ● 排列操作: 包含向量合并、移动、分散、聚合、压缩等操作, 允许以一定规则重新排布向量内元素;
                    ● 类型转换操作: 包含向量展宽、缩窄、类型转换等操作, 允许向量元素在不同数据类型和向量宽度之间进
                 行转换.
                    硬件抽象层应当根据目标硬件集合的向量操作支持情况抽象出共性操作. 例如, 对于单精度浮点数的向量加
                 载和存储操作, RISC-V     向量扩展和     ARM Neon  扩展在高级语言层面以内建函数的形式分别提供了__riscv_
                 vle32_v_f32m1(…) / __riscv_vse32(…) 函数和  vld1q_f32(…) / vst1q_f32(…) 函数, 硬件抽象层可以提供形如
                 v_load(…) / v_store(…) 的统一抽象. 类似地, 还可以抽象出共性的运算操作: 形如           v_add(…) 的函数可以用于抽象
                 向量加法, v_mul(…) 可以用于抽象向量乘法等.
                    此外, 硬件抽象层还应考虑算法库所涉及的领域需求和计算特征, 以领域内高频操作为抽象目标, 确保抽象层
                 能够适应领域特定的优化需求. 例如, 在图像处理或机器学习应用中, 乘积累加运算是矩阵乘算法中的高频操作,
                 可以成为抽象的重点, 以确保这些计算密集型任务能够高效执行, 从而匹配领域需求, 便于开发人员使用: v_fma(…)
                 作为描述乘积累加操作通用内建函数供开发人员调用, 抽象了                    RISC-V  向量扩展的__riscv_vfmacc(…) 以及其他平
                 台的相关操作.
                    需要注意的是, 领域需求的抽象应当以硬件所能提供的共性计算能力为基础, 不应抽象于过高的层级, 也不宜
                 抽象仅少数硬件平台支持的特殊操作. 例如, 卷积算法是机器学习应用中的常用操作, 但其算法实现复杂多样, 包
                 含多个基本向量操作, 具有较高的抽象层级, 鲜有硬件设备直接提供卷积操作, 因此不宜包含在硬件抽象层中. 指
                 数与对数运算的抽象层级较低, 但在主流             SIMD  指令集扩展中, 仅有     AVX-512  提供了对指数和对数运算的部分支
                 持, 而综合考虑其他硬件平台对相关操作的直接支持有限, 对此类特殊运算的抽象应当谨慎考量. 本文建议仅在应
                 用场景确有相关操作的抽象需求, 且其他硬件平台可以通过组合使用基本操作以可接受的开销实现特殊运算时,
                 才考虑将其纳入硬件抽象层中.
                    总的来说, 硬件抽象层所包含的向量操作应当从应用场景计算需求和目标硬件平台集合两个方面综合考虑,
                 以高频计算场景中的热点操作为抽象目标, 以所有预期支持的硬件平台所提供的共性操作为基础. 剥离高抽象层
                 次的复杂计算, 规避个别平台提供的特殊操作, 从而定义一套满足算法库需求, 且广泛适应于目标硬件平台的硬件
                 抽象层向量操作.

                 2.3   向量类型抽象
                    在硬件抽象层中, 除了向量操作抽象, 还包括对于向量类型的抽象. 向量类型通常用于描述一组具有相同类型
                 的标量数据元素. 主流       SIMD  扩展指令集都具有较为完善的整数和常用浮点数类型, 表                  1  列举了部分   SIMD  扩展
                 所支持的数据类型. 对于近年来在深度学习等领域中关注度较高的半精度浮点数和                             BFloat16  类型, RISC-V  和
                 x86  都在向量扩展之外提供了扩展指令集, 其支持情况取决于微架构实现, ARM Neon                     则随着处理器架构版本的
                 演进而引入了对新型数据类型的支持.

                                          表 1 部分   SIMD  扩展指令集所支持的数据类型

                       数据类型             RISC-V Vector (RVA23U64)    x86 AVX2/AVX-512      ARM Neon
                       BFloat16      ZVBFMIN扩展仅支持类型转换操作             AVX-512-BF16扩展     ARMv8.6-A 及其以上
                   16位半精度浮点数                  ZVFH扩展                AVX-512-FP16扩展     ARMv8.2-A 及其以上
                   32位单精度浮点数                     √                        √                   √
                   64位双精度浮点数                     √                        √             ARMv8及其以上
                       8位整数                      √                        √                   √
                       16位整数                     √                        √                   √
                       32位整数                     √                        √                   √
                       64位整数                     √                        √             ARMv8及其以上
   74   75   76   77   78   79   80   81   82   83   84