Ich schrieb ein kleines Programm, um den Leistungsgewinn von OpenMP zu testen. Ich kompiliere mit Microsoft Visual Studio.OpenMP verursacht internen Compilerfehler
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";
}
dies ist die Funktion "checkPrime (i)" zu nennen, die wie folgt aussieht:
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;
}
ich jetzt bin immer "C1001 Fehler:. Ein interner Fehler in dem Compiler aufgetreten"
Das #pragma omp parallel entfernen, um dieses Problem zu lösen. Also, was ist der Deal?
Vielen Dank im Voraus
Die OpenMP-Spezifikation verbietet den Threads, andere Pfade für den Beendigungscode als die über das Ende der parallelen Region zu haben. Mit anderen Worten, 'return'-Anweisungen oder' goto' zu Labels außerhalb der parallelen Region sind nicht erlaubt. Der Compiler sollte einen Fehler ausgeben, aber die OpenMP-Implementierung von Microsoft ist ** sehr ** alt und nicht unterstützt und anscheinend sehr kaputt. –
Führen Sie die Arbeitsteilung auf der äußeren Schleife statt auf der inneren Schleife durch. Sei aber vorsichtig mit 'std :: vector'. Entweder reservieren Sie vorher einen Teil der Erinnerung, der alle Primzahlen enthält, oder füllen Sie für jeden Thread den privaten 'std :: vector' und verbinden Sie ihn anschließend. –