一般信息
很多功能隱式多線程內置,使.parfor
當使用這些函數時,循環效率不會比串行函數高。for
循環,因為所有的核心都已經被使用了。parfor
在這種情況下實際上是一種損害,因為它具有分配開銷,同時與您試圖使用的函數是并行的。
當不使用隱式多線程函數之一時parfor
基本上建議在兩種情況下進行迭代:循環中的大量迭代(例如,1e10
),或者每次迭代需要很長的時間(例如,eig(magic(1e4))
)。在第二種情況下,您可能需要考慮使用spmd
(比parfor
根據我的經驗)。原因parfor
比for
循環用于短期或快速迭代是正確管理所有工作人員所需的開銷,而不僅僅是進行計算。
查帳這個問題有關在不同員工之間拆分數據的信息。
標桿
電碼
請考慮下面的示例來查看for
相對于parfor
..如果您還沒有打開并行池,那么首先打開它:
gcp; % Opens a parallel pool using your current settings
然后執行幾個大循環:
n = 1000; % Iteration numberEigenValues = cell(n,1); % Prepare to store the dataTime = zeros(n,1);for ii = 1:ntic
EigenValues{ii,1} = eig(magic(1e3)); % Might want to lower the magic if it takes too longTime(ii,1) = toc; % Collect time after each iterationendfigure; % Create a plot of resultsplot(1:n,t)title 'Time per iteration'ylabel 'Time [s]'xlabel 'Iteration number[-]';
然后用同樣的方法parfor
而不是for
..您會注意到,每次迭代的平均時間會增加(我的情況是0.27s到0.39s)。但是要意識到parfor
使用所有可用的工人,因此總時間(sum(Time)
)必須除以計算機中的核數。因此,就我的情況而言,總時間從大約270秒下降到了49秒,因為我有一個八進制處理器。
因此,當每次單獨迭代的時間增加時,使用parfor
關于使用for
,總時間大大減少了。
結果
這張照片顯示了測試的結果,因為我只是在我的家庭PC上運行它。我用n=1000
和eig(500)
我的電腦有一個i5-750 2.66GHz處理器,有四個核,運行MATLABR201a。正如您所看到的,并行測試的平均值在0.29s左右徘徊,并且有很大的擴展,而串行代碼在0.24s左右相當穩定。然而,總時間從234秒下降到72秒,速度提高了3.25倍。這并不完全是4的原因是內存開銷,如每次迭代所需的額外時間所表示的那樣。內存開銷是由于MATLAB必須檢查每個內核正在做什么,并確保每個循環迭代只執行一次,并且數據被放入正確的存儲位置。