数学建模社区-数学中国

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

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

发信人: fork (撒哈拉沙漠的沙), 信区: Matlab$ N! G- z! a8 V/ Y; `' W: ~9 o! } 标 题: 加速matlab运行的三重境界& Z+ C- L; v8 h# t& Q 发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004) 8 T4 l4 v6 e9 B% }% ~ 4 z5 ~4 g( A0 W( o7 A v/ y( ~& I加速matlab运行的三重境界

z: D; w. n% J$ ]* i2 D+ y: Y % }. B7 b$ v$ A5 b6 s$ Z2 K

一、 遵守Performance Acceleration的规则 + T0 G2 K0 @5 O9 v8 k4 d* @& C" @) m) S6 l' s3 m( l& L d, Q 关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将+ x4 {# [7 q' Q8 O' u, c 其规则总结如下7条:( n7 B* h( s2 K9 M 1、只有使用以下数据类型,matlab才会对其加速:( w9 q- k. ~9 i1 X5 H logical,char,int8,uint8,int16,uint16,int32,uint32,double ) x5 b( }2 L+ m7 L- a而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu " R$ V4 S4 W% |0 Pre,single, " l! q8 g0 y, B+ L6 @' H# l* s: r. V. g function handle,java classes,user classes,int64,uint64 - R0 G2 U. q' ?5 j' r2、matlab不会对超过三维的数组进行加速。" P4 E5 P1 }! t0 F; o! Q9 r 3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值6 _% S' v/ i2 z3 Z 来表示; . g; n0 U# B' ]9 p! [/ a$ a9 kb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数7 a u1 c! [" Y( S3 ] 据类型,只使用 5 o, D' f* R+ e" b F- v T) q, o& M三维以下的数组;c、循环内只调用了内建函数(build-in function)。# X0 k/ u2 D% }2 Y- ~( t% } 4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将' _( n! B. {7 r" r 加速运行。 5 \. Z' c# H' P. \8 W9 A* a0 |5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:0 R9 u4 d3 Z% U: u x = a.name; for k=1:10000, sin(A(k)), end; ' o- q, {( l% {* ?& q6 o" v9 i1 \1 k6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速 1 N! _* d% y* l% a1 f! K度。( I. S# Z1 F) G7 i# N 7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低 7 g( f/ Z5 H- w: T运行速度。 5 C5 _3 d( i5 q1 ^6 v! M6 e8 t

. f" j+ e! q* ^! ^

二、 遵守三条规则 $ x# x! L% B$ \: [" m( g; T 6 q4 i4 x7 z' w1 u( s7 Y( j- |1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic , q5 w8 X0 T. Q. p% Ch means it is designed; @! F o. C3 J1 S+ }2 h 2 G1 f5 \% x# S; P1 p: l% `3 gfor vector and matrix operations. You can often speed up your M-file c ) A# z8 a0 s: J+ R5 Xode by using $ ^; [: W; j1 C1 K- Rvectorizing algorithms that take advantage of this design. Vectorizati r* G, B" u4 _( h( ron means converting 0 v( R2 H: I9 F3 g$ k/ |for and while loops to equivalent vector or matrix operations.”。改进 ' Y9 E K5 y* C% ?: ]3 ^这样的状况有两种方法:) t: i. ^: P/ n$ v2 z! h ( K; G- n2 j1 g+ y4 xa、尽量用向量化的运算来代替循环操作。如将下面的程序:0 x) M. k: n* \0 g# p6 ? # |# v/ F7 F* l5 @* A) [ i=0; w! ]8 z/ B; g7 ]$ ^+ s; O6 j0 [ for t = 0:.01:10. V, j8 `& Q+ p& w i = i+1; & d0 V1 u# v( c$ Yy(i) = sin(t);: x) A! ?% R& V- z, ?2 b/ V end# J8 ]' N5 J7 g$ j 替换为:: N$ w. E: o3 x- G! ? t = 0:.01:10;# `( F9 X5 X* Q9 k y = sin(t);6 v4 {' J4 S" W k6 }5 n) ^ 速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i w$ M1 h- k3 `+ N0 Ppermute、permute、8 x8 Z9 o6 G3 w/ z1 x reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums) C. k" Y% q6 h' n) a8 g# K um、ind2sub、0 z _: E. {' V3 i% ]! z8 z ndgrid、repmat、sort、sum 等。) `" s: r& f5 @# Y * A0 u: [% i; M2 k7 g7 u6 D$ s" `请注意matlan文档中还有这样一句补充:“Before taking the time to ; B6 O* q+ h2 ~+ ~& |: m5 }4 m ! [) v: H C0 s' yvectorize your code, read the section on Performance Acceleration.7 t m" o/ A3 y$ q You may be able to - \% Z. S5 q5 G, f9 O7 G6 }speed up your program by just as much using the MATLAB JIT Accelera 3 @3 U5 O% R, \% vtor instead of 6 G# n3 b8 A* q1 o5 l# S2 N s) O kvectorizing.”。何去何从,自己把握。 ; P% o8 n. U$ @4 N* Y- g9 q+ I 7 Q" s& j$ k* D5 H4 I5 K* {b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执 " d0 z5 D! {7 g8 f2 z1 q" D3 Q# Z) f行循环次数少的, _4 Z6 H- b7 l- s4 N2 l# L7 v 内环执行循环次数多的。这样可以显著提高速度。 ) u Z; \2 V4 W& l & `: c6 c6 x* A: m0 A2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on/ J4 {; Q. B1 Y" B es、cell、struct、 0 d7 k4 t1 I" A7 `5 Vrepmat等。 9 {; X0 T7 j; X7 }- yb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:2 p! |- w" q3 J y) g: k2 M % Z$ L# ]; e6 |7 i& F zA = int8(zeros(100)); & J! e9 t1 Q& D2 U2 q换成: 0 D; G+ ?& O! V0 p8 cA = repmat(int8(0), 100, 100);4 d& Y8 @( ?- [/ v9 I1 y c、当需要扩充一个变量的大小、维数时使用repmat函数。 1 F1 u- q& N' Z) Q 3 M# H6 f9 j, l+ \* W5 Q. L5 Z3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。' S" N! Y& T. F2 l; z1 [3 o b、使用Functions而不是Scripts 。 $ b3 D; I- _( X7 D& q6 e1 N

6 s8 W9 s0 I5 x0 `$ k9 Z

三、 绝招 3 T6 B. M8 v( a4 X- f! F- ^, @) m" U2 x2 }, T; t 你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。0 ]+ p1 q& S0 l9 T: w" x$ [ 1、改用更有效的算法 & E3 r: ^. J3 ^9 }7 k6 s* p' E2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。2 D3 {4 D* g1 k3 r % s* s. R7 f( {5 n 关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++, a# a. `6 Y" F. _; I5 r 语言文件,VC编译”。


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

注意

1 Y9 O# t/ D* i9 a

加速之前应该先测试 9 [" s7 f0 p& f/ C5 T; [) ~ y2 V" W, p使用profiler可以获得程序各个部分的耗时% {( o$ Q4 G- T 如此就能高效的加速 # M' X0 b$ L7 y( S9 O* j% ~; v

1 b# T4 V0 e2 j3 s0 X/ g

因为有的时候导致速度变慢的原因是逻辑结构不合理, 2 Z: n' e0 s$ a2 Y6 ~$ e9 H: n* }' I) e而不涉及程序技术

2 n/ W7 Z; F3 Q( L) P2 i


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