Search code examples
c++openmpatomiccritical-section

Openmp atomic and critical


I am new to openmp and am playing around with some stuff for a school project. I was trying to make my program run a little faster by using atomic instead of critical. I have this snippet of code at the end of one of my for loops.

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

Although when I do this I get the error below (if I use critical the program compiles fine)

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

From what I've learned so far you can use atomic instead of critical for usually something that can be executed in a few machine instructions. Should this work? And what is the main difference between using atomic vs critical?


Solution

  • According to the docs here you can only use atomic with certain statement forms:

    enter image description here

    Also, make sure the comparison is inside the critsec! So I assume you cannot have what you want, but if you had

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

    it would still be data race