原子访问 C++11 和 OpenMP 中的非原子内存位置?
Atomic access to non-atomic memory location in C++11 and OpenMP?
与 C++11 相比,OpenMP 从内存操作的角度而非变量的角度处理原子性。这允许,例如,对在编译时存储在未知大小的向量中的整数使用原子 reads/writes:
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中,据说"There is no reasonable way to completely portably apply atomic operations to data not declared as atomic."OpenMP怎么可能保证这样的可移植性,而C++却不能?
据我了解各自的标准,OpenMP在使用上比C++11有更多的限制,这使得它可以在不使用特殊类型的情况下进行移植。例如,OpenMP 4.5 表示:
If the storage location designated by x is not size-aligned (that is, if the byte alignment of x is not a multiple of the size of x), then the behavior of the atomic region is implementation defined.
另一方面,如果 C++11 使用 std::atomic<int>
,则编译器将保证适当的对齐。在这两种情况下,都需要对齐,但 OpenMP 和 C++11 在谁负责确保完成对齐方面有所不同。
一般来说,OpenMP 和 C++ 在哲学上存在差异,但很难一一列举。 C++ 人员正在考虑对所有内容的可移植性,而 OpenMP 则针对 HPC。
与 C++11 相比,OpenMP 从内存操作的角度而非变量的角度处理原子性。这允许,例如,对在编译时存储在未知大小的向量中的整数使用原子 reads/writes:
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中,据说"There is no reasonable way to completely portably apply atomic operations to data not declared as atomic."OpenMP怎么可能保证这样的可移植性,而C++却不能?
据我了解各自的标准,OpenMP在使用上比C++11有更多的限制,这使得它可以在不使用特殊类型的情况下进行移植。例如,OpenMP 4.5 表示:
If the storage location designated by x is not size-aligned (that is, if the byte alignment of x is not a multiple of the size of x), then the behavior of the atomic region is implementation defined.
另一方面,如果 C++11 使用 std::atomic<int>
,则编译器将保证适当的对齐。在这两种情况下,都需要对齐,但 OpenMP 和 C++11 在谁负责确保完成对齐方面有所不同。
一般来说,OpenMP 和 C++ 在哲学上存在差异,但很难一一列举。 C++ 人员正在考虑对所有内容的可移植性,而 OpenMP 则针对 HPC。