2012-07-04 131 views
0

我有一个parfor循环通过说100次迭代,每个迭代的工作量是不同的,但线性变化的方式,第一个花费最多的时间和最后一个是最快的。但是当我用我的四个实例/实验室运行parfor循环时,在最近几个小时内只有一个实验室处于活动状态,因为它正在通过它自己的几个第一次迭代运行。Matlab的parfor工作分配

所以我知道哪些迭代是慢的。我怎样才能让内核之间的工作量更均匀。例如,不知何故,迫使所有实验室开始研究前四个缓慢的实验,然后按顺序进行?或类似的东西,以防止只有一个活动的核心运行少数慢单独..

+3

我认为答案http://stackoverflow.com/questions/9937200/matlab-parallel-computing-toolbox-dynamic-allocation-of-work-in-parfor-loops/9939455#9939455可能感兴趣给你。 –

+1

我认为[@Edric](http://stackoverflow.com/a/9938666/97160)在链接问题中给出了一个提示:“大致来说,PARFOR以相反的顺序执行循环迭代,因此您可以将它们置于”结束“的循环,所以立即开始他们工作# – Amro

+0

@HighPerormanceMark:这应该被视为重复? – Amro

回答

2

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; 

我使用暂停来模拟不同的计算时间。

+0

“因此,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)。 –

+0

@ arne.b这是真的matlab并没有真的把它分割成这样。我的观点是,指数范围被分割成连续的大块。如果所有时间密集型步骤彼此接近,则它们将处于相同块中的可能性很大。我会更新答案。 – denahiro

1

我不认为这是记录在任何地方,但你可以快速推断出PARFOR以反向循环顺序运行迭代(如果你想看到它在运行中使用pausedisp)。所以,你应该简单地扭转你的循环。 PARFOR不给你明确控制执行顺序的方法,但使用for-drange的SPMD确实(PARFOR虽然明显易于使用)。

@ denahiro的建议也是一个很好的建议。