什麼時候使用 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
而言,總時間顯著下降。