Xaq*_*aqq 3 c++ atomic openmp c++11
我开始学习OpenMP并发现了该#pragma omp atomic指令.
我对C++ 11的原子有基本的了解,并且知道你可以将memory_order参数传递给atomics的方法.如果我错了,请纠正我,但我认为如果使用memory_order_seq_cst例如,这允许使用原子作为同步点.
一些限制较少的内存顺序,比如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"原子构造"部分.
| 归档时间: |
|
| 查看次数: |
397 次 |
| 最近记录: |