在C ++ 11和OpenMP中以原子方式访问非原子内存位置?

丹尼尔·兰格

与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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

混合C ++ 11原子和OpenMP

在C11 / C ++ 11中,可能在同一内存上混合使用原子/非原子操作吗?

具有非原子变量的C ++ 11原子存储顺序

C11和C ++ 11原子:获取释放语义和内存障碍

连续内存块中的C ++原子操作

C atomic中对非原子类型的原子操作是否是原子操作?

C ++中的内存模型:顺序一致性和原子性

C ++ 11(已消毒的g ++线程)使用原子对非原子操作进行排序(误报?)

原子负载可以合并到C ++内存模型中吗?

C11原子和愈伤组织

通过C中的套接字以原子方式发送整数

在C ++ 11中字节操作是原子的吗?

在c ++ 11中,可以使用std :: atomic在两个线程之间传输非原子数据

标准C ++ 11是否可以保证memory_order_seq_cst防止StoreLoad对原子周围的非原子重新排序?

Objective-C中原子/非原子的证据

c ++ 11原子对象的执行是否也是原子的?

对c ++ 11原子变量的哪些操作实际上是原子的?

与 C++ 原子内存栅栏同步

C ++ 11原子容器的线程安全

是否可以在C ++中创建原子向量或原子数组?

C++ 这个 MPMC 队列中的原子需要什么内存顺序?

MSVC中C中的原子负载

有谁知道在C#中实现原子动作的任何方式吗?

数组在C#中是原子写入的吗?

C#中的静态列表分配是原子的

在C ++中对普通整数使用原子运算

+= 是 C# 中的原子操作吗?

在C ++中重新排序原子操作

原子参数在C中的执行顺序