算法的并行优化

常见的并行编程的模型:

(1) 指令级并行:如果多条指令没有依赖,那么可以同时在处理器的多个流水线上同时执行。
(2) 向量化并行:通常是对不同的数据执行一条同样的指令,或者说一个 指令作用于一个数组/向量。
(3) 易并行:多个控制流之间没有通信的并行。
(4) 任务并行:每个控制流计算一件事或者多个并行任务的一个子任务
(5)

  • 任务并行

任务并行的通信通常 比较少,故易于实现,但是负载不均衡的可能性非常大。

  • 数据并行

指一条指令同时作用在多个数据上,那么可以将一个或多个数据分配给一个控制流计算,这样多个 控制流就可以并行。如果每个数据或每个小数据集处理时间基本相同,那么均匀分割数据即可;如果处理时间不同就要考虑负载均衡的问题。

  1. 数据并行的类型
    以输入数据为主,每个控制流处理一个或多个输入数据。多个控制流可能会更新同一个输出因此对输出数据可能需要同步
    以输出数据为主,每个控制流处理一个或多个输出数据,通常输入数据是只读的。
  • 循环并行化

原始代码:
for (int i = 0; i < n; i++)
{
    a[i + 1] = b[i] * 2;
    c[i] = a[i] / 3;
}

各次循环间存在依赖,不能并行。如果直接并行那么数据a的读写会出现问题,因为存在写后读依赖。

优化后:
c[0] = a[0] / 3;
a[1] = 2 * b[0];
for (int i = 0; i < n; i++)
{
    a[i + 1] = b[i] * 2;
    c[i] = 2 * b[i - 1] / 3;
}

修改后循环代码不存在依赖,故可以并行。

推荐阅读更多精彩内容