2014-02-10 45 views
3

我開始學習OpenMP並發現了#pragma omp atomic指令。OpenMP原子內存順序

我對C++ 11的原子知識有基本的瞭解,並且知道您可以將memory_order參數傳遞給原子的方法。 糾正我,如果我錯了,但我認爲這允許使用原子作爲同步點,例如,如果使用memory_order_seq_cst

一些限制性較小的內存順序,如memory_order_relaxed只是確保原子上的操作是同步的並且對其他人可見。它不關心其他內存更新。

我想知道OpenMP的atomic指令使用了什麼內存順序。它只會同步對原子的訪問,還是會作爲內存同步的要點?

我的猜測是,它會更像memory_order_relaxed,因爲critical的這裏是提供完全同步。

我歡迎任何好的解釋/信息。 謝謝。

+0

可能重複的[openMP,原子vs關鍵?](http://stackoverflow.com/questions/7798010/openmp-atomic-vs-critical) – JustSid

+0

@JustSid這主要考慮鎖vs無鎖同步原語,但不解釋記憶順序。 – Xaqq

回答

7

OpenMP內存模型一直在發展。直到幷包括OpenMP 3.1,該模型都基於「刷新」操作。這些與C++內存模型中的任何內容都沒有什麼可比性。鬆散地說,flush大致對應於atomic_thread_fence(x),其中x是memory_order_seq_cst。但是,如果「兩個沖刷的兩個沖刷集的交集是空的」,則存在而非的問題。

OpenMP的4.0增加了seq_cst子句和答案直接的問題:

注 - 與其他隱沖洗區,20頁 上的第1.4.4減少了必須執行的順序。意圖是,當在C++ 11或C11中存在類似的操作時,一致的原子構造具有與C++ 11/C11中的 memory_order_seq_cst原子操作相同的語義。類似地,非順序一致的原子構造具有與C++ 11/C11中的memory_order_relaxed原子操作相同的語義。

有關詳細信息,請下載latest version of the spec(4.0在這個時候),並閱讀部分1.4.4「的OpenMP內存一致性」和2.12.6「原子結構」。

+0

我已經擴展了答案。 –

+0

非常感謝。很好的解釋,偉大的鏈接:) – Xaqq