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を削除するとこの問題が解決されます。だから何が問題なの?
OpenMP仕様では、パラレル領域の終端を経由するスレッドとは別の終了コードパスをスレッドが持つことを禁じています。言い換えれば、 'return'文や' parallel '領域外のラベルへの 'goto'は許されません。コンパイラはエラーを出さなければなりませんが、MicrosoftのOpenMP実装は**非常に古く、サポートされておらず、明らかに非常に壊れています。 –
内部ループではなく外側ループで作業を共有します。しかし 'std :: vector'に注意してください。事前にすべての素数を含むメモリチャンクを予約するか、各スレッドのプライベート 'std :: vector'を記入してから後で結合してください。 –