什么时候使用 parfor
基本上,在两种情况下推荐使用 parfor
:循环中的大量迭代(例如,像 1e10
),或者每次迭代需要很长时间(例如,eig(magic(1e4))
)。在第二种情况下,你可能需要考虑使用 spmd
。parfor
比短距离或快速迭代的 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
而言,总时间显着下降。