OpenMP原子内存顺序

3

我开始学习OpenMP并发编程,并发现了#pragma omp atomic指令。

我对C++11的原子操作有基本的了解,知道可以向原子操作的方法传递一个memory_order参数。如果我理解不正确,请纠正我,但我认为这样做可以使用原子操作作为同步点,例如使用memory_order_seq_cst

一些较少限制的内存顺序,如memory_order_relaxed,只确保原子操作上的操作已经同步并对其他人可见。它对其他内存更新什么也没有做。

我想知道OpenMP原子指令使用的内存顺序是什么。它只会同步访问原子操作,还是会作为内存同步点?

我的猜测是它更像memory_order_relaxed,因为critical在这里提供了完全的同步。

欢迎任何好的解释/信息。 谢谢。


可能是[openMP,atomic vs critical?](https://dev59.com/0Wsz5IYBdhLWcg3wlY29)的重复问题。 - JustSid
@JustSid 这主要考虑锁定与无锁同步原语,但并未解释内存顺序。 - Xaqq
1个回答

7
OpenMP内存模型一直在不断发展。直到OpenMP3.1为止,该模型基于"flush"操作,这些操作与C++内存模型中的任何内容都不能真正比较。粗略地说,flush大致对应于atomic_thread_fence(x),其中x是memory_order_seq_cst。但有一个陷阱,那就是如果两个flush的交集为空,则它并非如此。

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节“atomic Construct”。


我已经扩展了答案。 - Arch D. Robison
非常感谢。解释得很好,链接也很棒 :) - Xaqq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接