与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中,据说“没有合理的方法完全将原子操作可移植地应用于未声明为原子的数据。” OpenMP如何保证这种可移植性而C ++不能保证这种可移植性?
据我了解各自的标准,OpenMP在使用方面比C ++ 11有更多限制,这使它无需使用特殊类型即可移植。例如,OpenMP 4.5说:
如果x所指定的存储位置不是大小对齐的(即,如果x的字节对齐不是x大小的倍数),那么将定义实现原子区域的行为。
另一方面,如果C ++ 11使用std::atomic<int>
,则编译器将确保适当的对齐方式。在这两种情况下,都需要对齐,但是OpenMP和C ++ 11在负责确保完成此任务的人员方面有所不同。
通常,OpenMP和C ++之间存在哲学差异,但是很难一一列举。C ++人士正在考虑可移植到所有内容的方法,而OpenMP则针对HPC。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句