我在Linux上編譯一個複雜的C++項目,它使用OpenMP,用CMake和GCC 7編譯。 我在這個特定項目中遇到的奇怪問題OpenMP顯然是在工作,但它認爲只有一個線程被支持,應該是8。但是,如果我手動指定線程數,它確實會加速代碼。omp_get_max_threads()在並行區域返回1,但它應該是8
logOut << "In parallel? " << omp_in_parallel() << std::endl;
logOut << "Num threads = " << omp_get_num_threads() << std::endl;
logOut << "Max threads = " << omp_get_max_threads() << std::endl;
logOut << "Entering my parallel region: " << std::endl;
//without num_threads(5), only 1 thread is created
#pragma omp parallel num_threads(5)
{
#pragma omp single nowait
{
logOut << "In parallel? " << omp_in_parallel() << std::endl;
logOut << "Num threads = " << omp_get_num_threads() << std::endl;
logOut << "Max threads = " << omp_get_max_threads() << std::endl;
}
}
輸出:
[openmp_test] In parallel? 0
[openmp_test] Num threads = 1
[openmp_test] Max threads = 1
[openmp_test] Entering my parallel region:
[openmp_test] In parallel? 1
[openmp_test] Num threads = 5
[openmp_test] Max threads = 1
什麼使得它更奇怪的是,一個簡單的測試OpenMP程序直接正確地報告的最大線程數爲8,內部和並行區域之外。 我一直在梳理所有的CMake文件,試圖找到爲什麼這個項目的行爲不同的任何指標,但到目前爲止我沒有發現任何東西。在我的任何項目文件中沒有提及omp_set_num_threads
,我可以確認沒有聲明OMP_NUM_THREADS
。此外,當我使用MSVC在Windows上編譯相同的項目時,此問題從未發生。
任何想法可能是什麼問題?
(編輯:我已經擴展了代碼示例,以顯示它不是一個嵌套並行塊)
CPU:英特爾(R)核心(TM)i7-6700K
OS:Manjaro Linux的17.0.2
編譯器:GCC 7.1.1 20170630
_OPENMP = 201511(我猜這意味着OpenMP的4.5)
您能否爲您的問題添加特定的平臺信息(操作系統,硬件,編譯器,OpenMP運行庫等)?你也可以嘗試在並行區域之前輸出'omp_in_parallel()'和'omp_get_num_threads()'嗎?您是否還可以驗證您的環境中是否設置了OMP_NUM_THREADS?如果你設置它,你會觀察到不同的行爲嗎? – dlasalle
謝謝,我添加了您建議的信息。我確認並行區域之外的代碼不在並行區域中,並且未聲明「OMP_NUM_THREADS」。 –
您可以嘗試將'getenv(「OMP_NUM_THREADS」);'從調用到程序的開頭以確保它返回NULL嗎?另外,你是否可以擴展你的代碼片段來完成(即,像@FlashMcQueen如何將它包裝在'main()')中,並確認相同的行爲?這將幫助我們排除一些圖書館干擾線程。 –
dlasalle