c++ - 原子访问 C++11 和 OpenMP 中的非原子内存位置?

标签 c++ openmp atomic nonatomic

与 C++11 相比,OpenMP 从内存操作而非变量的角度处理原子性。例如,这允许在编译时对存储在大小未知的 vector 中的整数使用原子读/写:

std::vector<int> v;

// non-atomic access (e.g., in a sequential region):
v.resize(n);
...
v.push_back(i);
...

// atomic access in a multi-threaded region:
#pragma omp atomic write // seq_cst
v[k] = ...;
#pragma omp atomic read // seq_cst
... = v[k];

在 C++11 中,这是不可能实现的。我们可以通过放宽内存模型来访问原子变量作为非原子变量,但我们不能调整原子元素 vector 的大小。

我理解为什么 C++ 不允许通过原子内存操作访问非原子变量是有原因的。但我想知道,为什么这些原因也不适用于 OpenMP。

例如,在 N4013 中,据说“没有合理的方法将原子操作完全可移植地应用于未声明为原子的数据。”OpenMP 怎么可能保证这种可移植性而 C++ 不能?

最佳答案

据我了解各自的标准,OpenMP在使用上比C++11有更多的限制,这使得它可以在不使用特殊类型的情况下进行移植。例如,OpenMP 4.5 说:

If the storage location designated by x is not size-aligned (that is, if the byte alignment of x is not a multiple of the size of x), then the behavior of the atomic region is implementation defined.

另一方面,如果 C++11 使用 std::atomic<int> ,那么编译器将保证适当的对齐。在这两种情况下,都需要对齐,但 OpenMP 和 C++11 在谁负责确保完成对齐方面有所不同。

通常,OpenMP 和 C++ 之间存在哲学差异,但很难一一列举。 C++ 人员正在考虑对所有内容的可移植性,而 OpenMP 则针对 HPC。

关于c++ - 原子访问 C++11 和 OpenMP 中的非原子内存位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35680633/

相关文章:

c++ - 如果我将数字存储为整数数据类型,如何检查一个数字是否存在于另一个数字中?

c++ - 使用 QMathGL 连接信号和槽

c++ - 使用动画控件播放avi

c++ - 并行化时的不同答案

c++ - OpenMP:深度优先搜索的好策略

带有返回垃圾的 char 指针的 C++ 类

fortran - fortran 中的并行错误

c++ - 非阻塞 pthread 停止 - 或者为什么 std::atomic_flag 会减慢我的代码

c++ - 在 g++ 4.8.1 编译器中测试 atomic_int

c++ - 如何做类似 "is_atomically_assignable"的事情?