2016-06-20 46 views
-2

我有一個計算密集型程序,可以從簡單的並行化中受益,因爲任務列表中的每個任務都是相互獨立的。如何在多個線程之間正確分配任務

我不是那麼熟悉,在並行計算underlies理論,我似乎無法找到一個明確的答案,我的問題是:

如何跨越N個線程分配米任務以乾淨,規範的方式?

我對此的解決方案是運行要處理的進程的「塊」,即將列表中的前n個任務分配給可用的n個線程,然後(在這裏我認爲做出這樣的假設是公平的,在我的特定程序中,所有任務將大致在同一時間內完成),在該塊完成之後,分配下一個n個任務,如此類推,並且如果任務數量不能被n整除,則執行其餘任務並執行他們在k線程上,而剩下的nk線程空閒。

在C++中,我相信我可以通過for循環和%運算符很容易地完成此操作。我知道這不是最有效的方式,但我認爲在我的特殊情況下,「正確」(即確保沒有線程閒置)的加速可以忽略不計。

這是正確的做法嗎?或者,如果我總共有m個任務將m個線程分配給作業並讓處理器處理分配任務,那麼這也許是可能的嗎?

+2

作爲一個經驗法則:沒有比可用CPU核心更多的活動任務(thred)。 –

+0

這些是什麼樣的任務?他們如何分配?只是一些想法:一旦線程完成,它可以創建/分配下一個任務本身並繼續。或者任務可以放入一個隊列(std :: list/std :: deque)中,以適應競爭條件,並且一旦線程完成一個任務,它就會從隊列中取出下一個任務。 – Aconcagua

+0

如果每個任務的時間大致相同,那麼這是一個完美的方法。如果得分長度不同,則可能必須給線程設置更小的任務塊,並在完成後給線程更多。 – vu1p3n0x

回答

1

之前用手滾動了這一點,看看你的問題可以採取的<algorithm>發現設施優勢:

http://en.cppreference.com/w/cpp/algorithm

這樣,你就可以把執行政策的優勢,儘管後者的實現定義,嘗試在CPU餓死和閒置之間找到理想的甜點,而不會因與線程相關的機器或上下文切換而產生不必要的浪費。至少,它會產生儘可能多的線程,可以將其物理映射到平臺上,而在更高級的情況下,它可以在搜索該甜蜜點時進行自我剖析。

+0

假設你選擇的工具鏈已經實現了這一點,當然:) – ZaldronGG

相關問題