[英]Can std::atomic be used sometimes instead of std::mutex in C++?
[英]Can std::atomic be safely used with OpenMP
我目前正在嘗試學習如何使用 OpenMP,但我有一個問題。 這樣做是否安全:
std::atomic<double> result;
#pragma omp parallel for
for(...)
{
result+= //some stuff;
}
或者我應該使用:
double result;
#pragma omp parallel for
for(...)
{
double tmp=0;
//some stuff;
#pragma omp atomic
result+=tmp;
}
謝謝 !
編輯:我知道最簡單的處理方法是使用數組,但我問是因為我很好奇
官方,沒有。 在實踐中,可能。
OpenMP 5.0 規范的第 1.7 頁第 32 頁說:
雖然 OpenMP 規范的未來版本有望解決以下功能,但目前它們的使用可能會導致未指定的行為。
並發
對標准庫的補充
C++11 庫
但是,根據您使用的 OpenMP 運行時的實現,它可能沒問題。 事實上,LLVM OpenMP 運行時甚至使用std::atomic
來實現一些 OpenMP 規范。
最安全的選擇是堅持只使用 OpenMP 提供的內容。 您可以使用std::atomic
執行的任何操作也應該能夠僅使用 OpenMP 來實現。
由於原子會減慢並行執行速度並且不能很好地擴展,所以最好這樣做
pragma omp parallel for reduction(+:result)
for(...)
{
double tmp=0;
//some stuff;
result+=tmp;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.