首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >parfor的速度比不使用matlabpool的时候慢得多。

parfor的速度比不使用matlabpool的时候慢得多。
EN

Stack Overflow用户
提问于 2011-09-14 03:58:02
回答 1查看 2.7K关注 0票数 1

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

这意味着它们之间的效率是一样的。

但是,在下面的代码中,我发现parfor比parfor慢6倍。

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

代码语言:javascript
复制
  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 
EN

回答 1

Stack Overflow用户

发布于 2011-09-14 04:58:23

如果您不使用matlabpool保留一个工人池,那么parfor的行为就像一个for循环,因为它在客户机上串行地而不是并行地执行循环。但是,for 循环循环并不相同。下面是一个简单的示例(运行时不打开池):

Parfor循环:

代码语言:javascript
复制
parfor i=0:9
    fprintf('%u',i)
end

OUTPUT --> 9876543210

循环:

代码语言:javascript
复制
for i=0:9   
    fprintf('%u',i)
end
OUTPUT --> 0123456789

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

正确的是,parforfor慢得多(我也慢了6倍),这是因为parfor需要对适当的数组切片、索引等进行额外检查,因为discussed in this answer和这些都会使您慢下来。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7411094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档