1

我必须并行化以下代码,数据依赖是 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)类似的东西,但它不正确

4

1 回答 1

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 设为私有。我现在修好了。

于 2013-06-06T15:09:02.850 回答