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 требует компиляции с дополнительными флагами. Вы, вероятно, уже делаете это правильно, если столкнулись с ошибкой компилятора.

Другие вопросы по тегам