当我使用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
指令完全相同。
海湾合作委员会的行为是否正确?或者出了什么问题?
答案 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;但有一个缺点是警告说现在和取消混合。