SVE(ScalableVectorExtension)是armAArch64架构下的下一代SIMD指令集。
它旨在加速高性能计算。
SVE引入了许多新的体系结构功能,例如•可变矢量长度•每个通道的预测•聚合加载和分布式存储•水平操作本文将对SVE进行基本介绍。
1. SIMD指令开发历史的智能从上图可以看出,SIMD指令的总体趋势正在朝着越来越长的方向发展。
通过armSVE,它最多可以支持2048位向量操作。
2.背景Armv7的高级SIMD(即,armNEON或“ MPE”多媒体处理引擎)指令集已于2005年发布,并且已经存在了十多年。
Armv7NEON的主要功能如下:•支持8/16/32位整数运算,支持非IEEE兼容的单精度浮点运算,支持指令条件执行•32个64位向量寄存器,也可以是被视为16个128位向量寄存器•设计用于加速CPU端的多媒体处理任务。
升级到armv8架构时,AArch64NEON指令集已进行了许多改进,例如:•支持IEEE兼容的单精度和双精度浮点运算以及64位整数矢量运算•32个128位矢量寄存器•这些改进使NEON指令集更适合于通用计算,而不仅仅是多媒体计算。
但是到目前为止,armv8的新市场需要更彻底的SIMD指令改进。
我们需要能够并行处理非常规数据和复杂数据结构,并且我们还需要更长的向量。
SVE是出于这个原因而诞生的。
SVE旨在加速高性能计算。
3. SVE功能SVE是armv8AArch64体系结构的下一代SIMD指令集。
它不是NEON的替代品,而是专注于高性能计算。
主要功能如下:•可变矢量长度•128位的整数倍。
支持多达2048位•不同的实现可以适应不同的应用场景而无需更改指令集•每个通道的预测•支持复杂的嵌套循环以及if / then / else条件跳转,无循环尾数。
•聚合加载和分布式存储支持复杂的数据结构,例如步骤数据访问,数组索引,链表等。
•水平运算•支持基本的归约运算以减少循环依赖性。
4. SVE寄存器SVE寄存器有两种类型:向量寄存器和预测寄存器。
SVE共有32个可变长度向量寄存器Z0-Z31(128位的整数倍,最大2048位),其中Z0-Z31的低128位[127:0]与AArch64SIMD&FP寄存器共享硬件资源V0-V31。
假设SVE的向量长度为256,则向量寄存器视图如下。
SVE支持8/16/32/64位整数运算和单精度/双精度浮点运算。
SVE预测寄存器用于控制每个通道的操作。
有16个变长预测寄存器P0-P15。
预测寄存器的每个位对应于向量寄存器的字节。
假设SVE的向量长度为256,则当预测寄存器管理32位和64位操作时,视图如下。
当控制32位数据操作时,如果Pg寄存器的最小值为1,则激活通道操作,并且通道操作的结果通常存储在目标寄存器中;如果Pg寄存器的最小值为0,则通道操作处于非活动状态,该通道的操作结果将不会存储在目标寄存器中。
目的寄存器中的通道数据有两种可能性:•将指令指定为Pg / z清除模式,并清除通道数据。
•该指令被指定为Pg / m组合模式,并且通道数据保持原始值。
5. SVE指令示例下面,我们通过一些示例介绍常用SVE指令的用法。
一种。
向量加法每个人都可能熟悉NEON的指令格式(如下所示)。
NEON指令通过加“ f”来区分整数运算和浮点运算。
指令助记符的前缀,例如“ add”。
和“添加”;另外,通过寄存器后缀“ .2s”,“。
4s”和“ .2d”也可以通过寄存器“ .2s”,“。
4s”和“ .2d”来实现。
表示两个32位数据,四个32位数据和两个64位数据的操作。
•通过添加“ f”,还添加了addv0.4s,v0.4s,v1.4s•faddv0.2s,v0.2s,v1.2s•faddv0.2d,v0.2d,v1.2dSVE指令。
指令助记符的前缀区分整数运算和浮点运算。
但是SVE是