2017-10-17 269 views
0

之間的行動所以,我大致有這樣的代碼:OpenMP;嵌套循環

for (int i = 0; i != 10000; ++i) { 
    doAction(i); 
    for (int j = 0; j != 10000; ++j) { 
     ... 
    } 
} 

而且我想使用OpenMP來parallellize它。據我所知,在這種情況下,一個簡單的collapse不會做;我嘗試使用單獨的#pragma omp for也沒有結果。有沒有簡單的方法來輕鬆地並行化,或者我不得不求助於doActioni*j次?

+1

如何更換!= by <? – tim18

+0

@ tim18那應該做什麼?我一直認爲它們在這方面是等同的。另外,我不明白這與問題 – Akiiino

+1

的嵌套循環部分相關** [A]:**您是否考慮調用一個'doAction(i);'函數來表示*(cit )「在**嵌套循環之間的動作**」*? ** [B]:**您是如何認識到'doAction(i)'代碼被稱爲**'i * j' **倍的? ** [C]:**在'...'裏面的實際處理是什麼? MCVE代碼應該代表一個可重複的例子。如何驗證這樣的代碼,而沒有機會確認/拒絕安排一個「只」的可能性 - **'[CONCURRENT]'**或者真正的** ** [PARALLEL] **代碼執行,一塊MCVE代碼實際上是缺少的? – user3666197

回答

1

並行化的簡單方法,只使用OpenMP作爲外部循環。

將所有東西並行化並不是一件好事,因爲線程同步&任務調度開銷。當您將大型CPU綁定任務拆分爲並行執行時,最理想的情況是在大部分時間使用所有可用的CPU內核時應該儘可能大。

P.S.如果您有OpenMP 4,對於內部循環,則可能需要#pragma omp simd而不是parallel。外循環應該仍然是parallel。通過這種方式,您將同時使用兩種並行機制,外部循環跨核心並行化,內部循環跨SIMD通道並行化。從理論上講,這通常是計算東西的最快方法。

+0

這是一個很好的答案。雖然沒有詳細說明 - 但建議是正確的。根據需要並行化爲細粒(內環)(用於暴露足夠的單獨工作項和負載平衡),但儘可能平行化爲粗粒(用於保持較小的開銷)。它讓我感到困惑,爲什麼這是被低估的。 – Zulan