我正在创建一个基于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平方引起的。有什么方法可以解决这个问题,但仍然可以从算法中获得期望的输出吗?
发布于 2013-07-10 16:22:02
return在循环中是不允许的,因为它会导致大括号前的退出。
请注意以下定义:
来自OpenMP V2.5规范,1.2.2 OpenMP语言术语,p2:17-
结构化块-对于C/C++,一种可执行语句,可能是复合语句,顶部有一个条目,底部有一个出口。
结构化块以打开的{开始,以关闭的}结束。return包含在这些大括号中,因此这个程序也违反了结构化块的OpenMP定义,因为它有两个出口(一个在return,一个在通过支撑的出口处)。
OpenMP设置了以下五个可以线程化循环的限制:
<、<=、>或>= loop_invariant_integer形式进行。<或<=,则循环变量必须在每次迭代中递增,反之,如果比较操作是>或>=,则循环变量必须在每次迭代中递减。https://stackoverflow.com/questions/17575329
复制相似问题