打开mp节并刷新

OpenMP sections and flush

本文关键字:刷新 mp 打开      更新时间:2023-10-16

使用我的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(...);
  }
}

它工作得很好,但当我试图添加更多的部分,我有一个访问违反错误在我的程序运行。基本上,我将第三部分添加为第二部分,并将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(...);
  }
}

我已经找到解决问题的办法了。下面是正确的代码。

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(...);
   }
}