Parfor намного медленнее, чем когда Matlabpool не запускается - PullRequest
1 голос
/ 14 сентября 2011

в документе 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 Ответ

4 голосов
/ 14 сентября 2011

Если вы не резервируете пул работников, использующих matlabpool, то parfor просто ведет себя как цикл for, поскольку он выполняет цикл на клиенте последовательно а не параллельно. Однако, это не то же самое, что for loop . Вот простой пример, чтобы проиллюстрировать (запустить без открытия пула):

Цикл Парфора:

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

OUTPUT --> 9876543210

Для цикла:

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

Вы можете легко видеть, что порядок выполнения отличается от того, что я указал в parfor.

Вы правы, что parfor значительно медленнее, чем for (я тоже получаю ~ 6 раз медленнее), и это потому, что parfor необходимо выполнить дополнительные проверки для правильного среза массива, индексации и т. Д. обсуждается в этом ответе , и это неизменно замедлит вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...