[英]Set number of threads using omp_set_num_threads() to 2, but omp_get_num_threads() returns 1
[英]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_dynamic
與omp_get_num_threads
的交互作用:
為什么omp_set_dynamic(1)從不調整線程數(在Visual C ++中)?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.