caoer 发表于 2010-5-12 05:25:17

matlab 并行计算速成方法

本帖最后由 caoer 于 2010-5-11 16:30 编辑

前阵子试了一下并行计算matlab,还是非常惊讶与并行效率的。
特来给大家分享,非常简单。

1. 必须是matlab2008a或以后版本。
2. 在matlab 命令行下敲入 > matlabpool open local 4
这里的4表示4个cpu或者core
3. 把程序 test.m 里面的 最外层的for循环 改为 parfor,保存
4. 在命令行下键入 > test
完毕!

matlab很多瓶颈是在for循环上,使用parfor以后,效率大幅提升,还是很有用处的。
推荐!!!

附件是ppt简易教程,非常实用。

bluerain09 发表于 2010-5-12 08:10:58

能提高simulink的计算速度吗?

feynmand 发表于 2010-5-12 09:16:38

parfor的使用貌似只能是对可以并行的循环来进行的,每次循环之间并没有因果关系,是并列关系,这样并行的结果才显著。如果是第二轮循环需要使用第一轮的结果,那么效果应该不怎么明显的。

caoer 发表于 2010-5-12 10:17:59

matlab并行局限性是有的,对于简单循环的问题,可以并行很快出结果,减少等待时间,尤其是在优化参数的时候还是很不错的。
当然真正好的并行程序还是用mpich2来做比较好。

feynmand 发表于 2010-5-13 11:43:20

在了解了parfor的加速使用情况之后可以更好的进行并行计算。但是有个问题需要考虑,既然循环过程中不需要使用上次循环的结果,也就是说一般情况下这种循环都是可以通过matlab向量化的方法来处理的,这样去掉循环也可以提高效率。同时再使用并行计算可能效果更好。因为我没做过这个比较,具体的速度不了解。

caoer 发表于 2010-5-14 01:45:00

恩,楼上说的很对,我测试了一个很简单的图像处理的例子,两个大循环,里面套有if-elseif-statement的判断,提速效果还是很明显的。当然测试的是一个简单问题,复杂问题需要复杂对待。

huangyunping986 发表于 2010-5-20 14:30:33

谢谢谢谢谢谢

pasuka 发表于 2010-5-21 22:38:34

本帖最后由 pasuka 于 2010-11-13 22:26 编辑

前阵子试了一下并行计算matlab,还是非常惊讶与并行效率的。
特来给大家分享,非常简单。

1. 必须是matlab2008a或以后版本。
2. 在matlab 命令行下敲入 > matlabpool open local 4
这里的4表示4个cpu或者core
...
caoer 发表于 2010-5-12 05:25 http://forum.simwe.com/images/common/back.gif
得不偿失
机器配置
intel Q8200 四核
RAM 4G
OS XP SP3 32bit
Matlab2009b
首先,开启matlabpool就需要6-7秒钟的时间;
其次,对于简单的循环,直接写成向量形式,某些for循环,matlab会进行优化,自动并行的
最后,不是所有for循环都可以改写成parfor,编辑器会报错的
*********************************************************************************
更正下上述结论,对于大规模的计算,精心修改后parfor的计算效率提升是相当明显的,对于4核cpu的主机来说,在4核全开的情况下,加速比可以提升到3到3.5左右,性价比非常高,相较于MPI/OpenMP来说的话    ------------13/11/2010

fengzhou85 发表于 2010-7-6 16:36:15

多谢斑竹!

Minos 发表于 2010-11-13 10:26:26

十分感谢分享,个人感觉对parfor的工作原理不清楚,所以只能通过具体的实践检验效果了,另,mpich2又是怎么回事呢?

pasuka 发表于 2010-11-13 22:21:40

