Scalable Vector Extension (SVE) 介绍

微信公众号 mindshare思享



最近富士通更新了其与RIKEN公司共同开发的Post-K(次世代京)超级计算机开发进展:

已经完成CPU原型开发,开始商业试用。

http://www.fujitsu.com/global/about/resources/news/press-releases/2018/0621-01.html

这个超级计算机计划2021年正式运作,应用于农业,运动,科学计算。基于Post-K,富士通和RIKEN目标是创造世界上最高性能的超级计算机。为了实现这一目标,富士通采用了广泛使用的armv8指令集的CPU,并且非常重要的是使用了arm的Scalable VectorExtension-SVE可伸缩向量扩展指令。Post-K原型机将会在ISC2018展出,ISC是一个重要的国际超级计算机展览会议。ISC2015上另一家基于arm指令集的超级计算机公司飞腾展出了HPC CPU“地球”和“火星”。

其中一个关键的技术是SVE,这个可以显著提升HPC的向量处理能力,也可以适合AI应用领域,半精度运算,深度学习,高精度的双精度运算。

扫描二维码关注公众号,回复: 3823233 查看本文章


本文介绍一下SVE。

SVE的前生


大家都知道在SVE之前, arm CPU构架对并行运算的支持主要是在NEON(官方名AdvancedSIMD). 构架定义了:

·     32个128bit 定长的NEON寄存器

·     可支持整型,半/单/双精度浮点型,poly型的运算。

·     支持signed/unsigned 8-bit, 16-bit,32-bit, 64-bit, single/double/single precision float

         o  最大支持16个8bit 运算

运算类型包括基本的加减乘除,逻辑,移位,bit操作,取绝对值,最小最大值,倒数,平方根等等。


NEON广泛应用于视频,音频,图像,信号处理等需要大量数据处理并且可以并行运算支持的应用场景,

NEON虽然很强大,但是还是有些限制,比如其是定长的运算,运算只能在64bit或是128bit的向量上进行,这可能导致一些compiler没办法直接将循环loop优化成NEON指令,因为其要处理left over的情况。

比如如果上面循环的次数不定,有可能是4的整数倍,有可能不是.Compiler基于安全考虑,只能加判断,将余下的循环用普通的非NEON运算实现。这会导致代码增大。

而且每个运算必须在一个向量上的所有元素上做运算,没有办法在其中某些元素做某些元素不做。

 

比如


本文基于arm research部门在ICS2018会议(ICS’18, Beijing, China)的Vector Architecture Exploration with gem5的topic。文中使用的slide也是其中的,该slide已公开。

SVE扩展解决了这些问题,使compiler更容易将代码向量化,减少需要手动写汇编,intrinsic的情况。


SVE特征

SVE的特点;

明显扩展了向量处理能力。

CPU的实现可以根据自己的需要实现128bit-2048bit长度的向量寄存器。更神奇的是,由于采用了VLA编程方式,一段C代码编译成SVE指令后,不管是在什么长度的SVE向量实现的CPU上都可以兼容运行,不需要针对不同的CPU再次编译。预计多少应用不需要手写SVE汇编或是C intrinsics,这简直是程序员的福音。

公开性能数据表明,SVE相比NEON有极大提升。

https://semiaccurate.com/2016/09/07/arm-adds-2048-bit-vectors-v8a-sve/

SVE扩展了下面功能:

Gather-load/Scatter-store离散的存和取的内存访问方式

不像以前,必须将连续内存地址的值取到一个向量寄存器里。SVE的存取可以是离散的内存地址,也就是可以将不连续的内存地址的值取到一个向量寄存器里,我们会用另一个向量寄存器来表示访问的Index。

Per-lane Prediction:

之前说的NEON必须在整个向量上进行运算,SVE的这个功能可以解决这个问题。它允许只在向量寄存器的部分Lane上运算,那些Lane需要运算可以由一个SVE寄存器来指示。

Predicate-driven loopcontrol and management

这个功能主要解决前面说的left over 问题,使得对C代码向量化时,不需要顾及循环次数。

Vector partitioning and software- managedspeculation

这个功能主要是解决万一向量化时访问内存超出允许访问的地址范围时,可以在不影响可以正常访问的部分向量的访问和运算。

Extended floating- point horizontalreductions

扩展了浮点数水平运算功能

上面的图应该比较清楚。


SVE寄存器

Z0-Z31: 32个向量寄存器,根据不同的CPU实现可以是128-2048bit. arm本身没有推荐使用什么长度,厂商根据自己的需要实现,比如富士通的post-k选择使用512bit.

P0-P7 为存取指令,运算指令作为lanemask.

P8-P15 给predicate 操作使用。

FFR  first fault 寄存器,给前面说的Vectorpartitioning and software- managed speculation用,记录那个lane访问有问题,并以这个信息作为后面运算的mask.

ZCR_ELx 向量长度控制寄存器。


SVE例子

下面以优化一个daxpy循环的例子来说明SVE的功能。

它基本体现了

·     同样的代码在不同长度的vector(128bit,256bit) SVE实现的CPU上不需要修改可以兼容运行。

·     怎么使用firstfault+ lane mask解决不定循环次数的问题。

不幸的是,虽然我知道具体怎么实现的,但是因为本人在的公司部门也做收费培训,避免违反公司的policy,不能进一步给大家分享。

好在这个slide分步还是比较清楚的,大家好好研究。

Gather-Load& Scatter-Store

SVE工具支持

相关阅读

Armv8上不弃不离的NEON/FPU

http://gem5.org/ICS2018_gem5_SVE_Tutorial

猜你喜欢

转载自blog.csdn.net/weixin_39366778/article/details/80789581