parfor比没有启动matlabpool时慢得多

时间:2011-09-14 03:58:02

标签: matlab

在matlab的文档中,据说如果没有启动matlabpool,那么parfor将被解释为

这意味着它们和其他人一样有效

然而,在我的下面的代码中,我发现parfor的速度比。

慢6倍

===================================

  clear all; close all; clc; tic 

  Nx=10;   Ny=10; 
   plist=0.05:0.05:0.95; 
  linked_list=zeros(1,length(plist)); 

 num_sample=20000; 
 % matlabpool open 3 
parfor sss=1:length(plist) 
sss 
p=plist(sss); 

numlink=0; 
for s10=1:num_sample 
    pattern=(rand(Ny,Nx)<p); 
    pattern2=zeros(Ny,Nx); 

    new=zeros(2,10000); 
    new2=zeros(2,10000); 
    num_new=0; 
    num_new2=0; 

    flag=0; 
    found=0; 
    s=0; 
    while (found==0)&&(s<Nx) 
        s=s+1; 
        if (pattern(1,s)==1)&&(pattern2(1,s)==0); 
            flag=flag+1; 

            pattern2(1,s)=flag; 

            num_new=1; 
            new(1,1)=s; 
            new(2,1)=1; 
            num_new2=0; 

            while num_new>0 
                num_new2=0; 
                for s1=1:num_new 
                    x=new(1,s1); 
                    y=new(2,s1); 
                    if (x-1>0)&&(pattern(y,x-1)==1)&&(pattern2(y,x-1)~=flag) 
                        num_new2=num_new2+1; 
                        new2(1,num_new2)=x-1; 
                        new2(2,num_new2)=y; 
                        pattern2(y,x-1)=flag; 
                    end 
                    if (x+1<=Nx)&&(pattern(y,x+1)==1)&&(pattern2(y,x+1)~=flag) 
                        num_new2=num_new2+1; 
                        new2(1,num_new2)=x+1; 
                        new2(2,num_new2)=y; 
                        pattern2(y,x+1)=flag; 
                    end 
                    if (y-1>0)&&(pattern(y-1,x)==1)&&(pattern2(y-1,x)~=flag) 
                        num_new2=num_new2+1; 
                        new2(1,num_new2)=x; 
                        new2(2,num_new2)=y-1; 
                        pattern2(y-1,x)=flag; 
                    end 
                    if (y+1<=Ny)&&(pattern(y+1,x)==1)&&(pattern2(y+1,x)~=flag) 
                        num_new2=num_new2+1; 
                        new2(1,num_new2)=x; 
                        new2(2,num_new2)=y+1; 
                        pattern2(y+1,x)=flag; 
                    end 
                end 

                num_new=num_new2; 
                new(:,1:num_new)=new2(:,1:num_new); 

                if max(new(2,1:num_new))==Ny 
                    found=1; 
                    break; 
                end 
            end 
        end 
    end 
    numlink=numlink+found; 
 end 
 linked_list(sss)=numlink/num_sample; 
 end 


  plot(plist,linked_list,'*') 

  toc 

1 个答案:

答案 0 :(得分:4)

如果您未使用matlabpool保留工作人员池,则parfor行为就像for循环一样,因为它会在客户端上执行循环串行而不是并行。 但是,它与for循环不同。这是一个简单的例子来说明(在不打开池的情况下运行):

Parfor循环:

parfor i=0:9
    fprintf('%u',i)
end

OUTPUT --> 9876543210

For循环:

for i=0:9   
    fprintf('%u',i)
end
OUTPUT --> 0123456789

您可以很容易地看到执行顺序与我在parfor中指定的顺序不同。

你是正确的parfor明显慢于for(我的速度慢了6倍)这是因为parfor需要对正确的数组切片进行额外的检查,索引等等,discussed in this answer这些将会让你失望。