c++ - Openmp 原子和关键

标签 c++ openmp atomic critical-section

我是 openmp 的新手,正在为学校项目玩一些东西。我试图通过使用原子而不是关键来使我的程序运行得更快一些。我的一个 for 循环末尾有这段代码。

  if(prod > final_prod)
  {
    #pragma omp atomic
    final_prod = prod;
  }

虽然当我这样做时我得到以下错误(如果我使用 critical 程序编译正常)

error: invalid form of ‘#pragma omp atomic’ before ‘;’ token
     final_prod = prod;
                      ^

根据我到目前为止所学的知识,您通常可以使用 atomic 而不是 critical 可以用几条机器指令执行。这应该工作吗?使用原子与关键之间的主要区别是什么?

最佳答案

根据文档 here您只能将 atomic 与某些语句形式一起使用:

enter image description here

此外,请确保比较在 critsec 内!所以我假设你不能拥有你想要的东西,但如果你有

if(prod > final_prod) // unsynchronized read
{
  #pragma omp critical
  final_prod = prod;
}

它仍然是数据竞赛

关于c++ - Openmp 原子和关键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21589411/

相关文章:

c++ - 为什么它需要一个右值复制构造函数,即使它不会被调用?

c - OpenCL:如何在不使用多线程的情况下在不同设备上分配计算

c - 如何在 C 中一次原子地读取多个变量?

erlang - 以原子方式替换关联的 pid(即注销和注册)

c++ - 将两个文件读入 vector 首先 while 循环有效但第二个只迭代一次?

c++ - C++中同一个变量的多个名称

c++ - Qt写入QTextTable时检测断线

cuda - Visual C++ 中的 OpenACC

c++ - 在论文中引用/引用 OpenMP

c++ - OpenMP 和#pragma omp atomic