我尝试并行化以下循环:
#pragma omp parallel for shared(v, g, p)
for (i=1; i<=imax-1; i++) {
for (j=1; j<=jmax-1; j++) { // combined loops
/* only if both adjacent cells are fluid cells */
if ((flag[i][j] & C_F) && (flag[i][j+1] & C_F)) {
v[i][j] = g[i][j]-(p[i][j+1]-p[i][j])*del_t/dely;
}
if ((flag[i][j] & C_F) && (flag[i+1][j] & C_F)) {
u[i][j] = f[i][j]-(p[i+1][j]-p[i][j])*del_t/delx;
}
}
}
但是我的程序没有按预期运行,可能是因为循环依赖。有没有办法通过减少来并行化这个循环? 任何帮助将不胜感激。
答案 0 :(得分:0)
但是我的程序没有按预期运行,可能是因为循环 依赖关系。有没有办法通过减少来并行化这个循环?
在多个线程同时更新的共享变量之一(即循环迭代器 j
)中存在竞争条件。
#pragma omp parallel for shared(v, g, p)
for (i=1; i<=imax-1; i++) {
for (j=1; j<=jmax-1; j++) { // <---- Race-condition
/* only if both adjacent cells are fluid cells */
if ((flag[i][j] & C_F) && (flag[i][j+1] & C_F)) {
v[i][j] = g[i][j]-(p[i][j+1]-p[i][j])*del_t/dely;
}
if ((flag[i][j] & C_F) && (flag[i+1][j] & C_F)) {
u[i][j] = f[i][j]-(p[i+1][j]-p[i][j])*del_t/delx;
}
}
}
最外层循环的变量 i
没有竞争条件,因为它属于被并行化的循环,在这种情况下,OpenMP 标准规定该变量将隐式私有。
要解决竞争条件,您需要将最内层循环的变量 j
设为私有。要么通过:
#pragma omp parallel for shared(v, g, p) private(j)
for (i=1; i<=imax-1; i++) {
for (j=1; j<=jmax-1; j++) {
或(取决于您的编译器版本):
#pragma omp parallel for shared(v, g, p)
for (i=1; i<=imax-1; i++) {
for (int j=1; j<=jmax-1; j++) {