与C++11不同,OpenMP从内存操作的角度处理原子性,而不是变量。这允许在编译时大小未知的向量中使用原子读/写整数,例如:
在C++11中,这是不可能实现的。我们可以通过放宽内存模型来以某种方式访问原子变量作为非原子变量,但我们无法调整原子元素的向量大小。
我理解C++不允许通过原子内存操作访问非原子变量的原因,但我想知道,为什么这些原因对OpenMP也不适用。
例如,在N4013中,它说:"没有合理的方法完全可移植地将原子操作应用于未声明为原子的数据。" OpenMP如何保证这种可移植性,而C++不行?
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中,这是不可能实现的。我们可以通过放宽内存模型来以某种方式访问原子变量作为非原子变量,但我们无法调整原子元素的向量大小。
我理解C++不允许通过原子内存操作访问非原子变量的原因,但我想知道,为什么这些原因对OpenMP也不适用。
例如,在N4013中,它说:"没有合理的方法完全可移植地将原子操作应用于未声明为原子的数据。" OpenMP如何保证这种可移植性,而C++不行?