2015-04-20 81 views
5

我實現了一個組合搜索算法(進行比較,從而更有效的優化技術),並試圖改善其運行時與parfor偷竊。工作並行計算工具箱

不幸的是,工作任務似乎是非常嚴重失去平衡。

每個子項目i約爲nCr(N - i, 3)複雜性。正如你所看到的,任務i < N/4涉及顯著更多的工作比i > 3*N/4,但似乎利用MATLAB所有i < N/4到單個工作分配。

這是真的,MATLAB劃分基礎上,循環範圍的同樣大小的子集的工作?

不,this question援引文件說它沒有。

是否有重新平衡這個沒有硬編碼的工人數量(例如,如果我在游泳池要求恰好有4名工人,那麼我可以用兩個較高位交換的i兩個最低位,以確保一個方便的方法每個工人都收到了一些簡單和困難的任務)?

我不認爲一個完整的「工作竊取」的實施是必要的,或許只是分配1234工人,那麼當4完成第一,它的工人開始上項目5,等等。每個項目的大小比我不太擔心增加的通信開銷的迭代次數要大得多。

回答

5

如果循環迭代確實分佈的時間提前(這將意味着在最後,有一個工人,將要完成多次迭代,而其他工人都閒置 - ?這是真的情況下),以確保組合的最簡單方法是隨機置換循環迭代:

permutedIterations = randperm(nIterations); 
permutedResults = cell(nIterations,1); %# or whatever else you use for storing results 

%# run the parfor loop, completing iterations in permuted order 
parfor iIter = 1:nIterations 
    permutedResults(iIter) = f(permutedIterations(iIter)); 
end 

%# reorder results for easier subsequent analysis 
results = permutedResults(permutedIterations); 
+0

或許與'mod',而不是'randperm':假設'nIterations'是'ñWorkers'的倍數,使用'permutedIterations =重塑(重塑(1:nIterations,nWorkers,[])',1,[]。)' –