我有一个嵌套循环:(L 和 A 是完全定义的输入)
#pragma omp parallel for schedule(guided) shared(L,A) \
reduction(+:dummy)
for (i=k+1;i<row;i++){
for (n=0;n<k;n++){
#pragma omp atomic
dummy += L[i][n]*L[k][n];
L[i][k] = (A[i][k] - dummy)/L[k][k];
}
dummy = 0;
}
及其顺序版本:
for (i=k+1;i<row;i++){
for (n=0;n<k;n++){
dummy += L[i][n]*L[k][n];
L[i][k] = (A[i][k] - dummy)/L[k][k];
}
dummy = 0;
}
他们都给出不同的结果。并且并行版本比串行版本慢得多。
什么可能导致问题?
Edit:
为了摆脱atomic指令引起的问题,我将代码修改如下:
#pragma omp parallel for schedule(guided) shared(L,A) \
private(i)
for (i=k+1;i<row;i++){
double dummyy = 0;
for (n=0;n<k;n++){
dummyy += L[i][n]*L[k][n];
L[i][k] = (A[i][k] - dummyy)/L[k][k];
}
}
但也没有解决问题。结果还是不同。
我对 OpenMP 不太熟悉,但在我看来,你的计算与顺序无关。即内循环的结果写入L[i][k]
where i
and k
是内循环的不变量。这意味着相同的值被覆盖k
内循环期间的次数,导致竞争条件。
而且,dummy
似乎在不同线程之间共享,因此那里也可能存在竞争条件,除非您的编译指示参数以某种方式阻止它。
总而言之,在我看来,如果您想要与顺序执行给出的结果相同的结果,则内部循环中的计算必须以相同的顺序执行。因此只有外循环可以并行化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)