2017-08-09 12 views
1

OpenMPのパフォーマンス向上をテストするための小さなプログラムを作成しました。 Microsoft Visual Studioを使用してコンパイルします。OpenMPにより内部コンパイルエラーが発生する

void findAllPrimesUntilX() { 
    for (int i = 2; i <= upToXthPrimes; i++) { 
     if (i % 500 == 0) std::cout << "First " << i * 500 << "primes have been checked\n"; 
     if (checkPrime(i)) primes.push_back(i); 
    } 
    std::cout << "All primes have been calculated!\n"; 
} 

これはこのようになります "checkPrime(I)" を呼び出す関数です。

bool checkPrime(int n) { 
    if (n == 2) return true; 
    if (n < 2 || n % 2 == 0) return false;  
#pragma omp parallel for 
     for (int i = 3; i <= static_cast<int>(sqrt(n)); i += 2) { 
      if (n % i == 0) return false; 
     } 
     return true;   
} 

私は今取得しています "C1001エラー:内部エラーがコンパイラで発生したの"

#pragma omp parallelを削除するとこの問題が解決されます。だから何が問題なの?

+0

OpenMP仕様では、パラレル領域の終端を経由するスレッドとは別の終了コードパスをスレッドが持つことを禁じています。言い換えれば、 'return'文や' parallel '領域外のラベルへの 'goto'は許されません。コンパイラはエラーを出さなければなりませんが、MicrosoftのOpenMP実装は**非常に古く、サポートされておらず、明らかに非常に壊れています。 –

+0

内部ループではなく外側ループで作業を共有します。しかし 'std :: vector'に注意してください。事前にすべての素数を含むメモリチャンクを予約するか、各スレッドのプライベート 'std :: vector'を記入してから後で結合してください。 –

答えて

1

のOpenMPをFolling予め

おかげで、同時に複数の独立した操作を行うことができ、多数のスレッドを生成するように設計されています。あなたのケースでは、私は、多くのスレッドが生成されたという事実が原因でエラーが発生していると信じていますが、そのうちのいくつかだけがreturn false;ステートメントで途中終了しています。代わりに、すぐにfalseを返す、boolean型変数を設定してみてください:

bool checkPrime(int n) { 
    if (n == 2) return true; 
    if (n < 2 || n % 2 == 0) return false; 
    bool prime = true; 

    #pragma omp parallel for 
    for (int i = 3; i <= static_cast<int>(sqrt(n)); i += 2) { 
     if (n % i == 0) prime = false; 
    } 

    return prime;   
} 

また、OpenMPのを使用して、追加のフラグを指定してコンパイルすることを必要とすることに注意してください。コンパイラエラーが発生した場合、おそらくこれを正しく実行しているはずです。

+0

それは働いた! ありがとうございました – Folling

関連する問題