什么时候使用 parfor

基本上,在两种情况下推荐使用 parfor :循环中的大量迭代(例如,像 1e10),或者每次迭代需要很长时间(例如,eig(magic(1e4)))。在第二种情况下,你可能需要考虑使用 spmdparfor 比短距离或快速迭代的 for 循环慢的原因是正确管理所有工作人员所需的开销,而不是仅仅进行计算。

此外,许多函数都内置了隐式多线程 ,使得 parfor 循环在使用这些函数时不会比串行 for 循环更有效,因为所有核心都已被使用。parfor 在这种情况下实际上是有害的,因为它具有分配开销,同时与你尝试使用的功能并行。

请考虑以下示例来查看 for 的行为,而不是 parfor 的行为。首先打开并行池,如果你还没有这样做:

gcp; % Opens a parallel pool using your current settings

然后执行几个大循环:

n = 1000; % Iteration number
EigenValues = cell(n,1); % Prepare to store the data
Time = zeros(n,1);
for ii = 1:n
tic
    EigenValues{ii,1} = eig(magic(1e3)); % Might want to lower the magic if it takes too long
Time(ii,1) = toc; % Collect time after each iteration
end

figure; % Create a plot of results
plot(1:n,t)
title 'Time per iteration'
ylabel 'Time [s]'
xlabel 'Iteration number[-]';

然后用 parfor 而不是 for 做同样的事情。你会注意到每次迭代的平均时间会增加。但是要意识到 parfor 使用了所有可用的工作者,因此总时间(sum(Time))必须除以计算机中的核心数。

因此,虽然使用 parfor 进行每次单独迭代的时间相对于使用 for 而言,总时间显着下降。