2014-01-27 47 views
3

我在C++中有一個for-loop,它需要大量的計算時間,而且我想通過使用OpenMP(我有16個可用內核)進行並行化。其他更簡單的for循環和我的代碼的FFT已經與OpenMP並行並且工作正常。我已經嘗試了一些選項,但結果沒有(數量級的差別),就像串行計算的結果一樣。在C++中使用openmp的數組的並行求和

我的我的代碼對應的部分看起來基本上和以下內容:

for (i1=1;i1<N;i1++){ 
    function(Nx, Ny, i1, k, vector_1, vector_2); 
    for (i=0;i<(Nx*Ny);i++){ 
     vector_3[i] = I*kx[i/Ny]*vector_2[i]; 
    } 
    for (i=0;i<(Nx*Ny);i++){ 
     sum[i1-1] -= vector_2[i]; 
    } 

    fftw_execute(p_c2r_4); 
    #pragma omp parallel for default(shared) 
    for (i=0;i<(Nx*Ny);i++){ 
     vector_4[i] = vector_4[i]/norm; 
    } 

    for (i2=1;i2<N;i2++){ 
    function(Nx, Ny, i2, k, vector_1, vector_2); 
     for (i=0;i<(Nx*Ny);i++){ 
      Trans[(i1-1)*N + (i2-1)] -= creal(vector_2[i]*vector_4[i]); 
     } 
    } 
} 

其中一個for循環已經被並行化,所以我的目標是並行的其他人。對於我看到別人使用的數字reduction(+:sum),但在我的情況下,sum是一個數組,我在編譯時遇到錯誤。

有人可以給我一個提示,因爲這是我的代碼中的一個大瓶頸?

+0

你放的是什麼#pragmas? – ChronoTrigger

+0

那麼,我試過'#pragma omp並行默認(共享)'在每個循環,但結果是完全錯誤的。然後,我試着讓一些變量變成私人的,比如'private(i1,k,vector_1,vector_2)',但這只是一個絕望的嘗試,它也不起作用。 –

+0

應對日程安排條款。如果你的循環計數不是編譯常量,動態或引導可能會更好。 –

回答

3

第一個for循環應該與第三個類似。

總而言之,輕微的問題是sum []數組是使用第一個循環索引進行索引的,因此似乎讓編譯器感到困惑。爲了使機器更容易,你可以嘗試:

double subsum=0.0; 
#pragma omp parallel for default(shared) reduction(+:subsum) 
for (i=0;i<(Nx*Ny);i++){ 
    subsum += vector_2[i]; 
} 
sum[i1-1] -= subsum; 

隨着第四,你可以使用類似的技巧。

+0

初始化'double subsum = 0.0'是否需要在'#pragma ...'之後和for循環之前完成? –

+0

對於引入的語法錯誤,當然必須在omp指令使用之前聲明變量。並在每個外循環中設置爲0。 – ssavec