2017-08-09 1 views
1

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

+0

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. –

+0

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. –

Antwort

1

OpenMP Følling ist so konzipiert, zahlreiche Threads zu erstellen, die gleichzeitig mehrere unabhängige Operationen durchführen können. In meinem Fall glaube ich, dass der Fehler durch die Tatsache verursacht wird, dass viele Threads erzeugt werden, aber nur einige von ihnen vorzeitig durch die return false;-Anweisung beendet werden. Statt sofort false Rückkehr versuchen, eine boolean Variable Einstellung:

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;   
} 

Zusätzlich ist zu beachten, dass OpenMP verwendet, erfordert, dass Sie mit zusätzlichen Flags kompilieren. Wahrscheinlich machen Sie das schon richtig, wenn Sie auf einen Compilerfehler stoßen.

+0

Das hat funktioniert! Vielen Dank für diese Hilfe – Folling

Verwandte Themen