2014-05-02 103 views
3

我最近發現了thread pools的概念。據我所知,GCC,ICC和MSVC都使用OpenMP的線程池。我很想知道當我改變線程數時會發生什麼?例如,我們假設默認的線程數是8。我創建了一個由八個線程組成的團隊,然後在後面的章節中我會完成四個線程,然後我回到八個線程。帶OpenMP的線程池:開銷和更改線程數

#pragma omp parallel for 
for(int i=0; i<n; i++) 

#pragma omp parallel for num_threads(4) 
for(int i=0; i<n; i++) 

#pragma omp parallel for 
for(int i=0; i<n; i++) 

這是我現在居然這樣做,因爲我的代碼部分變得更壞的結果與超線程,所以我底線的物理內核數量數量(只對那部分代碼)。如果我做了相反的事情(4線程,然後8,然後4)呢?

每次更改線程數時是否都要重新創建線程池?如果沒有,添加或刪除線程是否會導致任何重大開銷?

線程池的開銷是多少?即每個線程的工作量是多少?

+3

當需要更多的時候,'libgomp'產生額外的線程,但不會殺死已經產生的線程,而是讓它們在對接障礙中睡覺。實際開銷可以使用EPCC的[OpenMP microbenchmarks](http://www2.epcc.ed.ac.uk/computing/research_activities/openmpbench/openmp_index.html)進行測量。 –

回答

1

現在回答這個問題可能已經晚了。但是,我打算這麼做。

當你從一開始就有8個線程時,總共會創建7個線程,然後,包括你的主進程,你有一個8人的團隊。所以,你的示例代碼中的第一個循環將使用這個球隊。因此,線程池有8個線程。他們完成了這個地區後,他們進入睡眠直到醒來。

現在,當您使用4個線程到達第二個並行區域時,線程池中只有3個線程被喚醒(3個線程+您當前的主線程),其餘線程仍處於睡眠模式。所以,四個線程正在睡覺。

然後,類似於第一個並行區域,所有線程將相互合併做第三個並行區域。


在另一方面,如果你開始有4個線程,第二平行區域要求8個線程,然後庫將理解這個問題和變化,並創建4個額外的線程來滿足您的要求。通常創建的線程在程序生命結束之前不會被拋出池外。希望你將來可能需要它。


希望這可以幫助你和未來的乘客在這裏。

+0

這個答案只是Hristo Iliev在我的問題中的評論的較長答案。 –