GCC 5.1在`parallel for`结构中警告取消构造

时间:2015-05-16 12:11:59

标签: c gcc openmp

当我使用cancel指令(因为OpenMP 4.0)来破坏parallel for构造中的并行循环时,GCC 5.1警告"' #pragma omp取消'在里面' nowait'建筑"对于以下代码段。

const int N = 10000;

int main()
{
  #pragma omp parallel for
  for (int i = 0; i < N; i++) {
    #pragma omp cancel for  // <-- here
  }
}

http://coliru.stacked-crooked.com/a/de5c52da5a16c154

对于变通方法,当我拆分为parallel + for构造时,GCC会默默接受代码。

int main()
{
  #pragma omp parallel
  #pragma omp for
  for (int i = 0; i < N; i++) {
    #pragma omp cancel for
  }
}

但是我不知道为什么海湾合作委员会会对前一种情况发出警告,但这种结构却没有“现在”。条款。 OpenMP 4.0 API spec还表示parallel for等于parallel + for个结构。

  

2.10.1并行循环结构

     

描述

     

语义与显式指定紧随其后的parallel指令的for指令完全相同。

海湾合作委员会的行为是否正确?或者出了什么问题?

1 个答案:

答案 0 :(得分:2)

我的猜测是你的代码

  #pragma omp parallel for
  for (int i = 0; i < N; i++) {
    #pragma omp cancel for
  }

不等于

  #pragma omp parallel
  {
  #pragma omp for
  for (int i = 0; i < N; i++) {
    #pragma omp cancel for
  }
  } //end of parallel region

在后一种情况下,会有两个障碍:一个位于平行区域的末端,一个位于平行区域的末尾;相当于的东西:

  #pragma omp parallel
  {
      #pragma omp for nowait
      for (int i = 0; i < N; i++) {
          #pragma omp cancel for
      }
      #pragma omp barrier
  } // and here another implicit barrier

但我认为出于优化目的,编译器可能会尝试删除第二个不必要的屏障并生成:

  #pragma omp parallel
  {
      #pragma omp for nowait
      for (int i = 0; i < N; i++) {
          #pragma omp cancel for
      }
  }

更优化&#39;但有一个缺点是警告说现在和取消混合。