【问题标题】:work stealing with Parallel Computing Toolbox使用 Parallel Computing Toolbox 窃取工作
【发布时间】:2015-04-20 19:16:24
【问题描述】:

我已经实现了一种组合搜索算法(用于与更有效的优化技术进行比较)并尝试使用parfor 改进其运行时间。

很遗憾,工作分配似乎很不平衡。

每个子项i 的复杂度约为nCr(N - i, 3)。如您所见,i < N/4 的任务比i > 3*N/4 涉及的工作要多得多,但似乎 MATLAB 正在将所有i < N/4 分配给单个工作人员。

MATLAB 是否根据循环范围的大小相等的子集划分工作?

不,this question 引用文档说它没有。

有没有一种方便的方法来重新平衡这个而不用硬编码工人的数量(例如,如果我需要在池中恰好有 4 个工人,那么我可以将i 的两个最低位与两个更高位交换,以确保每个工人收到了一些简单和困难的任务)?

我认为不需要完整的“工作窃取”实现,也许只是将1234 分配给工人,然后当4 首先完成时,它worker 从项目5 开始,依此类推。每个项目的大小都比迭代次数大得多,我不太担心增加的通信开销。

【问题讨论】:

    标签: matlab parallel-processing parfor


    【解决方案1】:

    如果循环迭代确实提前分布(这意味着最终,有一个工作人员必须在其他工作人员空闲时完成几次迭代 - 真的是这样吗?),确保混合的最简单方法是随机排列循环迭代:

    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);
    

    【讨论】:

    • 或者也许用mod代替randperm:假设nIterationsn Workers的倍数,使用permutedIterations = reshape(reshape(1:nIterations,nWorkers,[]).',1,[])
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    相关资源
    最近更新 更多