我已经实现了一个组合搜索算法(用于与更有效的优化技术进行比较)并尝试使用parfor
来改进其运行时。
不幸的是,工作任务似乎非常不平衡。
每个子项i
的复杂度约为nCr(N - i, 3)
。如您所见,任务i < N/4
涉及的工作量远远超过i > 3*N/4
,但似乎MATLAB将所有i < N/4
分配给单个工作人员。
MATLAB是否真的基于相同大小的循环范围子集来划分工作?
不,this question引用文档说它没有。
有没有一种方便的方法来重新平衡这个而不用硬编码工作者的数量(例如,如果我在池中只需要4个工作者,那么我可以将i
的两个最低位用两个更高的位交换,以便确保每个工人都接受了一些简单和艰难的任务)?
我认为不需要完整的“工作窃取”实施,可能只是将1
,2
,3
,4
分配给工人,然后当4
首先完成时,其工作人员从项目5
开始,依此类推。每个项目的大小远远大于我不太担心增加的通信开销的迭代次数。
答案 0 :(得分: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);