使用OpenMP并行化数据依赖循环

时间:2013-06-06 12:10:21

标签: parallel-processing dependencies openmp

我必须并行化以下代码,数据依赖性是i - > I-3

 for(i=3; i<N2; i++)
        for(j=0; j<N3; j++)
        {
          D[i][j] = D[i-3][j] / 3.0 + x + E[i];
          if (D[i][j] < 6.5) bat = bat + D[i][j]/100.0;
       }

我尝试使用#pragma omp parallel for reduction(+:bat) private(i,j) shared(D,x,E)和类似的东西,但它不正确

1 个答案:

答案 0 :(得分:0)

让我们考虑两个线程以及为什么并行化外部循环失败。

Thread 1: i=3, j=0.  This reads D[0][0] and writes D[3][0]
Thread 2: i=6, j=0.  This reads D[3][0] and writes D[6][0]

因此线程2读取D[3][0],与线程1写入的值相同。这就是竞争条件。我认为如果你并行化内部循环就不会有问题。

for(i=3; i<N2; i++) {
    #pragma omp parallel for reduction(+:bat) private(j)        
    for(j=0; j<N3; j++) {
        D[i][j] = D[i-3][j] / 3.0 + x + E[i];
        if (D[i][j] < 6.5) bat = bat + D[i][j]/100.0;
    }
}

编辑:我忘了添加缩小并将j设为私有。我现在修好了。