【发布时间】:2026-01-01 09:50:01
【问题描述】:
我正在创建一个基于 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 平方引起的。有没有办法可以解决这个问题,并且仍然可以从算法中获得所需的输出?
【问题讨论】:
-
您确定在开放式 mp 循环结构中允许使用 return 语句吗?
-
不幸的是,使用 OpenMP 将循环并行化并不能帮助使用试除法测试单个素数。但是,您可以使用试除法有效地使用它来测试多个素数。但是,为了查找素数列表,我推荐使用埃拉托色尼筛法。这是使用 OpenMP 的版本create.stephan-brumme.com/eratosthenes
-
另外,在您的
isPrime函数中,我建议使用j <= j/value而不是j*j <= value,这可能会溢出rosettacode.org/wiki/Primality_by_trial_division#C