2010-09-28 37 views
4

在的openmp的原子指令支持東西一樣爲什麼OpenMP原子指令不支持賦值?

x += expr 
x *= expr 

其中expr爲不引用X標量類型的表達式。我得到的,但我不知道爲什麼你不能這樣做:

#pragma omp atomic 
x = y; 

這在某種程度上更繁重的CPU指令明智?在我看來,合法和非法聲明加載x和其他一些標量值的值,更改x的寄存器值並將其寫回。如果任何人都可以向我解釋這些指示是如何(我假設)從根本上不同,我將非常感激。

+2

現在可以在OpenMP 3.1中使用 - >'原子更新' – cmo 2012-06-12 12:28:59

回答

-1

因爲建議的原子分配不能防止任何事情發生。

請記住,原子指令可以被認爲是編譯器通過使用魔術硬件可以(但不一定)有效實現的關鍵部分。考慮共享x和私人y達到x = y的兩個線程。在所有線程完成後,x等於最後執行「勝利」的線程並將x設置爲其y。將作業包裹在關鍵部分中,沒有任何變化,最後一個線程仍然「獲勝」。現在,如果這些線程之後用x做了別的事情,那麼最慢的線程可能沒有趕上,即使編譯器可以合法地使用x(即線程的本地y)選擇一些緩存值來結束。爲了避免這種情況,你需要一個屏障(所以中獎線程韓元)和其隱含的沖洗(使本地緩存中已經無效):

x = y; 
#pragma omp barrier 
\\ do something with shared x... 

,但我不能想到一個很好的理由這樣做。爲什麼所有的工作都要在很多線程上找到y,如果它們中的大多數將會(非確定性地)被拋棄?

+4

原子分配*是有用的。如果X和Y的值的類型在任何意義上都是「大的」,則執行原子複製可確保結果值X不包含任何可能被複制的值Y的不一致圖片。當然,你還需要「原子閱讀」(你提出了一個障礙),以確保獲取X的一個組成部分不會讓你成爲一個價值的一部分,正如你上面的比賽情況所描述的那樣。我想說的是,保護個人副本的開銷通常很高,從性能角度來看,這可能不會有幫助。 – 2010-10-13 12:57:30

+3

-1:這個答案不正確。當讀取或寫入共享變量時,[OpenMP 3.0標準](http://www.openmp.org/mp-documents/spec30.pdf#page=22)不保證原子性:「內存訪問的最小大小通過多線程而不同步,無論是對同一個變量還是對於屬於同一變量的不同變量(如數組或結構元素),都是相互原子的,是 實現的定義。「OpenMP 3.1引入了原子讀/專門寫出來解決這個限制。 – Douglas 2012-11-25 13:47:59