[英]OpenMP atomic memory order
我開始學習OpenMP並發現了#pragma omp atomic
指令。
我對C ++ 11的原子有基本的了解,並且知道你可以將memory_order
參數傳遞給atomics的方法。 如果我錯了,請糾正我,但我認為如果使用memory_order_seq_cst
,這允許使用atomics作為同步點。
一些限制較少的內存順序,如memory_order_relaxed
只需確保原子上的操作同步並對其他人可見。 它對其他內存更新沒有任何幫助。
我想知道OpenMP的原子指令使用了什么內存順序。 它只會同步對原子的訪問,還是會充當內存同步的重點?
我的猜測是它更像是memory_order_relaxed
,因為critical
是提供完全同步。
我歡迎任何好的解釋/信息。 謝謝。
OpenMP內存模型一直在發展。 直到並包括OpenMP 3.1,該模型基於“刷新”操作。 這些與C ++內存模型中的任何內容都不具有可比性。 松散地說,刷新大致對應於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原子操作具有相同的語義。
有關更多詳細信息,請下載最新版本的規范 (此時為4.0),並閱讀1.4.4“OpenMP內存一致性”和2.12.6“原子構造”部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.