我试图编译以下代码:
#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/