找回密码
 注册
Simdroid-非首页
查看: 738|回复: 24

matlab 并行计算速成方法

[复制链接]
发表于 2010-5-12 05:25:17 | 显示全部楼层 |阅读模式 来自 美国
本帖最后由 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简易教程,非常实用。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

发表于 2010-5-12 08:10:58 | 显示全部楼层 来自 安徽合肥
Simdroid开发平台
能提高simulink的计算速度吗?
回复 不支持

使用道具 举报

发表于 2010-5-12 09:16:38 | 显示全部楼层 来自 上海
parfor的使用貌似只能是对可以并行的循环来进行的,每次循环之间并没有因果关系,是并列关系,这样并行的结果才显著。如果是第二轮循环需要使用第一轮的结果,那么效果应该不怎么明显的。

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2010-5-12 10:17:59 | 显示全部楼层 来自 美国
matlab并行局限性是有的,对于简单循环的问题,可以并行很快出结果,减少等待时间,尤其是在优化参数的时候还是很不错的。
当然真正好的并行程序还是用mpich2来做比较好。
回复 不支持

使用道具 举报

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

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2010-5-14 01:45:00 | 显示全部楼层 来自 美国
恩,楼上说的很对,我测试了一个很简单的图像处理的例子,两个大循环,里面套有if-elseif-statement的判断,提速效果还是很明显的。当然测试的是一个简单问题,复杂问题需要复杂对待。

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-5-20 14:30:33 | 显示全部楼层 来自 广东广州
谢谢谢谢谢谢

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 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

得不偿失
机器配置
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

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-7-6 16:36:15 | 显示全部楼层 来自 陕西西安
多谢斑竹!

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-11-13 10:26:26 | 显示全部楼层 来自 浙江温州
十分感谢分享,个人感觉对parfor的工作原理不清楚,所以只能通过具体的实践检验效果了,另,mpich2又是怎么回事呢?
回复 不支持

使用道具 举报

发表于 2010-11-13 22:21:40 | 显示全部楼层 来自 浙江杭州
matlab并行局限性是有的,对于简单循环的问题,可以并行很快出结果,减少等待时间,尤其是在优化参数的时候还是很不错的。
当然真正好的并行程序还是用mpich2来做比较好。
caoer 发表于 2010-5-12 10:17

从最近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三个矩阵,显然不宜开得过大

评分

2

查看全部评分

回复 不支持

使用道具 举报

发表于 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

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-11-6 08:58:10 | 显示全部楼层 来自 北京邮电大学
十分感谢,学习一下,试试

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-11-6 09:02:47 | 显示全部楼层 来自 北京邮电大学
那双核四线程的cpu,> matlabpool open local 4,应该是输入哪个数啊
回复 不支持

使用道具 举报

发表于 2011-11-6 10:10:21 | 显示全部楼层 来自 上海长宁区
红鸟 发表于 2011-11-6 09:02
那双核四线程的cpu,> matlabpool open local 4,应该是输入哪个数啊

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

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-11-11 23:42:16 | 显示全部楼层 来自 北京邮电大学
pasuka 发表于 2011-11-6 10:10
直接matlabpool open,让matlab自动判断
双核四线程手动指定的话,只能matlabpool open local 2或1 ...

呵呵,谢谢了
回复 不支持

使用道具 举报

发表于 2011-11-18 09:54:52 | 显示全部楼层 来自 北京
哎,7.0的没这个函数.....:'(
回复 不支持

使用道具 举报

发表于 2011-12-25 07:01:45 | 显示全部楼层 来自 辽宁大连
useful information about Parallel computation in Matlab...

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-12-25 20:19:26 | 显示全部楼层 来自 新疆乌鲁木齐
恩,楼上说的很对
回复 不支持

使用道具 举报

发表于 2011-12-25 20:19:50 | 显示全部楼层 来自 新疆乌鲁木齐
  恩,楼上说的很对.
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-5-19 03:48 , Processed in 0.078254 second(s), 27 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表