Vector向量计算技术与SIMD技术的对比

什么是向量计算技术?什么是SIMD技术?它们之间有什么区别?看到这个标题的时候 , 可能各位读者都会有各种各样的疑问 。那么本文 , 笔者将基于RISC-V指令集 , 尽量以简单易懂的方式 , 向大家介绍二者的联系和区别 , 并分析RISC-V向量计算技术的优劣 。一、SIMD技术简述
传统的通用处理器都是标量处理器 , 一条指令执行只得到一个数据结果 。但对于图像、信号处理等应用 , 存在大量的数据并行性计算操作 , 这个时候 , 提高数据的并行性从而提高运算的性能就显得尤为重要 。因此 , SIMD技术应运而生 。
SIMD的英文全称是SingleInstructionMultipleData , 即单指令流多数据技术 , SIMD的概念是相对于SISD(SingleInstructionSingleData , 单指令流单数据)提出的 。SIMD技术最初通过将64位寄存器的数据拆分成多个8位、16位、32位的形式来实现byte、halfword、word类型数据的并行计算;在后续 , 为了进一步增加计算的并行度 , SIMD技术开始通过增加寄存器位宽来满足应用对算力的需求 。对于传统的SIMD技术 , Intel的MMX、SSE系列、AVX系列 , 以及ARM的Neon架构都是其中的代表 。
Vector向量计算技术与SIMD技术的对比
文章图片

文章图片
二、向量计算技术简述
而提高数据并行性的另一种方式就是向量计算技术 。与传统的SIMD技术一样 , 其也是通过扩展寄存器位宽 , 来增加计算的并行度;但不同的是 , 向量寄存器是可变长度的寄存器 , 而不像SIMD那样嵌入在操作码中 。矢量技术的代表就是RISC-VV扩展指令集和ARM的SVE架构 。三、Vector向量计算技术的优势
相比于传统的SIMD技术 , 矢量计算技术是一种硬件软件更加解耦的技术 , 其对编程人员更加友好 , 是一种软硬件协同的技术典范 。为何这么说呢?可以简单用下述的例子说明一下:
Vector向量计算技术与SIMD技术的对比
文章图片

文章图片
上述代码是分别基于ARMNeon指令集和RISC-VV指令集的典型应用程序memorycopy 。对于ARM的代码部分 , LDP和STP分别为指定为128位宽的load和store操作 , 每次循环操作96个字节 。而对于RICS-V的代码 , 上述的循环控制完全通过vsetvli指令以及sub指令实现 , 软件不需要显示每遍循环计算了多少数据量 , 仅需要给出总的数据量即可 。即使硬件中矢量寄存器的长度从128变为256 , 上述代码也不需要进行任何修改 。
上述对比可以看出 , 由于指令集限定了数据操作位宽 , 那么每次硬件对并行度的扩展都意味着指令集的扩展以及代码的重写 , 这将增加更多额外劳动 , 对开发者也更不友好 。然而随着处理器应用领域的不断扩大 , 对数据硬件并行性的需求也在不断提高 , 硬件架构并行度升级似乎成为一种必然趋势 。纵观IntelSIMD指令集的发展 , 从MMX的64位 , 到SSE系列的128位 , AVX、AVX2的256位 , 以及最新的AVX-512的512位 , 寄存器的位宽在短短20年里扩大了8倍 。这对于软件的适配来说也是不小的工作 。四、Vector向量计算技术的劣势
RISC-V相比ARMNeon等SIMD指令架构来说 , 有着可变长、软件维护方便等优势 。那是否就说明RISC-V的Vector向量架构就没有任何缺点呢?
其实不然 , 首先 , 向量架构带来更灵活的使用本身也可能带来一些负面影响 。由于操作数本身不指定操作数类型 , 需要通过vsetvli指令专门设置 , 则当出现频繁的数据类型切换时 , 必然会带来更多的指令数 。另外 , 除了操作数据类型 , 向量长度(VL)也是通过vsetvli指令非显示的设置的 , 在超标量乱序处理器中 , 若频繁的更改向量长度 , 则可能带来潜在的性能损失 。除此之外 , RISC-VV指令集制定时间较短 , 相比于ARMNeon等发展多年的SIMD指令集 , 在指令功能的丰富性上尚有欠缺 , 因此 , 在碰到一些特定场景时 , 需要使用更多的指令去实现相应的功能 , 进一步降低了整体的性能 。五、小结