2014-02-10 43 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