用于Matlab循环和批处理的parfor循环

时间:2014-05-27 20:16:01

标签: performance matlab parallel-processing batch-processing parfor

我想在 Matlab 中使用并行计算工具箱,我搜索了很多以获得相关知识,我看到了关于parforfor循环比较的常见查询,parfor很慢,但是,我得到了开始使用/不使用matlabpool/parpool的常见原因。

在这里我总结了最终的代码,但它仍然太慢,我无法知道这个的原因。我很奇怪, Mathswork 已经很好地记录了这个问题。 通过启动和停止parfor条件来启动 PCT 尤其是Batch Processingpool的任何建议,以及有多少关于操作的工作人员

我的代码:

matlabpool open
tic ; parfor i=1:4, disp(['myid is ' num2str(labindex) '; i = ' num2str(i)]),end 
toc;
tic ; for i=1:4, disp(['myid is ' num2str(labindex) '; i = ' num2str(i)]),end 
toc;
matlabpool close
Starting matlabpool using the 'local' profile ... connected to 2 workers.
myid is 1; i = 2
myid is 1; i = 1
myid is 1; i = 3
myid is 1; i = 4
Elapsed time is 2.974505 seconds.
myid is 1; i = 1
myid is 1; i = 2
myid is 1; i = 3
myid is 1; i = 4
Elapsed time is 0.010254 seconds.
Sending a stop signal to all the workers ... stopped.

编辑1:

我也看到了嵌套循环的线性化,我检查了但是它与普通for循环相比也很慢

tic;
for a=1:4
    for b=1:5
        f(a)=sum(a,b);
    end
end
toc;
tic;
iterations=[5,4];
for ix=1:prod(iterations)
    [b,a]=ind2sub(iterations,ix);
    f(a)=sum(a,b);
end
toc;
Elapsed time is 0.013108 seconds.
Elapsed time is 0.017800 seconds.

编辑2:

我想要并行运行的代码。

parfor ii = 1:1000
   p{ii,1}= [2 5 4; 5 4 6;]; %suppose very big matrix
   pp{ii,1}=p{ii,1}*2;
   for jj = 1:100
      p1{jj,1} = p{ii}* pp{ii};
      p2{jj} = p{ii}* pp{ii}*p1{jj};
      p3{jj} = p{ii}* pp{ii}*p1{jj}*p2{ii};
   end
   Data(ii).data=([pp(ii,:),p1{:,1},p2,p3;])' ; %#'
   Data(ii).label=cellfun(@(x) ['label' num2str(ii)] , num2cell(1:length(pp)+length(p1)+length(p2)+length(p3))', 'UniformOutput', false);
end

1 个答案:

答案 0 :(得分:1)

parfor的时间有关...... 3秒非常慢。您应该尝试多次运行此代码以查看第一次是否特别长(与常规for循环相比,我希望看到.1或.05秒或更短)。

但是,我主要担心的是你真的需要在循环中做大量工作才能从parfor获得任何加速。考虑做一个非常大的fft(...)或矩阵分解,每个分解大约需要0.5-3.0秒。然后你应该开始看到一些改进。对于2名工人来说,1.5-1.75的改进会很好。

您也可以考虑在disp内限制parfor的使用,以避免可能对控制台产生竞争。

最后,在做基准测试时,确保在工作时不要运行很多其他程序。我注意到一些网页可能会因为需要相当多的CPU而大大降低基准性能。但总的来说,这些时间真的很慢 - 但尤其是parfor