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

时间:2016-02-28 09:09:09

标签: 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 write // seq_cst
v[k] = ...;
#pragma omp atomic read // seq_cst
... = v[k];

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

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

例如,在N4013中,据说&#34;没有合理的方法将原子操作完全可移植地应用于未声明为原子的数据。&#34; OpenMP如何才能保证这种可移植性和C ++不可用?

1 个答案:

答案 0 :(得分:2)

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

  

如果x指定的存储位置不是大小对齐的(也就是说,如果x的字节对齐不是x大小的倍数),那么原子区域的行为是实现定义的。

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

一般来说,OpenMP和C ++之间存在哲学上的差异,但很难枚举所有这些差异。 C ++人员正在考虑可移植性,而OpenMP则针对HPC。