OpenMP原子内存顺序

时间:2014-02-10 23:21:22

标签: c++ c++11 openmp atomic

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

我对C ++ 11的原子有基本的了解,并且知道你可以将memory_order参数传递给atomics的方法。 如果我错了,请纠正我,但我认为如果使用memory_order_seq_cst,这允许使用原子作为同步点。

一些限制性较小的内存顺序,如memory_order_relaxed,只需确保原子上的操作同步并对其他人可见。它对其他内存更新没有任何意义。

我想知道OpenMP的原子指令使用了什么内存顺序。它只会同步对原子的访问,还是会充当内存同步的一点?

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

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

1 个答案:

答案 0 :(得分:7)

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中,顺序存在   一致的原子结构与a具有相同的语义   C ++ 11 / C11中的memory_order_seq_cst原子操作。同样,a   非顺序一致的原子结构具有与之相同的语义   C ++ 11 / C11中的memory_order_relaxed原子操作。

有关更多详细信息,请下载latest version of the spec(此时为4.0)并阅读1.4.4“OpenMP内存一致性”和2.12.6“原子构造”部分。