我在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
是一個數組,我在編譯時遇到錯誤。
有人可以給我一個提示,因爲這是我的代碼中的一個大瓶頸?
你放的是什麼#pragmas? – ChronoTrigger
那麼,我試過'#pragma omp並行默認(共享)'在每個循環,但結果是完全錯誤的。然後,我試着讓一些變量變成私人的,比如'private(i1,k,vector_1,vector_2)',但這只是一個絕望的嘗試,它也不起作用。 –
應對日程安排條款。如果你的循環計數不是編譯常量,動態或引導可能會更好。 –