2015-08-20 68 views
0

我是MATLAB新手,我只是试着执行一个并行的小程序,但问题是并行执行需要比串行更多的时间吗?在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

你在哪里打开你的并行池?打开一个需要大约2秒,如果这包括在parfor时间林没有惊讶它需要更长的时间。 – Adriaan

+0

我只是运行相同的代码,它给了我相同的结果,以及在执行代码之前打开我的并行池时。 数组a和b可能首先发送给所有工作人员,因此可以复制数据四次,然后完成操作,然后必须将数组c,d和e收集到客户端。开销很大。 – Adriaan

回答

5

您有1个大问题:您的代码....坏的(无犯罪)。它的代码实际上不错,它不是你在Matlab中编写代码的方式。

你正在写的Matlab代码,因为它如果是C,而matlab不是C!在Matlab中,c(i)=a(i)+b(i)c=a+b;。它的速度更快,因为Matlab已经过优化,可以实现矢量化。

在考虑优化你的代码之前,试着用“Matlab风格”来编写它。

第二个问题:了解并行计算。

并行计算适用于存在巨大问题时,需要几分钟或几小时的时间,并且希望将它们拆分为更小的部分。它的工作方式是将大量工作发送给不同的处理器。与计算相比,将信息发送到每个处理器需要时间A LOT。并行计算的实际原因是因为通常解决的问题在计算上非常昂贵,您不介意花费一些额外的时间来发送和接收内存块。

A 1e6 x 1矩阵定义为不是是个大问题,因此不适合并行计算。特别是,如果你正在做的是15数学运算!

很可能您的并行计算代码需要99%的时间将a(i)-f(i)发送给每位工作人员,并且1%的时间进行数学计算。因此,你正在让你的代码变得更慢,因为你正在移动大量内存来进行几次乘法运算!

编辑:当我说你的代码不好时,我的意思是什么?

简单的例子:编写代码矢量和你写的和比较的时间

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 

结果:

Elapsed time is 0.016057 seconds. 
Elapsed time is 0.288870 seconds. 

做同样的事情。矢量化代码仍然快18倍!

+0

嗨安德,非常感谢你的回答。 – ammar

+0

@ammaralabdalazeez快乐,你喜欢它!考虑接受它,如果它帮助你 –

+0

Ander,实际上,我只是想看到在MATLAB中的串行和并行执行之间的差异, – ammar