matlab并行局限性是有的,对于简单循环的问题,可以并行很快出结果,减少等待时间,尤其是在优化参数的时候还是很不错的。
当然真正好的并行程序还是用mpich2来做比较好。
caoer 发表于 2010-5-12 10:17 http://forum.simwe.com/images/common/back.gif
从最近2、3礼拜使用下来看:
1、parfor对于多层嵌套for循环的效果欠佳,就连matlab自带的例子,也就是二层嵌套,将内层改成parfor。问题可能在于,目前的parfor只能用于最内层的循环,而每次开启并行,分配任务都需要时间,如果本身内层循环的计算很小的话,显然是得不偿失;实际使用下来,对于四层嵌套的for循环,最内层改成parfor,计算效率显著降低,改最头三层为parfor,直接提示错误。通过修改算法,将4层循环改成1层parfor循环后,效率大幅度提升
2、以如下代码为例:
A=rand(10000,1);
B=A;
C=A;
parfor k = 1:10000
      C(k)=A(k)*3+B(k)*A(k);
end
若是4核的cpu,开启四个matlab程序进程,外加一个matlab主进程,矩阵A、B、C应该会在内存中会复制4份!!!因为本身的并行线程分配控制什么的,matlab调用了java,具体如何实现的尚不清楚,推测就是因为数据无关,循环次数确定,那么按照开启的matlabpool数目,进行平均或者动态分配,再有一个主线程监控,由于语法规则比OpenMP还要简化,那么很有可能矩阵ABC在每个进程中都被完整的复制一份。。。
如果是32位的系统,上例中的ABC三个矩阵,显然不宜开得过大

xjtuluo 发表于 2011-11-3 11:40:04

本帖最后由 xjtuluo 于 2011-11-3 11:42 编辑

使用matlab的parfor并行之后,记得并行完了之后用matlabpool close 关闭并行环境,否则后续的串行操作容易出错!
我用parfor测试一个100000个点离散数据的DFT变换,还是体现了并行的效率,值得推荐!下午是我比较的结果:
Starting matlabpool using the 'local' configuration ... connected to 4 labs.
Sending a stop signal to all the labs ... stopped.
Elapsed time is 251.206846 seconds.
Elapsed time is 327.499550 seconds.
打开了四个核,并行用了251.20s,串行花了327.50s,发现启动并行环境花费的时间还是很大的。难怪并行计算中通信的时间常常比计算消耗程度要大!所有计算时间本身不大的不建议这么用了,串行的效果会更好~~
附上DFT的部分代码:
tic
matlabpool open local 4
parfor k=0:N-1
    w=-2*pi*n*k/N;
    wcos=cos(w);
    wsin=sin(w);
    Xk(k+1)=xn*(wcos+j*wsin)';
end
matlabpool close
toc
Yk=xn*0;
tic
parfor k=0:N-1
    v=-2*pi*n*k/N;
    vcos=cos(v);
    vsin=sin(v);
    Yk(k+1)=xn*(vcos+j*vsin)';
end
toc

红鸟 发表于 2011-11-6 08:58:10

十分感谢,学习一下,试试

红鸟 发表于 2011-11-6 09:02:47

那双核四线程的cpu,> matlabpool open local 4,应该是输入哪个数啊

pasuka 发表于 2011-11-6 10:10:21

红鸟 发表于 2011-11-6 09:02 static/image/common/back.gif
那双核四线程的cpu,> matlabpool open local 4,应该是输入哪个数啊

直接matlabpool open,让matlab自动判断
双核四线程手动指定的话,只能matlabpool open local 2或1

红鸟 发表于 2011-11-11 23:42:16

pasuka 发表于 2011-11-6 10:10 static/image/common/back.gif
直接matlabpool open,让matlab自动判断
双核四线程手动指定的话,只能matlabpool open local 2或1 ...

呵呵,谢谢了

黄建波 发表于 2011-11-18 09:54:52

哎,7.0的没这个函数.....:'(

xukyle 发表于 2011-12-25 07:01:45

useful information about Parallel computation in Matlab...

blues-et 发表于 2011-12-25 20:19:26

恩,楼上说的很对

blues-et 发表于 2011-12-25 20:19:50

恩,楼上说的很对.
页: [1] 2
查看完整版本: matlab 并行计算速成方法