簡體   English   中英

std::atomic 可以安全地與 OpenMP 一起使用嗎

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM