一般信息
很多功能隱式多線程內(nèi)置,使.parfor
當(dāng)使用這些函數(shù)時,循環(huán)效率不會比串行函數(shù)高。for
循環(huán),因為所有的核心都已經(jīng)被使用了。parfor
在這種情況下實際上是一種損害,因為它具有分配開銷,同時與您試圖使用的函數(shù)是并行的。
當(dāng)不使用隱式多線程函數(shù)之一時parfor
基本上建議在兩種情況下進行迭代:循環(huán)中的大量迭代(例如,1e10
),或者每次迭代需要很長的時間(例如,eig(magic(1e4))
)。在第二種情況下,您可能需要考慮使用spmd
(比parfor
根據(jù)我的經(jīng)驗)。原因parfor
比for
循環(huán)用于短期或快速迭代是正確管理所有工作人員所需的開銷,而不僅僅是進行計算。
查帳這個問題有關(guān)在不同員工之間拆分?jǐn)?shù)據(jù)的信息。
標(biāo)桿
電碼
請考慮下面的示例來查看for
相對于parfor
..如果您還沒有打開并行池,那么首先打開它:
gcp; % Opens a parallel pool using your current settings
然后執(zhí)行幾個大循環(huán):
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)
)必須除以計算機中的核數(shù)。因此,就我的情況而言,總時間從大約270秒下降到了49秒,因為我有一個八進制處理器。
因此,當(dāng)每次單獨迭代的時間增加時,使用parfor
關(guān)于使用for
,總時間大大減少了。
結(jié)果
這張照片顯示了測試的結(jié)果,因為我只是在我的家庭PC上運行它。我用n=1000
和eig(500)
我的電腦有一個i5-750 2.66GHz處理器,有四個核,運行MATLABR201a。正如您所看到的,并行測試的平均值在0.29s左右徘徊,并且有很大的擴展,而串行代碼在0.24s左右相當(dāng)穩(wěn)定。然而,總時間從234秒下降到72秒,速度提高了3.25倍。這并不完全是4的原因是內(nèi)存開銷,如每次迭代所需的額外時間所表示的那樣。內(nèi)存開銷是由于MATLAB必須檢查每個內(nèi)核正在做什么,并確保每個循環(huán)迭代只執(zhí)行一次,并且數(shù)據(jù)被放入正確的存儲位置。