TA的每日心情 | 开心 2019-11-20 15:05 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
并行计算通用模型分享,适用所有for循环体的加速计算(转)2 h ^4 j0 ^: p" y
; g& }; {9 X9 n" }* ~5 Kmatlab利用多核心的计算能力来加速计算是非常有必要的,因为目前所有的电脑最少都双核芯了2 @$ e% {4 O/ C) Z2 i j$ C
打开matlab并行计算池的方法是:matlabpool,具体使用参考帮助文档/ q8 y. j! ~! w: v5 y) p
循环并行使用paRFor循环代替for循环,如果仔细读下文档,会发现parfor很不好用,当parfor循环体内的代码比较多时,非常容易不满足循环的条件而失败
; L8 n( @ P1 x) x F
( n9 g) y9 l* U. j# qparfor ss=1:1003 \* S c. \% ^8 X
xxx
: v" C3 M8 z# h1 k- ^% a.....
5 Z( C, }! ?( h+ I0 x0 J.....% D$ y4 S( h6 ]9 f. _2 \* j- u
end
0 }, v$ ~& x5 m) Y3 J" y4 w7 @: y+ e7 ?' ?* }: I
为此,提供一套通用计算模型,其基本思路是将循环体内代码打包为函数/ h. S7 Z; Y* p, U; W2 Y
4 M2 m# j( v! G9 h
parfor ss=1:100
9 x5 J% z8 [, }) Y$ ofunc(ss,...,...);
$ p- ^! E v% U% s! r, wend1 D* d8 Z2 r9 v: B' G' L
+ l+ _* e' p1 w: u
函数如下所示:# a# @% Z A: h3 v
function func(ss,...,...)9 }% Z0 a" G& w7 k
xxx W$ i# W6 L# @1 d' R7 Z" f V9 \
.....
5 M' h( @8 j3 @3 N- f.....* O) u0 i, c1 a- ?1 i J, k
+ c) e l0 x' [3 {% y' I ^
end
& [/ T: j$ p- o L- _6 y该函数不应该有返回值,当parfor循环体内计算结果需要返回主函数时(绝大多数情况是这样的), r1 U( [: X2 y4 V! U, X- `( s0 f
那么将计算结果在循环体内保存为文件,文件名与循环变量ss有关系
- {" r( l3 e2 A& s0 W% k
3 F& b& A B4 |3 O
; ^; w E4 c: X" T1 ?当parfor的并行程序运行完之后,将保存的临时文件读取进来即可,保存和读取计算结果相比于大量的计算耗时来讲应该小的多,从而体现出并行的优势
! u& ~& x, m- n* w1 b6 [& h+ [( P8 z' N' C+ V# i; s6 A* }
7 ^9 e! @: s5 T8 x3 N1 P8 ^$ s6 s
0 N* A* e a1 Y0 x7 Q% _4 v, l9 U* I9 y1 z8 q! L5 i6 U% y; L3 L
所提供的该方法可以用于任何一维或者二维或者多维循环的加速计算7 z. k, O8 i) v8 m% J8 I P8 e
各位同学可以参考,采用所给出的方法,规避了学习parfor规则的所有难点,非常具有通用性$ ? Y b& P! z
|
|