[英]Set number of threads using omp_set_num_threads() to 2, but omp_get_num_threads() returns 1
[英]OpenMP omp_get_num_threads() V.S. omp_get_max_threads()
我不明白 omp_get_num_threads() 和 omp_get_max_threads() 之間的區別。 我將演示代碼復制如下。
omp_set_nested(1);
omp_set_max_active_levels(10);
omp_set_dynamic(0);
omp_set_num_threads(2);
#pragma omp parallel
{
omp_set_num_threads(3);
#pragma omp parallel
{
omp_set_num_threads(4);
#pragma omp single
{
std::cout << omp_get_max_active_levels() << " " << omp_get_num_threads() << " "
<< omp_get_max_threads() << std::endl;
}
}
#pragma omp barrier
#pragma omp single
{
std::cout << omp_get_max_active_levels() << " " << omp_get_num_threads() << " "
<< omp_get_max_threads() << std::endl;
}
}
然后我得到了以下輸出。
10 3 4
10 3 4
10 3 4
10 3 3
我已經查看了官方文檔,但我仍然對此感到困惑。
從文檔:
omp_get_num_threads
omp_get_num_threads
例程返回執行該例程區域綁定到的parallel
區域的組中的線程數。 如果從程序的順序部分調用,則此例程返回 1。
omp_get_max_threads
omp_get_max_threads
返回的值是當前任務的nthreads-var ICV 第一個元素的值。 如果在從該例程執行返回后遇到沒有num_threads
子句的並行區域,則此值也是可用於形成新組的線程數的上限。
下圖說明了線程的流程。 您的輸出可能不正確,我無法使用 clang+libomp 或 gcc+libGOMP 重現它。
omp_get_max_threads
總是返回新的parallel
構造可以創建的線程數,如果沒有同時指定線程數。 當您在內部並行區域的omp_set_num_threads
上設置 4 時,可以創建的新不同線程的最大數量為 4,但在該區域中 3 正在使用中。 對於外部並行區域,最大值為 3,並且使用了 2 個。
在串行代碼中,在任何編譯指示中,線程數為 1,但最大值是系統的默認值(通常是內核數),如果您未通過omp_set_num_threads
或OMP_NUM_THREADS
環境變量更改它
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.