数据级并行

基于《计算机体系结构:量化研究方法》第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扩展

转载于:https://www.cnblogs.com/yizui/p/10641588.html

你可能感兴趣的:(数据级并行)