2011-10-26 186 views
3

我想并行循环与内部循环。我的代码如下所示:OpenMP:无法并行嵌套for循环

#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的计算速度比一个线程快。问题是什么?

+0

这里没有多少东西 - 什么是packWT,multBlock,a等? - 但你肯定需要这个ib是私有的,否则线程会覆盖相同的循环索引。没有private(ib)的情况下,它的速度更快的原因可能是许多ib的跳过没有它... –

+0

确实,没有私人(ib)我得到错误的结果..仍然不知道为什么时间是相同的许多线程和一个线程... – Pelsono

+0

有很多原因可以,但没有更多的信息,我们都不会告诉你任何事情。 –

回答

4

问题是你的内循环不是规范的形状。因此openmp无法并行化循环,并且不能实现加速。循环需要看起来像下面的图片。在开始的地方,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复制到局部变量,并将局部变量交给该函数。