我有一个parfor循环通过说100次迭代,每个迭代的工作量是不同的,但线性变化的方式,第一个花费最多的时间和最后一个是最快的。但是当我用我的四个实例/实验室运行parfor循环时,在最近几个小时内只有一个实验室处于活动状态,因为它正在通过它自己的几个第一次迭代运行。Matlab的parfor工作分配
所以我知道哪些迭代是慢的。我怎样才能让内核之间的工作量更均匀。例如,不知何故,迫使所有实验室开始研究前四个缓慢的实验,然后按顺序进行?或类似的东西,以防止只有一个活动的核心运行少数慢单独..
我有一个parfor循环通过说100次迭代,每个迭代的工作量是不同的,但线性变化的方式,第一个花费最多的时间和最后一个是最快的。但是当我用我的四个实例/实验室运行parfor循环时,在最近几个小时内只有一个实验室处于活动状态,因为它正在通过它自己的几个第一次迭代运行。Matlab的parfor工作分配
所以我知道哪些迭代是慢的。我怎样才能让内核之间的工作量更均匀。例如,不知何故,迫使所有实验室开始研究前四个缓慢的实验,然后按顺序进行?或类似的东西,以防止只有一个活动的核心运行少数慢单独..
Matlab parfor没有什么更多,但拆分索引和分发给他们的工人。它通过从索引创建连续的块来完成此操作。我不知道确切的算法,但这意味着具有相似索引的数据在同一个块和同一个worker中计算。
最简单的解决方案将是一个随机的解决方案。只需对您的指数进行洗牌,这样工作密集的步骤就可以很好地分配。虽然这不能为您提供任何性能保证,但它很简单,并且大部分时间都可以使用。
一些示例代码:
% 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;
我使用暂停来模拟不同的计算时间。
“因此,worker1会用i1 = 1:100和worker2 i2 = 101:200压缩一切。” - 你从哪里获取这些信息?它似乎与[以前链接的问题]中的答案相矛盾(http://stackoverflow.com/questions/9937200/matlab-parallel-computing-toolbox-dynamic-allocation-of-work-in-parfor-loops/9939455# 9939455)。 –
@ arne.b这是真的matlab并没有真的把它分割成这样。我的观点是,指数范围被分割成连续的大块。如果所有时间密集型步骤彼此接近,则它们将处于相同块中的可能性很大。我会更新答案。 – denahiro
我不认为这是记录在任何地方,但你可以快速推断出PARFOR以反向循环顺序运行迭代(如果你想看到它在运行中使用pause
和disp
)。所以,你应该简单地扭转你的循环。 PARFOR不给你明确控制执行顺序的方法,但使用for-drange的SPMD确实(PARFOR虽然明显易于使用)。
@ denahiro的建议也是一个很好的建议。
我认为答案http://stackoverflow.com/questions/9937200/matlab-parallel-computing-toolbox-dynamic-allocation-of-work-in-parfor-loops/9939455#9939455可能感兴趣给你。 –
我认为[@Edric](http://stackoverflow.com/a/9938666/97160)在链接问题中给出了一个提示:“大致来说,PARFOR以相反的顺序执行循环迭代,因此您可以将它们置于”结束“的循环,所以立即开始他们工作# – Amro
@HighPerormanceMark:这应该被视为重复? – Amro