10

Cに基づいて基本的な素数チェッカーを作成しています- 数値が素数 であるかどうかを判断しますが、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 でinvalid controlling predicatefor ループに関してエラーが発生します。

このエラーは、for ループで二乗された j が原因のようです。これを回避し、アルゴリズムから目的の出力を得る方法はありますか?

4

2 に答える 2

6

OpenMP 標準 (§2.5.1、p.40) によると、forループの制御述語の許容される形式は次のとおりです。

  • var 関係演算 b、および
  • b 関係演算変数

の使用j * j <= valueは、この要件の明らかな違反です。value理論的根拠は、実行時にの整数平方根を計算するコードをコンパイラが発行する必要があることです。後者は、 の一部の値value、特に負の値に対して未定義です。

に置き換えることができます。ここで、j * j <= valueはの整数平方根ですが、ループ内の構造化ブロックに別の出口パスがあると問題が発生します。残念ながら、OpenMP は並列ループの早期終了をサポートしていないため、この場合の簡単な解決策はありません。j <= sqrt_valuesqrt_valuevalue

于 2013-07-10T16:40:53.693 に答える