我写了一个小程序来测试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
答案 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要求您使用其他标志进行编译。如果遇到编译错误,您可能已经正确地执行了此操作。