一般信息
很多功能隐式多线程内置,使.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必须检查每个内核正在做什么,并确保每个循环迭代只执行一次,并且数据被放入正确的存储位置。