我有一個計算密集型程序,可以從簡單的並行化中受益,因爲任務列表中的每個任務都是相互獨立的。如何在多個線程之間正確分配任務
我不是那麼熟悉,在並行計算underlies理論,我似乎無法找到一個明確的答案,我的問題是:
如何跨越N個線程分配米任務以乾淨,規範的方式?
我對此的解決方案是運行要處理的進程的「塊」,即將列表中的前n個任務分配給可用的n個線程,然後(在這裏我認爲做出這樣的假設是公平的,在我的特定程序中,所有任務將大致在同一時間內完成),在該塊完成之後,分配下一個n個任務,如此類推,並且如果任務數量不能被n整除,則執行其餘任務並執行他們在k線程上,而剩下的nk線程空閒。
在C++中,我相信我可以通過for循環和%運算符很容易地完成此操作。我知道這不是最有效的方式,但我認爲在我的特殊情況下,「正確」(即確保沒有線程閒置)的加速可以忽略不計。
這是正確的做法嗎?或者,如果我總共有m個任務將m個線程分配給作業並讓處理器處理分配任務,那麼這也許是可能的嗎?
作爲一個經驗法則:沒有比可用CPU核心更多的活動任務(thred)。 –
這些是什麼樣的任務?他們如何分配?只是一些想法:一旦線程完成,它可以創建/分配下一個任務本身並繼續。或者任務可以放入一個隊列(std :: list/std :: deque)中,以適應競爭條件,並且一旦線程完成一個任務,它就會從隊列中取出下一個任務。 – Aconcagua
如果每個任務的時間大致相同,那麼這是一個完美的方法。如果得分長度不同,則可能必須給線程設置更小的任務塊,並在完成後給線程更多。 – vu1p3n0x