OpenMP вызывает внутреннюю ошибку компилятора
Я написал небольшую программу для проверки прироста производительности OpenMP. Я компилирую с использованием Microsoft Visual Studio.
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 для решения этой проблемы. Так в чем же дело?
заранее спасибо
феллинг
1 ответ
OpenMP предназначен для порождения множества потоков, которые могут выполнять несколько независимых операций одновременно. В вашем случае я считаю, что ошибка вызвана тем, что многие потоки создаются, но только некоторые из них преждевременно завершаются return false;
заявление. Вместо немедленного возвращения false
попробуйте установить логическую переменную:
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 требует компиляции с дополнительными флагами. Вы, вероятно, уже делаете это правильно, если столкнулись с ошибкой компилятора.