我必须并行化以下代码,数据依赖性是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)
和类似的东西,但它不正确
答案 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设为私有。我现在修好了。