大家基本上是正確的,但這裏的分裂工作,並保持所有的處理器繁忙的一個快速和骯髒的方式。這個工作最好1)創建線程相比,在迭代2所做的工作是昂貴時)最迭代需要大約相同數量的時間來完成
首先,創建每個處理器/核1個線程。這些是你的工作線程。他們閒坐着,直到他們被告知要做點什麼。
現在分手了你的工作,使得工作所需要的同時數據是併攏。我的意思是,如果你在一臺雙處理器機器上處理一個十個元素的數組,你就把它分開,這樣一個組是1,2,3,4,5,另一個是6,7 ,8,9,10。你可能會想把它分成1,3,5,7,9和2,4,6,8,10,但是你會導致更多的錯誤分享(http://en.wikipedia.org/ wiki/False_sharing)。
所以,現在你有每個處理器線程和每個線程的一組數據,你只需告訴每個線程在該數據的一個獨立小組的工作。
所以在你的情況下,我會做這樣的事情。
for (int t=0;t<n_processors;++t)
{
thread[t]=create_thread();
datamin[t]=t*(i_max/n_processors);
datamax[t]=(t+1)*(i_max/n_processors);
}
for (int t=0;t<n_processors;++t)
do_work(thread[t], datamin[t], datamax[t], j_max)
//wait for all threads to be done
//continue with rest of the program.
當然,我忽略了處理您的數據不是處理器數量的整數倍,而是很容易修復。另外,如果您對第三方庫沒有不利影響,那麼英特爾的TBB(線程構建模塊)可以很好地從您那裏抽象出這些內容,並讓您得到您想要做的實際工作。
這聽起來像你想使用線程池,而不是旋轉大量的線程。 – 2010-12-13 20:05:16
@Anon:線程池只會緩解基本上仍然存在的問題。但是,這可能確實有幫助。 – 2010-12-13 20:08:16