0

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

所以我知道哪些迭代是慢的。我怎样才能使核心之间的工作量更加均匀。例如,以某种方式强制所有实验室开始研究前四个慢速的,然后按顺序进行?或类似的东西,以防止只有一个活动核心单独运行几个慢速核心..

4

2 回答 2

2

Matlab parfor does nothing more but split up the indices and distributes them to the workers. It does this by creating contiguous chunks from the indices. I don't know the exact algorithm but this means that data with similar indices get computed in the same chunk and by the same worker.

The simplest solution would be a stochastic one. Just shuffle your indices so that the work intensive steps are distributed nicely. While this doesn't give you any guarantees on performance it is simple and will work most of the time.

Some example code:

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

I used pause to simulate the different computation times.

于 2012-07-04T10:11:44.233 回答
1

我认为这在任何地方都没有记录,但是您可以快速推断出 PARFOR 以反向循环顺序运行迭代(使用pause并且disp如果您想看到它在运行中)。所以,你应该简单地反转你的循环。PARFOR 无法让您显式控制执行顺序,但使用for-drange 的SPMD可以(尽管 PARFOR 更容易使用)。

@denahiro 的建议也不错。

于 2012-07-04T13:12:01.427 回答