僅僅因爲您使用OpenMP並不意味着您的程序運行得更快。一對夫婦的事情可以發生在這裏:
有關聯的產卵每個線程有代價的,如果你生成一個線程做一個小的計算量,線程的產卵本身將花費更多的時間比計算。
默認情況下,OpenMP將產生CPU支持的最大線程數。對於每個核心支持2個或更多線程的CPU,線程將爭奪每個核心的資源。使用omp_get_num_threads()
你可以看到有多少線程默認會產生。我建議您嘗試使用omp_set_num_threads()
來運行代碼的一半。
你確認結果都是一樣的使用和不使用OpenMP的?似乎有變量j和c2的依賴關係。您應聲明它們對每個線程專用:
#pragma omp parallel for private(j,c2)
我想添加另一件事:在嘗試任何並行化之前,你應該確保該代碼已經進行了優化。
取決於你的編譯器,編譯器標誌和指令的複雜性,編譯器可能會或可能不會優化代碼:
// avoid calculation nnoib-2 every iteration
int t_nnoib = nnoib - 2;
for (i=2; i< t_nnoib; ++i){
// avoid calculation nnojb-2 every iteration
int t_nnojb = nnojb - 2;
// avoid loading absi[i] every iteration
int t_absi = absi[i];
for (j=2; j< t_nnojb; ++j) {
C[i][j]= t_absi * absj[j] *
(2.0f*B[i][j] + t_absi * absj[j] *
(VEL[i][j] * VEL[i][j] * fat *
(16.0f * (B[i][j-1] + B[i][j+1] + B[i-1][j] + B[i+1][j])
-1.0f * (B[i][j-2] + B[i][j+2] + B[i-2][j] + B[i+2][j])
-60.0f * B[i][j]
) - A[i][j]));
// c2 is a useless variable
if (abs(C[i][j]) > Amax[i][j]) {
Amax[i][j] = abs(C[i][j]);
Ttra[i][j] = t;
}
}
}
它可能看起來並不多,但它可以產生巨大影響您的碼。編譯器會嘗試將局部變量放入寄存器(訪問時間更快)。請記住,由於您的寄存器數量有限,因此無法無限制地應用此技術,濫用此操作會導致代碼遭受寄存器溢出。
對於數組absi
,您將避免系統在執行j
循環期間將該數組的一部分保留在緩存中。這種技術的一般想法是將外部循環移到不依賴內部循環變量的任何數組訪問。
'c2'聲明在哪裏? – Mysticial 2013-03-10 02:54:27
c2是一個全局變量。 c2是int。謝謝! – 2013-03-10 03:38:14
然後讓它成爲本地的,因爲會有'c2'的競爭條件/依賴。 – Mysticial 2013-03-10 03:39:06