在MATLAB中并行执行

amm*_*mar 0 parallel-processing matlab 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
Run Code Online (Sandbox Code Playgroud)

谁能帮忙!事实上,我的计算机中有4名工人,MATLAB的版本是R2014a.请问另一个问题,我可以向计算机中的每个工作人员发送相同的功能吗?

提前谢谢Ammar

And*_*uri 5

你有一个大问题:你的代码是......糟糕的(没有冒犯).实际上它的代码并不错,它不是你在Matlab中编写代码的方式.

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

在考虑优化代码之前,尝试用"Matlab风格"编写代码.

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

并行计算在您遇到巨大问题时会起作用,这些问题可能需要几分钟,或者很可能需要几个小时,并且您希望将它们分成更小的部分.它的工作方式是将大量工作发送到不同的处理器.与计算相比,向每个处理器发送信息需要花费很多时间.并行计算实用的原因是因为通常解决的问题计算成本太高,以至于你不介意在发送和接收内存块上花费一些额外的时间.

1e6 x 1矩阵是definetly 不是一个大问题,因此不适合并行计算.特别是,如果你正在做的是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
Run Code Online (Sandbox Code Playgroud)

结果:

Elapsed time is 0.016057 seconds.
Elapsed time is 0.288870 seconds.
Run Code Online (Sandbox Code Playgroud)

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