2014-02-07 73 views
1

我正在做一些圖像處理,並有一個嵌套for循環。我想要使​​用OpenMP實現多處理。 for循環看起來像這樣,我已經添加了pragma標籤並聲明瞭一些私有變量。OpenMP:嵌套for循環,幾乎沒有任何執行時間的差異

int a,b,j, idx; 
#pragma omp parallel for private(b,j,sumG,sumGI) 
    for(a = 0; a < ny; ++a) 
    { 
     for(b = 0; b < nx; ++b) 
     { 
      idx = a*ny+b; 
      if (imMask[idx] == 0) 
      { 
       Wshw[idx] = 0; 
       continue; 
      } 

      sumG = 0; 
      sumGI = 0; 

      for(j = a; j < ny; ++j) 
      { 
       sumG += shadowM[j-a]; 
       sumGI += shadowM[j-a] * imBlurred[nx*j + b]; 
      } 

      Wshw[idx] = sumGI/sumG; 
     } 
    } 

兩個NX的大小和紐約大,我認爲,使用OpenMP,我會得到執行時間的下降減少,取而代之的是幾乎沒有區別。當我實現多線程時,我會做錯什麼?

+0

您還需要使'idx'專用。 –

回答

2

您在idx有競賽條件。你也需要把它變成私人的。

然而,你可以嘗試這樣的事情。

int a,b,j, idx; 
#pragma omp parallel for private(a,b,j,sumG,sumGI) 
for(idx=0; idx<ny*nx; ++idx) { 
    if (imMask[idx] == 0) 
    { 
     Wshw[idx] = 0; 
     continue; 
    } 

    sumG = 0; 
    sumGI = 0; 
    a=idx/ny; 
    b=idx%ny; 
    for(j = a; j < ny; ++j) { 
     sumG += shadowM[j-a]; 
     sumGI += shadowM[j-a] * imBlurred[nx*j + b]; 
    } 

    Wshw[idx] = sumGI/sumG; 
} 

你也許可以簡單地將內部循環以及idx的函數代替爲a和b。