Arm向量指令集SVE
曾夺得超算Top 500第一名的日本超算FUGAKU(富岳)采用的是富士通的A64FX处理器,是世界第一个款实现Scalable Vector Extension (SVE)指令集的处理器。SVE是Arm v8.2-A AArch64指令集的下一代SIMD扩展,针对HPC场景的新向量指令集,相比于x86的AVX系列指令集有其独特的特色。
Arm上一代指令集Neon
SVE的上一代指令集是Neon(也叫ASIMD),主要面向多媒体、DSP等场景,使用32个寄存器v0-v31,浮点计算和SIMD计算共用这些寄存器,v寄存器宽度为64位或128位。但Neon针对HPC场景有很多不足之处,比如:
- 不支持gather/scatter不连续内存访问pattern
do i=1, N
a(idx(i)) = a(idx(i)) * b(i) !indirect address
enddo
- 不支持mask寄存器
do i=1,N
if(a(i) > 1.0) then ! if branch
b(i) = c(i) + 2.0
endif
enddo
- 寄存器位宽较小
相比于Intel AVX2的256位,AVX512的512位,Neon最高128位显然不够,一条指令只能处理2个双精度元素。
SVE和SVE2
因此,SVE指令集改进了Neon以上的不足,同时引入新特色:向量宽度感知(Vector Length Agnostic, VLA)。所谓的VLA指的是SVE指令集不固定向量寄存器宽度,允许硬件实现者根据需要选择最佳宽度,同时编程指令不显式指定向量位宽。A64FX处理器SIMD宽度设计为512位。
SVE2是Neon和SVE的超集,在SVE的基础上,补齐对Neon指令集的兼容,并为优化部分特殊场景扩展了特殊指令。
- Scalable vector length
允许自动选择向量宽度,只要是128位的倍数,且不超过架构最大值2048位(128~2048 bit)。SVE提供32个可变向量寄存器,命名为Z0-Z31。
- Per-lane predication
新增16个perdicate寄存器,p0-p15,长度为VL/8
,即p寄存器中每个bit支配z寄存器的一个byte。作用相当于mask寄存器。
SVE VLA应用场景
- 库开发
比如数学库为了追求效率,实现会使用向量指令集。在X86平台,为了支持多种硬件的向量指令集(比如SSE/AVX2/AVX512)需要使用多种向量指令开发,然后在实际硬件平台选择兼容的指令集。但SVE,只需要一种向量指令集,自动适应不同向量宽度的硬件架构。
- 一次编译
代码不需要重新编译就能适应不同硬件平台,充分利用该平台向量计算能力。
参考资料

