基于《计算机体系结构:量化研究方法》第4章
数据级并行(DLP)就是并行处理多个数据计算。我又跳过了所有数字描述和计算,简单了解了一下几个概念。
SIMD
SIMD就是单指令多数据(single instruction multi data),发出一条指令但执行多次数据计算。
以下代码中1000次的a[i] = b[i] + c[i]
是完全无关的,在SIMD中可以只发出一条指令,然后并行计算
for( int i = 0; i < 1000; ++i ){
a[i] = b[i] + c[i];
}
b[0]..[b999]和c[0]...c[999]其实是两个天然的向量,1000次加法运算实际可以转换成一次向量加法,这样上述计算就只需要一条指令了。
这个例子只是展示了一下数据并行的可能,还有其他的例子,比如带标量的计算,带条件的计算等。有些计算需要编译器优化或者提示程序员优化,才能使代码的数据并行度更高。
三种体系架构
以下三种体系架构的区别,我个人理解不是很到位,感觉没啥特别的差异
- 向量结构体系
- 多媒体SIMD扩展
- GPU
我是这么想的,反正所有的改动都是为了提高性能,那从提高性能的角度去看的话,就能自然得到几种方式
- 数据计算流水化,深度流水化的话,就需要更多的向量寄存器
- 增加执行单元,执行单元多的话,就需要调度单元
网格和线程块
网格和线程块是GPU实现的编程抽象。多处理器并行处理时,就是如下的结构,看起来就是一个网格。因为向量寄存器个数是有限的,所以就需要将原始数据计算划分为多个组,这就是线程块。有了这样的抽象后,可以帮助程序员组织自己的CUDA代码。
处理器1 <- b[0]+c[0] <- b[4]+c[4] <- ....
处理器2 <- b[1]+c[1] <- b[5]+c[5] <- ...
处理器3 <- b[2]+c[2] <- b[6]+c[6] <- ...
处理器4 <- b[3]+c[3] <- b[7]+c[7] <- ...
EC的计算库Jerasure就会使用SSE指令,SSE(Streaming SIMD Extensions)即流式SIMD扩展