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

C++ 对C+中非原子内存位置的原子访问+;11和OpenMP?,c++,openmp,atomic,nonatomic,C++,Openmp,Atomic,Nonatomic,与C++11不同,OpenMP从内存操作而不是变量的角度来处理原子性。例如,允许对编译时存储在未知大小向量中的整数使用原子读/写: 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 wr

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

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];
std::vector v;
//非原子访问(例如,在顺序区域中):
v、 调整大小(n);
...
v、 推回(i);
...
//多线程区域中的原子访问:
#pragma omp原子写入//seq_cst
v[k]=。。。;
#pragma omp原子读取//顺序cst
... = v[k];
在C++11中,这是不可能实现的。通过放松内存模型,我们可以像访问非原子变量一样访问原子变量,但我们不能调整原子元素向量的大小

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


例如,在“没有完全合理地将原子操作应用于未声明为原子的数据”的情况下,“OpenMP如何保证这种可移植性和C++不?

< p>,就我理解的各个标准而言,OpenMP对使用的限制要比C++ 11多,这使得它可以在不使用特殊类型的情况下进行移植。例如,OpenMP 4.5说:

如果x指定的存储位置没有大小对齐(即,如果x的字节对齐不是x大小的倍数),则原子区域的行为由实现定义

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


一般来说,OpenMP和C++之间存在着哲学上的差异,但很难一一列举。C++用户正在考虑所有的移植性,而OpenMP则是针对HPC的。

OpenMP不必像C++那样便携,而语言社区的OpenMP实现者也可以接受。稍后我将尝试查找详细信息。“如果C++11使用std::atomic,那么编译器将保证适当的对齐。”-会吗?标准从何而来?如果我理解正确,C++11可以确保原子性,而不关心对齐。原子性是否取决于正确的对齐是一个实现问题(对于一个给定的体系结构)。这是一个实现问题,但是如果你的硬件只能提供对齐的单词的原子性,那么你的C++编译器就不能报告STD::AdoMixIsIsLoCuxFipe,除非这些类型是对齐的,所以它将对齐它们。