数学建模社区-数学中国

标题: 加速matlab运行的三重境界 [打印本页]

作者: zzwszj    时间: 2004-12-21 11:00
标题: 加速matlab运行的三重境界

发信人: fork (撒哈拉沙漠的沙), 信区: Matlab/ Q$ _7 ~& z- a' B9 Z 标 题: 加速matlab运行的三重境界, t) J) i! f8 b z% k 发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004) 2 u2 x- y2 Q, I R5 S6 K, _ T) a" i* g9 O, l" i( T; Y$ C加速matlab运行的三重境界

6 L/ E5 e0 X' j o* W/ ^# F) ^ : H9 ?4 P; Q5 _5 J" b y( J& i9 t

一、 遵守Performance Acceleration的规则 ' ^. x5 `3 X6 H3 v" V7 _3 N2 f1 Y$ z* Z$ P 关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将 ' p# e5 v+ J4 L* s其规则总结如下7条: . Z; o7 X( S8 }, f1 C1、只有使用以下数据类型,matlab才会对其加速:. ^8 p+ i7 A% E4 T* Y5 ~; Q logical,char,int8,uint8,int16,uint16,int32,uint32,double- B. E. R. `$ o; W" _2 C9 g8 y5 d% S 而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu - _; A+ A9 G- Hre,single, . l4 J& Q v' Q- ]+ O2 _; |$ e& c 1 X4 l! R1 k4 O6 \" g" v: gfunction handle,java classes,user classes,int64,uint640 p9 ^* w! {/ {" p4 g: b2 I# x: v 2、matlab不会对超过三维的数组进行加速。) D5 W0 L Q2 ]& i4 Z 3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值 & k) N3 x1 w# o来表示;) j6 F# S# \; P- w b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数* s% O9 o! P; k& t1 c, v5 d 据类型,只使用 & g% C2 v6 ]+ }+ ^9 F三维以下的数组;c、循环内只调用了内建函数(build-in function)。6 t9 b) b/ G% ] 4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将1 I* h/ J6 j. C 加速运行。/ _ y% t5 P- w& F1 F 5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:5 H( `2 H# m) q7 Q* k4 l! r/ U& P+ K x = a.name; for k=1:10000, sin(A(k)), end;# t3 c6 W$ ~+ t* M# t& x- }/ B 6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速9 S% j, L1 b: S 度。 $ R! n X% | E: ~6 R$ e( r7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低0 q: h* u+ y% e; Q 运行速度。 ; j, f4 ?0 O( r$ s3 F

