TypechoJoeTheme

MetMan's Blog

网站页面

Arm向量指令集SVE

MetMan博 主
2023-10-27
/
0 评论
/
813 阅读
/
541 个字
/
百度已收录
10/27
本文最后更新于 2023年10月27日,已超过 328天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

曾夺得超算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,只需要一种向量指令集,自动适应不同向量宽度的硬件架构。

  • 一次编译

代码不需要重新编译就能适应不同硬件平台,充分利用该平台向量计算能力。

参考资料

  1. https://developer.arm.com/documentation/101726/4-0/Learn-about-the-Scalable-Vector-Extension--SVE-
  2. https://www.bilibili.com/video/BV1MV411j78a/?spm_id_from=333.999.0.0&vd_source=bc08bd80a6bd57e97aacb39dc192b77f
向量化arm
朗读
赞(0)
赞赏
感谢您的支持,我会继续努力哒!
版权属于:

MetMan's Blog

本文链接:

https://blog.metman.top/index.php/archives/61/(转载时请注明本文出处及文章链接)

评论 (0)

互动读者

标签云

最新回复

暂无回复

登录
X
用户名
密码