簡體   English   中英

使用omp_set_num_threads后,能否使OpenMP恢復為理想的線程數?

[英]Can I make OpenMP to revert to ideal # of threads after using omp_set_num_threads?

在應用程序調用了具有特定編號的omp_set_num_threads() 之后 ,有沒有辦法使OpenMP將線程數(下次使用時)恢復為默認值?

例如,是否提供給omp_set_num_threads的特殊代碼(例如0或-1)?

還是我應該嘗試做類似omp_set_num_threads(omp_get_max_threads())事情?

我假設默認數目是OpenMP認為是“最佳”的任何實現。 但是我不知道默認值是保證是什么,甚至應該保證是什么。 我所知道的是,我有一個針對一個特定的OpenMP塊調用omp_set_num_threads(4)的應用程序,我現在不能對其進行編輯。 但我想防止該設置影響代碼中的其他OpenMP塊。

我以前有這個問題。 免責聲明:我使用MSVC,目前僅實現OpenMP 2.0標准)。 據我所知, OpenMP 2.0標准中沒有任何內容可讓您找出此默認值。 omp_get_max_threads()不需要返回(所有后續重點代碼):

omp_get_max_threads函數返回一個整數,該整數必須至少與在代碼點此時遇到不帶num_threads子句的並行區域時用於組隊的線程數一樣大

換句話說,它可能返回一個大於當前設置(或默認值)的數字。

omp_set_num_threads也沒有特殊值:

omp_set_num_threads函數設置用於后續未指定num_threads子句的並行區域的默認線程數。 [...]參數num_threads的值必須為正整數

如果弄錯了,將取決於實現情況:

如果在禁用動態調整線程數的情況下遇到並行區域,並且為並行區域請求的線程數超過了運行時系統可以提供的數量,則程序的行為是實現定義的 一個實現可以例如中斷程序的執行,或者可以序列化並行區域。

您可能會在OpenMP實施的文檔中找到更精確的信息(並且減少不安)。 但是,對於MSVC,該文檔只是OpenMP 2.0標准的逐字副本...


由於您是通過這種方式修改線程數的業務,因此我想omp_get_num_threads MSVC中omp_set_dynamicomp_get_num_threads的交互作用:
為什么omp_set_dynamic(1)從不調整線程數(在Visual C ++中)?

暫無
暫無

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

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