SVE/SVE2简介
SVE(Scalable Vector Extension)是Arm在Neon后推出的下一代SIMD指令集。SVE指令集允许向量宽度不可知的编码风格,其可以动态地适应硬件实现的向量宽度。相比Neon支持的64-bit/128-bit的向量宽度,SVE的向量宽度根据实现的不同,可以选择128-bit到2048-bit范围内,128的整数倍且要求为2的幂次的向量宽度。SVE面向HPC场景设计,支持多种reduction操作、gather/scatter、per-lane predication,从而相比Neon支持更多的矢量化场景,通过SVE指令集的使能,可以进一步挖掘应用代码中存在的并行机会。SVE2是SVE的超集,支持更多的整型操作(为大部分DSP、媒体处理的Neon指令添加了VLS版本),从而增强了对机器视觉,多媒体,数据库等场景的支持。
SVE包含32个向量寄存器,Z0-Z31,其大小如前文所述是128-bit的整数倍且要求为2的幂次。SVE向量寄存器的低128位与SIMD向量(对应neon指令集)/浮点寄存器重合,详见图1。这使得SVE指令与neon指令可以互换地使用,特定寄存器可以使用SVE指令写入后使用neon指令读取,反之亦然。当neon指令或者浮点指令写入SIMD向量/浮点寄存器时,对应的SVE向量寄存器会被清空。向量寄存器包含的数据会被视为若干个元素,向量元素的宽度可以是8-bit,16-bit,32-bit或64-bit。
SVE引入了predicate寄存器,用于确定与其一同使用的向量寄存器的相应的向量元素是否是有效的,SVE共包含15个predicate寄存器:P0-P15。predicate寄存器的宽度是向量寄存器宽度的1/8,即n*16-bit,predicate寄存器的每个bit对应向量寄存器的一个字节。predicate寄存器的元素宽度可以是1-bit,2-bit,4-bit或是8-bit,尽管predicate寄存器的元素最长可以达到8-bit,但只有该元素中的最小的1bit会决定对应的向量寄存器中的向量元素是否是有效的(bits[0]=1表示有效,bits[0]=0表示无效)。一个完整初始化的predicate寄存器可以同时用于控制不同元素宽度的向量寄存器的操作,可以参考图2,同一个predicate寄存器(p0)可以用作控制元素宽度packed 8-bit的向量寄存器(z0),也可以用作控制元素宽度packed 64-bit的向量寄存器(z1),此时每个元素除最小的1bit外的bit是无意义的。同一个predicate寄存器(p0)也可以同时用作控制元素宽度packed 64-bit的向量寄存器(z1)与元素宽度unpacked 32-bit的向量寄存器(z2),用于循环中同时包含64-bit与32-bit操作的情况。