我已经实现了一个组合搜索算法(用于与更有效的优化技术进行比较),并试图改进其运行时间parfor
.
不幸的是,工作任务似乎非常不平衡.
每个子项目的i
复杂程度约为nCr(N - i, 3)
.正如您所看到的,这些任务i < N/4
涉及的工作量要大得多i > 3*N/4
,但似乎MATLAB将所有i < N/4
工作分配给单个工作人员.
MATLAB是否真的基于相同大小的循环范围子集来划分工作?
不,这个问题引用了文档说它没有.
有没有一种方便的方法来重新平衡这个而不需要对工作人员进行硬编码(例如,如果我在池中只需要4个工作人员,那么我可以i
用两个更高的位交换两个最低位,以确保每个工作人员都能收到一些简单的混合和艰巨的任务)?
我不认为一个完整的"工作窃取"的实施是必要的,或许只是分配1
,2
,3
,4
工人,那么当4
第一个完成,它的工人开始上项目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);