数学建模社区-数学中国

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

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

发信人: fork (撒哈拉沙漠的沙), 信区: Matlab ( `5 {# |' W$ B- I" V标 题: 加速matlab运行的三重境界 ) e0 ^+ a* F; Y) S7 H' @! d6 g发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004) 8 \( r X1 D' B' }* U( r6 f3 F+ W9 Q" K" Q" h" C 加速matlab运行的三重境界

5 g* y6 q; k1 ?9 d: p & R3 n' P u7 ]. _; F5 `5 R

一、 遵守Performance Acceleration的规则) e |* ]6 ?" y. v: { 5 u; O9 k4 r5 }' X7 M+ T关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将0 _7 P+ I" u' t* Z6 T7 o5 F 其规则总结如下7条: ' l U5 U* F; u, v: m+ O4 q. X+ |3 G% x1、只有使用以下数据类型,matlab才会对其加速:$ J; a, M. A' k* Y& y' V/ K logical,char,int8,uint8,int16,uint16,int32,uint32,double/ C3 @+ U6 L0 Y$ E- g$ x 而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu # D6 V8 j1 o8 \/ I' x7 f: n) Fre,single,1 e9 C& N8 N- k " |* ^# k1 \8 A" zfunction handle,java classes,user classes,int64,uint64; D4 O8 T4 d2 g& D: f5 R: E 2、matlab不会对超过三维的数组进行加速。. S- {) _! i0 B 3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值: j7 u' J1 s" d2 F$ E 来表示;1 x) s: `3 k) u! B b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数4 Z* g) }: x5 t1 w! g& w- w 据类型,只使用 ' ]* {: [# z" `( P6 ^三维以下的数组;c、循环内只调用了内建函数(build-in function)。" n6 j- n9 {1 T/ p7 f 4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将) _8 T% ?$ [3 } 加速运行。 - J' X% m( T8 B9 h5 x) L. R2 h5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:! U$ h+ G2 H1 d( ?8 ^ x = a.name; for k=1:10000, sin(A(k)), end;" f' W, X+ j, h2 h4 z7 X. R) z; e7 ? 6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速- {- }9 P { |9 S! K 度。" x7 F& B3 s. ~! v! V* a 7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低# y: O1 g' Y0 p" L 运行速度。0 h* q9 O9 G* L y4 S& n# b9 Z/ R& u

6 O2 Z R9 {: g' q* j, ^# n$ b1 y

二、 遵守三条规则 / P& Z& I8 h0 v7 T* P+ r1 x( K7 C: E: ^% n o% ` 1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic # y; p/ F8 v0 v* L, z/ H, E/ M- ph means it is designed 5 J! {6 a/ G) ]; Y7 |9 w8 z) i* h for vector and matrix operations. You can often speed up your M-file c, @4 `" j( D' @/ R0 n' n, q ode by using) F" P( b* M; Z* q: W& t5 n% g vectorizing algorithms that take advantage of this design. Vectorizati4 p& a) `; H: t( H) K! B5 j: @/ | on means converting0 e& q, E; w2 p* f for and while loops to equivalent vector or matrix operations.”。改进( ~+ ~! e- {! x# w% x" z! [+ Z 这样的状况有两种方法: % r: e3 z! O% \$ x2 l0 T/ F# u; e5 q* Z" g a、尽量用向量化的运算来代替循环操作。如将下面的程序:* {4 {& `1 E& m& q | ; C; {( A6 _, C/ w2 K i=0; g$ S* P3 g: ^& k, d for t = 0:.01:10 , I* b- \* @6 C- _4 K6 H. Wi = i+1; B; o/ G0 k9 I% j( z4 Cy(i) = sin(t); 8 `1 D3 U( d0 H% z p: s4 }: R0 U$ Cend ' S" t. k; z2 e7 V7 v/ M8 a; X替换为:- n* a, R. g* V! z; q, h$ P0 z2 { t = 0:.01:10; 3 H% j( d) ?( }1 `y = sin(t); * O& O7 `& v' Z% d: Q, [速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i ! q$ u% u+ K( Y9 w' ypermute、permute、 , B: Y c/ ~& I/ \5 m* b& Creshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums* g0 T x; B& N um、ind2sub、 " V7 o! j c$ C; k+ p' }ndgrid、repmat、sort、sum 等。' b7 n# A( T# H. r; l% l 5 ^4 [1 p: o0 j& R请注意matlan文档中还有这样一句补充:“Before taking the time to( w5 b( a- o5 P; ^( G2 g' Z$ y, } 7 D. ^& X6 I! p" L4 L1 P" vvectorize your code, read the section on Performance Acceleration.& D$ e" O, d n9 p You may be able to: f# `4 J8 i- a, |9 G5 ?5 t0 H speed up your program by just as much using the MATLAB JIT Accelera 3 B% B, G% `3 l- k% itor instead of% Z8 ? w# _. m- w vectorizing.”。何去何从,自己把握。* U9 i: ?- R c1 P' f0 Q- [ + v% X5 g& M4 f# h0 s0 e d% ?b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执 # M3 a. M1 [0 ?行循环次数少的,; {# h4 ?# K) Q5 U# G 内环执行循环次数多的。这样可以显著提高速度。( J) [: u* M' T% l9 L! c! I C5 r ( Q9 u( A- t5 ^6 b5 i' U 2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on% U4 D1 S; v7 z* Z- _" X es、cell、struct、- [3 } w% N, Z' t$ G repmat等。. ~2 L0 d9 v+ M; G b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:; [2 W3 S6 A$ \& B4 s2 q N E! ` 2 v9 y$ \6 E5 N7 x/ E- Q2 p; _( X A = int8(zeros(100));+ X4 ^7 v& |$ \( p 换成:1 m2 @; r" c! v2 z9 l, n6 ` A = repmat(int8(0), 100, 100);% ^7 w3 H C% A% u c、当需要扩充一个变量的大小、维数时使用repmat函数。 ! t' [7 L+ N" v q " ~! d" U% P, Y! Y G3 }3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。8 a( @2 W6 P. Z% U- i b、使用Functions而不是Scripts 。 0 E& Q J- }8 D- N6 B

, w; N f8 a! s$ ]9 Y; u

三、 绝招 F' h6 x. X7 V3 n [" d; B9 z' w- D7 L+ }( [$ R0 d/ g 你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。 - c) \! I! [) z5 D1、改用更有效的算法 1 L. d# }* m+ _( G1 h2 t2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 5 y+ F4 \& Q2 s, J% S/ ^8 `& [4 J7 `( e/ e3 m" x 关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++ 3 j6 G" ]( I) d语言文件,VC编译”。


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

注意

! v1 [' [4 ~/ z0 j9 e

加速之前应该先测试" ?5 W6 O9 S/ O- L8 I2 i) U5 F6 ` 使用profiler可以获得程序各个部分的耗时( x& o+ A5 r8 L4 T" \9 M 如此就能高效的加速5 f0 R( }& R) w% |

; q* E. H9 D& u, x" K" ]0 Q! T F

因为有的时候导致速度变慢的原因是逻辑结构不合理,4 z; Z1 T* b" w 而不涉及程序技术

9 l1 F& B$ w0 h `


作者: 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