2011-11-29 116 views
2

我想執行一些應用程序平行使用sse指令和openmp。 關於的openmp部分我有這樣的代碼:OpenMP劃分循環通過核心

for(r=0; r<end_condition; r++){ 
    .. several nested for loops inside .. 
} 

我想要分割該環R上在多個核,例如使用兩個核心當一個核心應該執行使r = 0 .. R = end_condition/2 -1,另一個r = end_condition/2 .. r = end_condition-1。循環迭代之間沒有任何通信,所以它們可以並行運行,在循環結束時應該同步結果。

我怎樣才能使用openmp指令以這種方式在內核上分配這個內核呢?我是否必須在r上展開循環並使用openmp部分?

在此先感謝

回答

1

您可以通過添加實現這一點:

#pragma omp parallel for 
for(r=0; r<end_condition; r++){ 
    .. several nested for loops inside .. 
} 

你需要知道什麼是共享的,什麼是你的私人循環,雖然。雖然這並不能保證你按照你提到的那樣劃分了r。如果你想以這種明確的方式擁有它,你可以使用任務。但手工做這件事並不方便,我不能推薦它。

0

您可以設置for循環應創建的線程數。對於每個線程,您可以指定塊大小。

1

以下代碼編譯器生成一個並行區域,由N個線程執行。

omp_set_num_threads(N); 

#pragma omp parallel for 
for(int r = 0; r < end_condition; ++r) 
{ 
    .. several nested for loops inside .. 
} 

每個線程都從end_condition執行子集。請注意,您的計數變量r現在在範圍內的omp parallel內聲明。現在每個線程都有自己的計數變量。

同一個目標可以使用並行編譯,而不是並行的實現,就像這樣:

omp_set_num_threads(N); 
#pragma omp parallel private(r) 
{ 
    int tid = omp_get_thread_num(); 
    for(r = (end_condition/N) * tid; r < (end_condition/N) * (tid+1) ; ++r) 
    { 
    .. several nested for loops inside .. 
    } 
} 
當然,只有當end_condition%N = 0的

,但你得到前人的精力交易。這裏變量r顯式標記爲線程私有,可以聲明爲你想要的。編譯器將爲每個線程生成一個副本。

+0

通過告訴OpenMP爲循環使用靜態計劃可能會鼓勵分解,但這可能不會有幫助。 – Novelocrat

0

我只能補充一點,如果循環的不同迭代採取不同的時間,你可能遇到的問題 - 在這種情況下你要添加schedule (dynamic)

#pragma omp parallel for schedule (dynamic) 
for(r=0; r<end_condition; r++){ 
    .. several nested for loops inside .. 
} 

另外,注意障礙是在自動添加所以你可以肯定只有當所有的迭代完成時才繼續執行。如果不需要這樣做(你需要做一些其他的工作與循環並行) - 在for指令參數中加nowait。然後您可以請求與#pragma omp barrier同步。