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