使用 OpenMP 并行化循环时的循环依赖

时间:2021-03-21 03:45:55

标签: c multithreading parallel-processing openmp

我尝试并行化以下循环:

    #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;
            }
        }
    }

但是我的程序没有按预期运行,可能是因为循环依赖。有没有办法通过减少来并行化这个循环? 任何帮助将不胜感激。

1 个答案:

答案 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++) {
相关问题