Openmp原子和关键

时间:2014-02-05 21:57:15

标签: c++ openmp atomic critical-section

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

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

虽然当我这样做时,我得到以下错误(如果我使用关键程序编译好了)

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

从我到目前为止学到的东西,你可以使用原子而不是通常的东西 可以在一些机器指令中执行。这有用吗?使用原子与关键之间的主要区别是什么?

2 个答案:

答案 0 :(得分:5)

根据文档here,您只能使用某些语句形式的原子:

enter image description here

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

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

它仍然是数据竞赛

答案 1 :(得分:1)

您只能使用以下形式的运算符使用#pragma omp atomic:

  1. x ++,x--等。
  2. x + = a;,x * = a等。
  3. 原子指令通常更快,但语法非常严格。