OpenMP:无法并行化嵌套for循环

时间:2011-10-26 10:55:57

标签: c++ c parallel-processing openmp

我想在其中内部循环并行循环。我的代码看起来像这样:

    #pragma omp parallel for private(jb,ib) shared(n, Nb, lb, lastBlock, jj, W, WT) schedule(dynamic)   //private(ib, jb) shared(n, Nb, lb, lastBlock, jj, W, WT)       //parallel for loop with omp
    for(jb=0; jb<Nb; jb++)          
    {
            int lbh = (jb==Nb-1) ? lastBlock : lb;
            int ip = omp_get_thread_num();

            packWT(a, n, lb, s, jb, colNr, WT[ip], nr); //pack WWT[jb]      


            for(ib=jb; ib<Nb; ib++)
            {
                    int lbv = (ib==Nb-1) ? lastBlock : lb;

                    multBlock_2x4xk(a, n, jj + ib*lb, jj + jb*lb, W+ib*lb*lb, WT[ip], lb, lbv, lbh);    //MULT BLOCK - 2x4xK (W[jb]*W[ib])

            }
    }

我测量proc花在计算这个循环上的时间。少数线程与一个线程相同。当我改变条款

private(jb,ib)

private(jb)

一切都在改变。我的意思是少数线程proc计算速度比一个线程快。有什么问题?

1 个答案:

答案 0 :(得分:4)

问题是你的内部for循环不是规范形状。因此,openmp无法并行化循环,并且不能实现加速。循环需要如下图所示。在start,idx和inc不允许在代码的并行部分期间更改。 canonical shape of for loops

我想我确定了你的问题。你正在调用这些功能:

  packWT(a, n, lb, s, jb, colNr, WT[ip], nr); packWT(a, n, lb, s, jb, colNr, WT[ip], nr);
  multBlock_2x4xk(a, n, jj + ib*lb, jj + jb*lb, W+ib*lb*lb, WT[ip], lb, lbv, lbh);

其中一个参数是循环变量jb,因为jb可以在函数内部更改(取决于函数声明),编译器决定不并行化循环。 为了避免这种情况,请将变量jb复制到局部变量,并将局部变量传递给函数。