2011-10-26 184 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複製到局部變量,並將局部變量交給該函數。