并行的两大分类

微架构中经常将并行分为两大类:时间并行和空间并行。时间并行指的是流水线并行,空间并行包括指令并行、数据并行和线程并行。


并行编程的形式

bit-level parallelism:位级别的并行,是基于处理器的字长不断增加的基础上,就比较容易理解了。处理器的字长不断增加,并行度自然增加。
instruction level parallelism(ILP):指令级并行,是指处理器能同时处理多条指令。
data level parallelism(DLP):数据集并行,是指处理器能同时处理多条数据。
task level parallelism(TLP):任务级并行,我见过更多的是称为Thread-level parallelism(TLP),即线程级并行。


指令级并行

所谓指令级并行,是指处理器能同时运行多条指令。
一般而言,如果程序中相邻的一组指令是相互独立的,即不竞争同一个功能部件、不相互等待对方的运算结果、不访问同一个存储单元,那么它们就可以在处理器内部并行地执行。
超标量(Superscalar)技术 和 超长指令字(Very Long Instruction Word, VLIW)技术是目前最基本的两类指令级并行技术。前者的特点是采用普通的指令,设置多条并行工作的指令流水线;后者的特点是:将若干条普通指令组装在一起,形成一条“超级指令”。这条“超级指令”包含多个不同操作码,这些操作码分别处理不同的操作数。对应这些操作码,一一对应地设置相应的功能部件。这样,只要取指令一次、分析指令一次,VLIW 技术就可以实现对多个不同的操作数,同时进行不同的处理/计算。目前,主流的微处理器都采用了超标量技术。


数据级并行

所谓数据级并行,是指处理器能同时运行多条数据。
SIMD:single instruction multiple data,单指令多数据,即同一操作会重复处理多个数据,一条语句处理多个数据的指令,就是SIMD指令。

for(int i = 0;i < N;i +=4) {
c[i] = a[i] + b[i];
c[i+1] = a[i+1] + b[i+1];
c[i+2] = a[i+2] + b[i+2];
c[i+3] = a[i+3] + b[i+3];
}

这样编译器就能很容易的生成SIMD指令


线程级并行

线程并行是一种更高层的数据并行,是一种分时复用的思想。线程级并行可以依靠操作系统(软件)来完成,但是现在的处理器,硬件也会为线程并行提供帮助,从而提高线程并行的效率。


参考文章

  1. ​高性能计算中并行的概念理解​