首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用OpenMP的“无效控制谓词”编译器错误

使用OpenMP的“无效控制谓词”编译器错误
EN

Stack Overflow用户
提问于 2013-07-10 15:52:46
回答 2查看 17.5K关注 0票数 10

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

代码语言:javascript
运行
复制
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平方引起的。有什么方法可以解决这个问题,但仍然可以从算法中获得期望的输出吗?

EN

Stack Overflow用户

回答已采纳

发布于 2013-07-10 16:22:02

return在循环中是不允许的,因为它会导致大括号前的退出。

请注意以下定义:

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

结构化块-对于C/C++,一种可执行语句,可能是复合语句,顶部有一个条目,底部有一个出口。

结构化块以打开的{开始,以关闭的}结束。return包含在这些大括号中,因此这个程序也违反了结构化块的OpenMP定义,因为它有两个出口(一个在return,一个在通过支撑的出口处)。

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

  • 循环变量必须是有符号整数类型。无符号整数(如DWORD的整数)将无法工作。
  • 比较操作必须以loop_variable <<=>>= loop_invariant_integer形式进行。
  • for循环的第三个表达式或增量部分必须是整数加法或整数减法,并使用循环不变值。
  • 如果比较操作是<<=,则循环变量必须在每次迭代中递增,反之,如果比较操作是>>=,则循环变量必须在每次迭代中递减。
  • 循环必须是一个基本块,这意味着除了exit语句之外,不允许从循环内部跳到外部,因为退出语句终止了整个应用程序。如果使用语句goto或break,则必须在循环中跳转,而不是跳转到循环之外。异常处理也是如此;必须在循环中捕获异常。
票数 14
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17575329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档