2015-10-16 91 views
3
omp_set_num_threads(8); 
#pragma omp parallel for 
for(int tx = 0; tx < numThread; tx++) 
{ 
    cout<<"\nThread :"<<omp_get_num_threads()<<"\n"; 

} 

我的理解沒有運行的是,上面的代碼應該打印8.但是我得到的輸出是OpenMP代碼並行

Thread :1 

Thread :1 

Thread :1 

Thread :1 

Thread :1 

Thread :1 

Thread :1 

Thread :1 

請讓我知道是怎麼回事錯在這裏。我是初學者openmp,所以我很確定我一定犯了一些愚蠢的錯誤。

在此先感謝

+0

究竟是什麼編譯器? – Jeff

+0

gcc(Ubuntu 4.8.4-2ubuntu1〜14.04)4.8.4 –

回答

1

我不確定這裏發生了什麼事。

可能出現這種情況,您使用存根OpenMP庫進行編譯,該庫提供所有OpenMP庫API,但只能像序列模式那樣工作(例如,針對相應的英特爾編譯器開關,請參見this link)。

另一種可能性是在您的環境中將OMP_THREAD_LIMIT環境變量設置爲1。例如,見下面的代碼:

#include <iostream> 
#include <omp.h> 

int main() { 
    omp_set_num_threads(8); 
    #pragma omp parallel 
    #pragma omp single 
    std::cout << "Number of threads in the current parallel region is " << omp_get_num_threads() << std::endl; 

    return 0; 
} 

當與支持OpenMP和運行編譯,它給了我:

$ g++ -fopenmp nbthreads.cc -o nbthreads 
$ ./nbthreads 
Number of threads in the current parallel region is 8 
$ OMP_THREAD_LIMIT=1 ./nbthreads 
Number of threads in the current parallel region is 1 
來自這兩種可能性

除此之外,我不知道。


編輯:感謝Z boson的 評論,我敢肯定,我已經得到了神祕的關鍵。

有了非常相同的代碼上文之一,這裏是我的本錢:

$ g++ -o nbthreads nbthreads.cc -lgomp 
$ ./nbthreads 
Number of threads in the current parallel region is 1 

所以你根本錯誤地使用-lgomp代替-fopenmp在編譯/鏈接代碼。這給你一個相當於只有1個線程的OpenMP代碼,即使你明確要求更多。

+0

他說他在使用GCC。不幸的是,沒有辦法只使用GCC中的存根函數:它是全部或全部。你可以用ICC和MSVC來做到這一點,而不是GCC。 –

+0

@Zboson thx的評論。我想我現在已經明白了;) – Gilles

+0

這很有趣。也許我錯了?如果你只與'-lgomp'鏈接,你只能得到存根?或者至少你沒有線程? –