簡體   English   中英

OpenMP omp_get_num_threads() VS omp_get_max_threads()

[英]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_threadsOMP_NUM_THREADS環境變量更改它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM