2012-05-15 52 views
2

我有一個具有以下結構的代碼。如何判斷openmp不同步陣列

#pragma omp parallel for 
for(i = 0; i < N; i++) 
{ 
    ..... 
    index = get_index(...); 
    array[index] = ...; 
    ..... 
} 

現在的index值是爲每個線程唯一的(它永遠不會重疊的不同的線程),但當然OpenMP的不能讓這種猜測,我想用同步對象訪問array

如何讓openmp不要使用array的同步對象,並依靠我index值對於不同的線程是唯一的。我嘗試將array置於私人列表中,但出現了分段錯誤。

+1

OpenMP在默認情況下不會同步任何內容。所以這不應該是一個問題。索引是在並行區域內還是外部聲明的? – Mysticial

+1

僅供參考:由於緩存垃圾,寫入到來自不同線程的共享陣列會導致可怕的性能問題。你應該確保這些線程當前寫入的indeces之間有一定的距離)。 – smerlin

回答

5

Openmp確實在屏障或隱含屏障上同步。例如,除非指定了nowait子句,否則for構造的末尾存在隱含的障礙。

但是openmp並沒有通過訪問來爲你同步內存。相反,它爲每個線程提供共享和私有內存塊的機制。

在你的情況下,index需要是私人的。否則,每個線程寫入相同的內存位置,當您訪問array[index]時,您將遇到競爭狀態。

爲了演示,我明確設置了該行爲,但i默認爲私有,array默認爲共享。

#pragma omp parallel for private(i, index) shared(array) 
for(i = 0; i < N; i++) 
{ 
    ..... 
    index = get_index(...); 
    array[index] = ...; 
    ..... 
}