在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
答案 0 :(得分:4)
如果您未使用matlabpool
保留工作人员池,则parfor
仅行为就像for
循环一样,因为它会在客户端上执行循环串行而不是并行。 但是,它与for
循环不同。这是一个简单的例子来说明(在不打开池的情况下运行):
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
需要对正确的数组切片进行额外的检查,索引等等,discussed in this answer这些将会让你失望。