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及其以上

