2010-10-17 25 views
3

我正在使用C語言編寫OpenMP程序。我有共享數組「數據」正在被所有線程更新。我希望確保每個線程都已完成讀取部分並在執行下一條語句data [j] = temp之前將值存儲在temp中。在OpenMP中避免競爭(在並行循環中)

我試着在兩個語句之間放置#pragma omp barrier但編譯器拋出一個錯誤。請幫忙。

#pragma omp parallel for shared(data) 

for (j = 0; j < numints; j++){ 

    if (j >= max_j) 

    { 

       temp = data[j] + data[j - max_j]; 
      data[j] = temp; 
    } 

} 
+0

什麼是編譯器錯誤? – BobbyShaftoe 2010-10-17 05:41:16

+0

barrier指令不能出現在並行結構中(在IBM編譯器上) – bcubed 2010-10-17 05:46:14

回答

2

正如你所見,barrier將無法​​正常工作; critical對於這個特定的操作是相當重的。原子的重量比重量輕;你總是可以做

if (j >= max_j) 
{ 
    #pragma omp atomic 
    data[j] += data[j-max_j]; 
} 

,但你應該時刻保持警惕具有環內的任何這樣的結構(原子,關鍵) - 它殺死的性能,因爲它殺死並行性(也就是,畢竟,他們的整個目的)。

這將有助於知道你要用這​​一點代碼來完成什麼,因爲即使消除了更新中的數據競賽,最終結果(比如說)數據[maxints-1]將取決於什麼順序數據[maxints-1-max_j],數據[maxints-1-2 * max_j] ..已被更新,明確地不被OpenMP並行for。 (你可以使用有序的構造,但僅僅比不使用並行更好)。

如果maxints < 2*max_j,那麼這很容易;你可以做

#pragma omp parallel for shared(data) 
for (j = max_j; j < numints; j++){ 
    data[j] += data[j-max_j]; 
} 

並且根本不需要任何同步,因爲每個線程只更新一個數據[j]而不依賴任何其他數據。但我得到的印象是(a)它不是,(b)這是一段較大的代碼片段...