OpenMP 会导致内部编译器错误

OpenMP causes internal compiler error

本文关键字:编译器 错误 内部 OpenMP      更新时间:2023-10-16

我写了一个小程序来测试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 checkedn";
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 并行可以解决此问题。那么这是怎么回事呢?

提前致谢

福林

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 需要使用其他标志进行编译。如果您遇到编译器错误,您可能已经正确执行此操作。