2017-08-09 164 views
1

我編寫了一個小程序來測試OpenMP的性能增益。 我使用Microsoft Visual Studio進行編譯。OpenMP導致內部編譯器錯誤

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 parallel。那麼交易是什麼?預先

Folling

+0

OpenMP規範禁止線程具有任何其他退出代碼路徑,而不是通過並行區域末尾的代碼路徑。換句話說,不允許在並行區域之外的'return'語句或'goto'標籤。編譯器應該發出一個錯誤,但是微軟的OpenMP實現**非常**舊,不受支持,顯然非常破碎。 –

+0

在外層循環而不是內層循環上進行工作共享。不過要小心'std :: vector'。要麼提前預留一大塊內存將包含所有素數,要麼爲每個線程填充私有的「std :: vector」,然後再加入它們。 –

回答

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,您需要與其他標誌編譯。如果遇到編譯器錯誤,您可能已經正確執行此操作。

+0

工作正常! 非常感謝您的幫助 – Folling

相關問題