c++ - 为什么 OpenMP 不允许使用 != 运算符?

标签 c++ c multithreading parallel-processing openmp

我试图编译以下代码:

#pragma omp parallel shared (j)
{
   #pragma omp for schedule(dynamic)
   for(i = 0; i != j; i++)
   {
      // do something
   }
}

但我收到以下错误:错误:无效的控制谓词

OpenMP standard声明对于 parallel for它“仅”允许以下运算符之一的构造函数:< , <= , > >= .

我不明白不允许 i != j 的理由.我可以理解,对于 static schedule ,因为编译器需要预先计算分配给每个线程的迭代次数。但是我不明白为什么在这种情况下会出现这种限制。有什么线索吗?


编辑:即使我制作 for(i = 0; i != 100; i++) ,尽管我可以只输入“<”或“<=”。

最佳答案

.

我就这个主题向 OpenMP 开发者发送了一封电子邮件,我得到了答复:

对于有符号整数,环绕行为是未定义的。如果我们允许 !=,程序员可能会得到意外的tripcount。问题是编译器是否可以生成代码来计算循环的行程计数。

对于一个简单的循环,例如:

for( i = 0; i < n; ++i )

编译器可以确定存在“n”次迭代,如果 n>=0,以及零次迭代如果 n < 0

对于像这样的循环:

for( i = 0; i != n; ++i ) 

同样,编译器应该能够确定存在“n”次迭代,如果 n >= 0; 如果 n < 0,我们不知道它有多少次迭代。

对于像这样的循环:

for( i = 0; i < n; i += 2 )

编译器可以生成代码来计算行程计数(循环迭代计数)为 floor((n+1)/2) 如果 n >= 0 和 0 如果 n < 0.

对于像这样的循环:

for( i = 0; i != n; i += 2 )

编译器无法确定“i”是否会命中“n”。如果 'n' 是奇数呢?

对于像这样的循环:

for( i = 0; i < n; i += k )

编译器可以生成代码来计算行程计数,如果 n >= 0 则为 floor((n+k-1)/k),如果 n < 0 则为 0 strong>,因为编译器知道循环必须向上计数;在这种情况下,如果 k < 0,则不是合法的 OpenMP 程序。

对于像这样的循环:

for( i = 0; i != n; i += k )

编译器甚至不知道我是向上还是向下计数。它不知道“i”是否会命中“n”。这可能是一个无限循环。

致谢:OpenMP ARB

关于c++ - 为什么 OpenMP 不允许使用 != 运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13312679/

相关文章:

c++ - C++11/14 中的静态常量与 constexpr 成员字段?

C++构建错误

c - 我如何获取文件创建日期

c++ - Flex 语法产生错误 : scanner push-back overflow

c - 为什么在评论中使用 `code' 来包含代码?

multithreading - JMeter一次只对全局变量进行初始化

C++ #pragma 包

c++ - Arduino Uart 类和库

multithreading - cudaDeviceSynchronize() 仅在当前 CUDA 上下文或所有上下文中等待完成?

iphone - 为什么对主队列的 dispatch_sync( ) 调用会阻塞主队列?