我是MATLAB的新手,我只是尝试执行一个并行的小程序,但问题是并行执行需要比串行执行更多的时间?
close all
clear all
clc
a= rand(1e6,1);
b= rand(1e6,1);
c= zeros(size(a));
d= ones(size(c));
e= zeros(size(d));
tic
tstart=tic;
for i=1:length(a)
c(i)=a(i)+b(i);
d(i)=c(i)+b(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
e(i)=d(i)+c(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
c(i)=a(i)+b(i);
d(i)=c(i)+b(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
e(i)=d(i)+c(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
c(i)=a(i)+b(i);
d(i)=c(i)+b(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
e(i)=d(i)+c(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
end
t_normal_for=toc(tstart)
tstart=tic;
parfor i=1:length(a)
c(i)=a(i)+b(i);
d(i)=c(i)+b(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
e(i)=d(i)+c(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
c(i)=a(i)+b(i);
d(i)=c(i)+b(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
e(i)=d(i)+c(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
c(i)=a(i)+b(i);
d(i)=c(i)+b(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
e(i)=d(i)+c(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
end
t_parfor=toc(tstart)
***************************************
t_normal_for =
0.3860
t_parfor =
2.8403
任何人都可以帮忙!事实上,我的计算机中有4名工人,MATLAB的版本是R2014a。 还有一个问题,我可以向计算机中的每个工作人员发送相同的功能吗?
提前谢谢你 阿马尔
答案 0 :(得分:5)
你有一个大问题:你的代码是......糟糕的(没有冒犯)。实际上它的代码并不错,它不是你在Matlab中编写代码的方式。
你正在编写Matlab代码,因为它是C,而matlab不是C!在Matlab中,c=a+b;
是1e6 x 1
。它的速度更快,因为Matlab经过优化可以完成矢量化。
在考虑优化代码之前,请尝试以“Matlab风格”编写代码。
第二个问题:了解并行计算。
并行计算在您遇到巨大问题时会起作用,这些问题可能需要几分钟,或者很可能需要几个小时,并且您希望将它们分成更小的部分。它的工作方式是将大量工作发送到不同的处理器。与计算相比,向每个处理器发送信息需要 A LOT 。并行计算实用的原因是因为通常解决的问题计算成本太高,以至于你不介意在发送和接收内存块上花费一些额外的时间。
a(i)-f(i)
矩阵绝对不是一个大问题,因此不适合并行计算。特别是,如果你正在做的是15个数学运算!!
您的并行计算代码很可能需要99%的时间将tic
c =a +b ;
d =c +b .*a +b ./a +b .*a +b ;
e =d +c .*a +b ./a +b .*a +b ;
c =a +b ;
d =c +b .*a +b ./a +b .*a +b ;
e =d +c .*a +b ./a +b .*a +b ;
c =a +b ;
d =c +b .*a +b ./a +b .*a +b ;
e =d +c .*a +b ./a +b .*a +b ;
toc
tic
for i=1:length(a)
c(i)=a(i)+b(i);
d(i)=c(i)+b(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
e(i)=d(i)+c(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
c(i)=a(i)+b(i);
d(i)=c(i)+b(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
e(i)=d(i)+c(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
c(i)=a(i)+b(i);
d(i)=c(i)+b(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
e(i)=d(i)+c(i)*a(i)+b(i)/a(i)+b(i)*a(i)+b(i);
end
发送给每个工作人员,并且1%的时间用于数学运算。因此,你正在使你的代码变慢,因为你正在移动大量的内存来进行几次乘法运算!
编辑:当我说你的代码不好时,我的意思是什么?
简单示例:编写代码矢量化并编写代码并比较时间
Elapsed time is 0.016057 seconds.
Elapsed time is 0.288870 seconds.
结果:
-a --delete --numeric-ids --relative --delete-excluded --compress-level=5 --stats
同样的事情。矢量化代码仍然快18倍!