OpenMP导致内部编译器错误

时间:2017-08-09 16:40:35

标签: c++ compiler-errors 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";
}

这是调用&#34; checkPrime(i)&#34;的函数。看起来像这样:

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

我现在得到一个&#34; C1001错误:编译器中发生内部错误。&#34;

删除#pragma omp parallel以解决此问题。那么这笔交易是什么?

提前致谢

Folling

1 个答案:

答案 0 :(得分: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要求您使用其他标志进行编译。如果遇到编译错误,您可能已经正确地执行了此操作。