2016-05-18 38 views
2

我想創建一個全局對象數組(每個可能的線程產生一個對象,由OpenMP產生)並在整個程序中重用它。每個線程將使用omp_get_thread_num來讀取其編號,並使用它來索引該數組。如何獲得在整個程序執行期間可能創建的OpenMP線程的最大數量?

如何獲得在整個程序執行期間可能創建的最大線程數OpenMP

omp_get_max_threads文檔說,這種功能被指定爲返回一個值,該值是特定於它被調用的特定平行區域

omp_get_max_threads - 並行區域的最大線程數

說明:返回不使用子句num_threads的當前並行區域使用的最大線程數。

鑑於對MSDN documentation措辭意味着由omp_get_max_threads並行區域外返回的值是將在任何其它點被返回的值相同。

omp_get_max_threads

返回一個整數,它是等於或大於線程將是若無NUM_THREADS並行區域在代碼中的該點被定義可用的數量越大。

其中哪一個是正確的?

回答

2

沒有最大數量。

技術上的OpenMP定義稱爲nthreads-var一個內部控制變量(見2.3.3 OpenMP 4.5),該線程排序的默認數量的。您用omp_get_max_threads讀取它,您將它設置爲omp_set_num_threads(不幸的命名故障),並且您用明確的num_threads子句覆蓋它。

因此,您必須編寫代碼,以便它可以處理意外數量的線程,例如,通過預定義數組達到omp_get_num_threads(),並且如果有更多的線程到達,則懶惰地調整它的大小。或者進行合理的猜測並檢查每次訪問的索引邊界。

+1

謝謝,所以我明白,如果我保證在程序中永遠不會調用'omp_set_num_threads',我可以依靠'omp_get_max_threads()'永不改變。對? –

+1

實際上,是的。但嚴格遵循標準,這是實現定義的。自從OpenMP 3.1以來,'nthreads-var'是一個列表 - 而這些函數只涉及第一個元素。如果列表中有多個元素,則在嵌套區域中使用尾部。由於列表的初始化是實現定義的,因此實現可以像'[2,4]'一樣初始化列表。我懷疑/希望會發生。 – Zulan

相關問題