2

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

到这里我总结了最后的代码,但是还是太慢了,不知道是什么原因。我很奇怪Mathswork没有很好地记录这个问题。关于特别是启动PCTparfor以及Batch Processing启动和停止条件的任何建议,以及pool有多少关于操作的足够工人

我的代码:

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
4

1 回答 1

1

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

但是,我主要担心的是,您确实需要在循环内做大量工作才能从parfor. 考虑做一个非常大的fft(...)或矩阵分解,每个分解大约需要 0.5-3.0 秒。然后你应该开始看到一些改进。如果有 2 个工人,1.5-1.75 的改进会很好。

您还可以考虑限制使用dispinsideparfor以避免可能的控制台竞争。

最后,在进行基准测试时,请确保在工作时不要运行很多其他程序。我注意到一些网页需要相当多的 cpu 会大大降低基准性能。但总的来说,这些时间真的非常慢——但尤其是parfor.

于 2014-05-27T20:25:46.887 回答