. h9 M) Z g& _. O( g, {

二、 遵守三条规则4 ]+ N- |) x. H) N' [ & n! E! ?) B% S# n1 _$ R 1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic0 D6 H9 Y+ ~' W# t9 S h means it is designed ~- t" E2 B$ U6 D, \1 \6 N 3 s. H0 [2 ^2 R- Vfor vector and matrix operations. You can often speed up your M-file c ' q- U* e6 h6 Jode by using * Z5 a1 ~1 e" n) Vvectorizing algorithms that take advantage of this design. Vectorizati * l9 T3 ], |) ~. }. xon means converting 5 }3 a. g: } m3 b3 {6 }0 n ~for and while loops to equivalent vector or matrix operations.”。改进 , A5 l) {2 e) I7 u0 B& t这样的状况有两种方法:# w. O$ L" k+ g 5 [1 Q) }( x9 ~! p+ @8 p. R4 y4 @ a、尽量用向量化的运算来代替循环操作。如将下面的程序:7 R- r' ~+ W( R! f' d9 | ! C: [, j8 K2 Vi=0; $ J- J3 F, z. Q3 A; V$ \- l% sfor t = 0:.01:10* B* \; p$ G3 N: q, y2 e& Z! c i = i+1;# }. G3 z p0 N( } y(i) = sin(t); 6 |/ b+ |' _+ s4 p" Send0 p0 l8 c3 x. L, f/ A 替换为:. ], E7 s; H5 b" T t = 0:.01:10; 7 B7 j$ J/ _# Y1 J5 n* Qy = sin(t); $ c3 U$ g4 p) e4 C速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i9 |$ ~/ ]5 t2 |# F& U3 S4 z9 O8 ` permute、permute、 , |1 F1 C1 c7 S; |: ~2 m- G: treshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums: M4 ]. _/ C1 a, ` um、ind2sub、8 i" M% S0 W. g. M3 Z; ? ndgrid、repmat、sort、sum 等。 ' L3 i0 ^ d0 S6 Z- n" R$ y/ g. S$ Y; h* H7 v' y7 C 请注意matlan文档中还有这样一句补充:“Before taking the time to, K% s% c$ u0 O6 s% N [5 Q0 @2 C; ]0 |* a6 N vectorize your code, read the section on Performance Acceleration. 2 Q, d4 e- q: p9 H8 `8 GYou may be able to 6 V( _/ p: `8 A! n' {( i' Ospeed up your program by just as much using the MATLAB JIT Accelera , L- ~/ D4 N" ]* otor instead of . p2 k: r$ a, d) Zvectorizing.”。何去何从,自己把握。6 y& w' [4 ^/ @; X( N9 o; p # s. H( _! q9 ^! c( w8 v& Jb、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执/ T8 C- n3 ]( o0 n 行循环次数少的,5 u5 A+ ]9 k2 r5 Z9 P1 {2 v7 p 内环执行循环次数多的。这样可以显著提高速度。 + G! t, Y- @" n( t$ \- q8 q3 ]3 T 2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on ; n' V$ w+ M* K. mes、cell、struct、0 }6 F0 ~/ L3 W3 z repmat等。% Q. l' Y0 f7 |! k" t0 J" ^) W b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: / V: Z3 g+ {4 @( P% M( ?$ Y4 G6 T5 X) l m. ~ A = int8(zeros(100)); 0 N7 H; {4 I, R9 r换成: 8 ~3 t3 }1 ?" d6 z- a& {A = repmat(int8(0), 100, 100); " N" S- S3 x! K/ j$ H2 T) C) uc、当需要扩充一个变量的大小、维数时使用repmat函数。 1 s) G; f4 M, c Y * ?9 ~" Q: c/ [: E0 a2 X3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。. U. M& ]5 Y7 \2 {& G b、使用Functions而不是Scripts 。 ) x2 D$ @# u& I, G2 q: a

' C; n v- D* I6 x- @! i f

三、 绝招 1 W8 W* u/ w: F: d" P6 i) Z# c+ r+ B5 j 你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。8 x/ x5 g% U+ Q1 A, B! C! x$ n 1、改用更有效的算法. N7 S9 h) v3 q; J) l 2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。% b# C! u6 |2 v- V - B0 Q$ ^6 g6 F3 e( Q 关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++ # I( t4 D4 _2 g2 ?3 l. m: X语言文件,VC编译”。


作者: fup    时间: 2004-12-21 16:00
Great.
作者: ornewuser    时间: 2004-12-22 11:47
好文章
作者: zzwszj    时间: 2004-12-22 13:01

注意

+ Z' V o' b( V) {4 \

加速之前应该先测试 ) S: }- P. m& _" g( ^0 l5 u使用profiler可以获得程序各个部分的耗时 2 i4 e4 i9 x% a1 w* q: h8 @如此就能高效的加速 0 u; O7 ]) @5 r8 L5 V$ x* n

2 w- u9 i0 T0 ^/ o5 h) S1 Z

因为有的时候导致速度变慢的原因是逻辑结构不合理, 8 v; m& @% C( {# d9 k) t4 v0 B0 s而不涉及程序技术

' J' |+ M! B, y: p ~


作者: hamburger_2004    时间: 2004-12-22 21:10
收到![em02]
作者: hamburger_2004    时间: 2004-12-22 21:12
多谢掌门人,对俺的帮助太大了。
作者: 布赖    时间: 2005-1-4 18:13
有没有经过考验的????????




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5