J'ai écrit un petit programme pour tester le gain de performance d'OpenMP. Je compile en utilisant Microsoft Visual Studio.OpenMP provoque une erreur de compilation interne
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";
}
c'est la fonction d'appel "checkPrime (i)" qui ressemble à ceci:
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;
}
Je reçois maintenant un "C1001 Erreur: Une erreur interne est survenue dans le compilateur."
Suppression du #pragma omp parallèle pour résoudre ce problème. Alors, quel est le problème?
Merci à l'avance
Fölling
La spécification OpenMP interdit aux threads d'avoir d'autres chemins de code de sortie que celui via la fin de la région parallèle. En d'autres termes, les instructions 'return' ou' goto' sur les étiquettes en dehors de la région parallèle ne sont pas autorisées. Le compilateur devrait émettre une erreur, mais l'implémentation OpenMP de Microsoft est ** très ** ancienne et non supportée et apparemment très cassée. –
Faites le partage du travail sur la boucle externe plutôt que sur la boucle interne. Faites attention 'std :: vector' cependant. Soit réserver un morceau de mémoire à l'avance qui contiendra tous les nombres premiers ou remplir le fichier 'std :: vector' privé pour chaque thread, puis les rejoindre ensuite. –