数据通信对并行循环的影响
Matlab执行并行循环绝不是将关键字由for改为parfor这么简单。在应用并行运算是必须要考虑数据通信的影响。当数据通信问题处理不当时,并行运算的效率会远远低于预期。
for循环与parfor循环执行相同的操作,通过循环需要的数据在循环外和循环内生成,从而看出数据通信对并行循环的影响。
1、影响较大的情况
function [t1 t2]=partry27(m)
n=10^6;
a=rand(m,n);
display(strcat('datasize:',num2str(m*n/1024/1024),'M doubles'));
mypool=parpool;
tic
parfor k=1:n
b1(k)=sum(sqrt(a(:,k)));
end
t1=toc;
display(strcat('parfor:',num2str(t1),'s'));
delete(mypool)
tic
b2=zeros(n,1);
for k=1:n
b2(k)=sum(sqrt(a(:,k)));
end
t2=toc;
display(strcat('for:',num2str(t2),'s'));
运行结果
2.影响较小的情况
function [t1,t2]=partry28(N,M)
data=cell(1,N);
for kk=1:N
data{kk}=rand(M);
end
display(strcat('datasize:',num2str(N*M*M/1024/1024),'M doubles'));
mypool=parpool;
tic;
parfor ii=1:N
c1(:,ii)=eig(data{ii});
end
t1=toc;
display(strcat('parfor:',num2str(t1),'seconds'));
delete(mypool)
tic;
for ii=1:N
c1(:,ii)=eig(data{ii});
end
t2=toc;
display(strcat('for:',num2str(t2),'seconds'));
运行结果
由此可以看出,for循环与parfor循环执行相同的操作,循环需要的数据在循环外时,parfor循环执行效果不如for(for不涉及到数据传递)。