我正在使用粗粒度和細粒度多線程的應用程序。也就是說,我們手動管理線程池上的大型工作單元的調度,然後在這些工作單元中,某些功能利用OpenMP進行更細粒度的多線程。如何處理OpenMP線程池爭用
我們已經通過在我們最昂貴的循環中有選擇地使用OpenMP來實現收益,但是擔心會在OpenMP塊添加到更便宜的循環中時爲OpenMP工作池創建爭用。有沒有一種方法可以向OpenMP發出信號:如果代碼塊可用,那麼應該使用該代碼塊;如果沒有,它應該連續處理循環?
我正在使用粗粒度和細粒度多線程的應用程序。也就是說,我們手動管理線程池上的大型工作單元的調度,然後在這些工作單元中,某些功能利用OpenMP進行更細粒度的多線程。如何處理OpenMP線程池爭用
我們已經通過在我們最昂貴的循環中有選擇地使用OpenMP來實現收益,但是擔心會在OpenMP塊添加到更便宜的循環中時爲OpenMP工作池創建爭用。有沒有一種方法可以向OpenMP發出信號:如果代碼塊可用,那麼應該使用該代碼塊;如果沒有,它應該連續處理循環?
您可能能夠在parallel
指令做你想做的通過巧妙地利用omp_get_num_threads
,omp_set_num_threads
和if
和num_threads
條款。 OpenMP 3.0還提供了可能有用的tasks
。
您可以使用omp_set_num_threads(int)設置no。池內的線程數。然後編譯器會盡可能地創建一個線程池並安排它們。如果無法創建池,那麼它將創建儘可能多的線程並以串行方式運行其他線程。
它是創建線程的運行時 - 不是編譯器。如果請求的線程數多於可創建的線程數,那麼它取決於OpenMP規範概述的許多因素。如果ICV dyn-var(它控制線程數量的動態調整)是「false」,那麼它將被實現定義爲將發生什麼。如果dyn-var是「true」,那麼它會得到一些線程並且並行地運行該區域。除非嵌套平行關閉「關閉」或不支持,否則區域將不會連續運行。 – ejd 2011-05-04 14:50:08