SIMD&SIMT

SIMD

SIMD即为Single Instruction, Multiple Data,单指令多数据。传统的指令最多只能处理少量的数据,而SIMD能做到在一条指令内指定多条数据和对数据执行的操作。 SIMD是一种数据级别的并行。它可以通过指令集提供的SIMD指令使用。SIMD指定多个数据,并对这些数据执行相同的操作 SIMD最早出现在大型机上,大型机为了满足科学计算的需求,提供了一些向量操作的指令。然而SIMD流行的契机是PC的流行,对处理多媒体的需求增大。 在Intel推出MMX x86扩展后,Intel逐步推出了AVX,AVX2,AVX-512。现在最常用的SIMD是AVX512,它能一次处理512bit的数据。
从硬件级别上来看,SIMD指令只是一个特殊的指令,通常涉及到一个向量寄存器专门用于存储多个数据。要实现SIMD,需要将ALU的数据宽度提高,并提供多个计算单元,以支持并行计算。 例如,SIMD的浮点数计算,需要ALU集成更多的浮点数运算单元。

传统的程序运行时,数据存在依赖,还有流程控制指令,需要做分支预测,数据的并行性比较低。然而一些情况下,数据几乎不存在依赖,流程控制也比较少,这种场景主要是多媒体计算,例如调整一个图片的亮度,需要对图片的所有像素执行相同的操作,对称加密运算时,需要对一块数据中每一个比特同时执行逻辑操作,音频视频解码也是如此。SIMD的目地就是加快这些场合下的运算速度。使用SIMD能利用硬件的并行,相比不使用SIMD,能极大地提高运算速度。

SIMT

SIMT即Signle Instruction, Multiple Thread,单指令多线程。它是GPU采用的一种执行模型。它类似与一个多核系统,每一个核心都有独立的ALU和data cache,然而没有独立的取指单元和译码单元和取值cache,由一个取值单元和译码单元给所有核心广播指令,所有核心执行相同的命令但是数据不同
SIMT由Nvidia引入,应用在Tesla GPU架构。
相比SIMD,SIMT的并行程度更高,SIMD仅仅是一条指令处理了多条数据,而SIMT是拥有完整独立的线程,自然也拥有独立的PC寄存器和堆栈指针。SIMT简化了众核系统(例如GPU)的控制,所有核心只需要执行同一条指令即可,这样的执行模型使得GPU很擅长处理大量简单的计算。然而正是因为SIMT,也很难控制GPU做更加复杂的工作

如上,SIMT解决的就是如何控制众核系统,以及提高并行性。