我有一个parfor循环说100次迭代,每次迭代的工作量是不同的,但线性变化的方式是第一次占用最多的时间而最后一次是最快的。但是当我用我的四个实例/实验室运行parfor循环时,在过去几个小时内只有一个实验室处于活动状态,因为它正在通过自己的几个第一次迭代运行。
所以我知道哪些迭代是慢的。如何使内核之间的工作负载更均匀。例如,以某种方式迫使所有实验室开始处理前四个缓慢的实验室,然后按顺序进行?或类似的东西,以防止只有一个活动核心单独运行少数慢速..
答案 0 :(得分:2)
Matlab parfor不做任何事情,只是拆分指数并将它们分发给工人。它通过从索引创建连续的块来实现这一点。我不知道确切的算法,但这意味着具有相似索引的数据在同一个块和同一个工作程序中计算。
最简单的解决方案是随机解决方案。只需对您的索引进行随机播放,以便很好地分配工作密集型步骤。虽然这并没有给你任何性能保证,但它很简单,大部分时间都可以使用。
一些示例代码:
% dummy data
N=10;
data=1:N;
% generate the permutated indices
permIndex=randperm(N);
% permute the data
dataPermuted=data(permIndex);
% run the loop
parfor i=1:N
% do something e.g. pause for the time as specified by data
pause(dataPermuted(i));
end
%invert the index permutation
dataInversePermuted(permIndex)=dataPermuted;
我用暂停来模拟不同的计算时间。
答案 1 :(得分:1)
我不认为这在任何地方都有记录,但您可以快速推断出PARFOR以反向循环顺序运行迭代(如果您想要查看它,请使用pause
和disp
)。所以,你应该简单地扭转你的循环。 PARFOR无法明确控制执行顺序,但使用for-drange的SPMD确实如此(虽然PARFOR更容易使用)。
@ denahiro的建议也很好。