为了账号安全,请及时绑定邮箱和手机立即绑定

请问使用Parfor节省时间和内存?

请问使用Parfor节省时间和内存?

FFIVE 2019-08-03 11:03:15
使用Parfor节省时间和内存?考虑prova.mat在MATLAB中得到如下方法for w=1:100     for p=1:9             A{p}=randn(100,1);      end     baseA_.A=A;     eval(['baseA.A' num2str(w) '= baseA_;'])endsave(sprintf('prova.mat'),'-v7.3', 'baseA')若要了解数据中的实际维度,1x9 cell在……里面A1由以下内容组成9阵列:904x5, 913x5, 1722x5, 4136x5, 9180x5, 3174x5, 5970x5, 4455x5, 340068x5..另一个Aj有相似的成分。考虑以下代码clear allload provaticparfor w=1:100        indA=sprintf('A%d', w);        Aarr=baseA.(indA).A;        Boot=[];        for p=1:9            C=randn(100,1).*Aarr{p};            Boot=[Boot; C];          end        D{w}=Boot;endtoc如果我运行parfor环带4本地工人在我的Macbook Pro,它需要1.2秒。顶替parfor带着for需要0.01秒。根据我的实际数据,时间差是3秒对7秒[矩阵的创建]。C也比较复杂]。如果理解正确,问题是计算机必须发送baseA对于每个本地员工来说,这需要时间和记忆。你能提出一个解决办法吗?parfor比for?我以为把所有的细胞保存在baseA是一种节省时间的方法,一开始就加载一次,但也许我错了。
查看完整描述

2 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

一般信息

很多功能隐式多线程内置,使.parfor当使用这些函数时,循环效率不会比串行函数高。for循环,因为所有的核心都已经被使用了。parfor在这种情况下实际上是一种损害,因为它具有分配开销,同时与您试图使用的函数是并行的。

当不使用隐式多线程函数之一时parfor基本上建议在两种情况下进行迭代:循环中的大量迭代(例如,1e10),或者每次迭代需要很长的时间(例如,eig(magic(1e4)))。在第二种情况下,您可能需要考虑使用spmd(比parfor根据我的经验)。原因parforfor循环用于短期或快速迭代是正确管理所有工作人员所需的开销,而不仅仅是进行计算。

查帐这个问题有关在不同员工之间拆分数据的信息。

标杆

电码

请考虑下面的示例来查看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=1000eig(500)我的电脑有一个i5-750 2.66GHz处理器,有四个核,运行MATLABR201a。正如您所看到的,并行测试的平均值在0.29s左右徘徊,并且有很大的扩展,而串行代码在0.24s左右相当稳定。然而,总时间从234秒下降到72秒,速度提高了3.25倍。这并不完全是4的原因是内存开销,如每次迭代所需的额外时间所表示的那样。内存开销是由于MATLAB必须检查每个内核正在做什么,并确保每个循环迭代只执行一次,并且数据被放入正确的存储位置。


查看完整回答
反对 回复 2019-08-04
  • 2 回答
  • 0 关注
  • 367 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信