OpenMP部分和刷新

时间:2015-07-30 03:29:47

标签: c++ openmp

在我的openMP部分中使用flush命令,我可以避免访问冲突错误。这些部分中使用的函数共享了几个相同的参数。这是伪代码:

int flag = 0;

#pragma omp parallel sections num_threads(2)
{
  #pragma omp section
  {
     function1(...);
     #pragma omp flush
     flag = 1;
     #pragma omp flush(flag)
  }

  #pragma omp section 
  {
     #pragma omp flush(flag)
     while (!flag) {
        #pragma omp flush(flag)
     }
     #pragma omp flush
     function2(...);
  }
}

它运行良好但是当我尝试添加一个部分时,我在程序运行期间出现了Access违规错误。基本上我添加我的第三部分,如第二部分,我将num_threads设置为3。

int flag = 0;

#pragma omp parallel sections num_threads(3)
{
  #pragma omp section
  {
     function1(...);
     #pragma omp flush
     flag = 1;
     #pragma omp flush(flag)
  }

  #pragma omp section 
  {
     #pragma omp flush(flag)
     while (!flag) {
        #pragma omp flush(flag)
     }
     #pragma omp flush
     function2(...);
  }

  #pragma omp section 
  {
     #pragma omp flush(flag)
     while (!flag) {
        #pragma omp flush(flag)
     }
     #pragma omp flush
     function3(...);
  }
}

我是否对上述程序有问题?

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法。这是正确的代码。

int flag = 0;

#pragma omp parallel sections num_threads(3)
{
   #pragma omp section
   {
     function1(...);
     #pragma omp flush
     flag++;
     #pragma omp flush(flag)
   }

   #pragma omp section 
   {
       #pragma omp flush(flag)
       while (flag != 1) {
          #pragma omp flush(flag)
       }
       #pragma omp flush
       function2(...);
   }

   #pragma omp section 
   {
       #pragma omp flush(flag)
       while (flag != 2) {
          #pragma omp flush(flag)
       }
       #pragma omp flush
       function3(...);
   }
}