gpt4 book ai didi

c - "invalid controlling predicate"使用 OpenMP 的编译器错误

转载 作者:太空狗 更新时间:2023-10-29 16:46:36 31 4
gpt4 key购买 nike

我正在创建一个基本的素数检查器,基于 C - determine if a number is prime , 但使用 OpenMP。

int isPrime(int value)
{
omp_set_num_threads(4);

#pragma omp parallel for
for( int j = 2; j * j <= value; j++)
{
if ( value % j == 0) return 0;
}
return value;
}

当使用 -fopenmp 编译时,GCC 版本 4.7.2 出错,针对 for 循环声明 invalid controlling predicate

这个错误貌似是for循环中的j平方引起的。有没有一种方法可以解决这个问题并仍然从算法中获得所需的输出?

最佳答案

return不允许在循环内,因为它会导致在花括号之前退出。

注意下面给出的定义:

来自 OpenMP V2.5 规范,1.2.2 OpenMP 语言术语,p2:17-

structured block - For C/C++, an executable statement, possibly compound, with a single entry at the top and a single exit at the bottom.

结构化 block 以开放的{开始并以结尾 } 结尾. return包含在这些大括号中,因此该程序也违反了 OpenMP 对结构化 block 的定义,因为它有两个导出(一个在 return 处,一个在通过大括号的导出处)

OpenMP 对哪些循环可以线程化设置了以下五个限制:

  • 循环变量必须是有符号整数类型。无符号整数,诸如 DWORD 之类的,将不起作用。
  • 比较操作的形式必须是 loop_variable < , <= , > ,或 >= loop_invariant_integer
  • for 循环的第三个表达式或增量部分必须是整数加法或整数减法并通过循环不变的值(value)。
  • 如果比较操作是<<= ,循环变量必须每次迭代递增,反之,如果比较操作是>>= ,循环变量必须递减迭代。
  • 循环必须是一个基本 block ,意味着不能从内部跳转除了导出外,允许向外循环语句,它终止了整个应用程序。如果语句使用 goto 或 break,它们必须在循环内跳转,而不是在循环外跳转它。异常处理也是如此;异常必须被捕获在循环内。

关于c - "invalid controlling predicate"使用 OpenMP 的编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17575329/

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