gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:11:06 25 4
gpt4 key购买 nike

我试图编译以下代码:

#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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com