在MATLAB中并行执行

时间:2015-08-20 08:48:51

标签: matlab parallel-processing execution

我是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。 还有一个问题,我可以向计算机中的每个工作人员发送相同的功能吗?

提前谢谢你 阿马尔

1 个答案:

答案 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倍!