[英]Atomic access to non-atomic memory location in C++11 and 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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.