發布企業信息

Matlab 編譯文件的性能優化

作者:未知  信息來源:未知  2006-1-26

字體大小:  網友評論  

5 編譯文件的性能優化12。1 優化原M文件的性能12。1-1 】本例演示: M 文件與 MEX 文件、向量運算與循環運算的速度比較。(1)編寫如下兩類函數 M 文件。...

12.5 編譯文件的性能優化
12.5.1 優化原M文件的性能

12.5.1.1 提高向量化程度
【例 12.5.1 .1-1 】本例演示: M 文件與 MEX 文件、向量運算與循環運算的速度比較。

(1)編寫如下兩類函數 M 文件。
function y=sa(x)
x=x+(x==0)*eps;
y=sin(x)./x;
function y=saf(x)
n=length(x);
for k=1:n
x(k)=x(k)+(x(k)==0)*eps;
y(k)=sin(x(k))/x(k);
end

(2)在 MATLAB 指令窗中,對 sa_mex.m 和 saf_mex.m 進行編譯。
cd d:\mywork
mcc -x sa_mex %<1>
mcc -x saf_mex %<2>

(3)運行四個文件,記錄運算時間
t=-2*pi:pi/500:2*pi;
tic;sa(t);tt(1)=toc;
tic;saf(t);tt(2)=toc;
tic;sa_mex(t);tt(3)=toc;
tic;y=saf_mex(t);tt(4)=toc;

(4)結果顯示和比較
plot(t,y,'r-');grid

圖 12.5.1 .1-1

disp(' 運算速度比較 ')
disp(' sa.m saf.m sa_mex.dll saf_mex.dll')
disp(tt)

運算速度比較
sa.m saf.m sa_mex.dll saf_mex.dll
0.3300 2.9100 0.3800 2.5800

12.5.1.2 對數組進行預置
【例 12.5.1 .2-1 】以上節例 12.5.1.1-1 為基礎。 saf.m 文件中數組變量 x 和 y 的大小隨循環進行而增長這大大減慢了運算速度。本例演示:在循環前對進行變量預置的好處。

(1)編寫如下文件,以 saf_pro.m 和 saf_pro_mex.m 為名,將之保存在當前目錄下。
function y=saf(x)
n=length(x);
x=zeros(1,n);y=zeros(1,n);
for k=1:n
x(k)=x(k)+(x(k)==0)*eps;
y(k)=sin(x(k))/x(k);
end

(2)產生編譯文件
mcc -x saf_mex
mcc -x saf_pro_mex

(3)運行
t=-2*pi:pi/500:2*pi;
tic;saf(t);tt(1)=toc;
tic;saf_pro(t);tt(2)=toc;
tic;saf_mex(t);tt(3)=toc;
tic;y=saf_pro_mex(t);tt(4)=toc;

(4)速度比較
disp(' 運算速度比較 ')
disp(' saf.m saf_pro.m saf_mex.dll saf_pro_mex.dll')
disp(tt)
運算速度比較
saf.m saf_pro.m saf_mex.dll saf_pro_mex.dll
2.8600 0.6600 2.6300 0.4400

12.5.2 利用mcc(-V1.2)的優化性能

12.5.2.1 編譯時指定優化選項-r和-i
【例 12.5.2 .1-1 】求如下非線性差分方程組在 10000 個點上的值。觀察原 M 文件、無選項和有選項 MEX 文件運行速度的不同。


(1)利用 MATLAB 編輯窗口編寫如下 M 函數文件
function [x,y]=m_henon(n)
x=zeros(1,n);y=zeros(1,n);
for k=1:n-1
x(k+1)=1+y(k)-1.4*x(k)^2;
y(k+1)=0.3*x(k);
end

(2)對 M 文件分別選用編譯器 2.0 和 1.2 進行編譯如下。
cd d:\mywork
mcc -x mex20_henon % 用 2.0 編譯器產生普通 MEX 文件 <1>
mcc -V1.2 -ri ri_mex12_henon % 用 1.2 編輯器產生優化的 MEX 文件 <2>

(3)計算各文件運行時間費用的相對值。
n=10000;
t=zeros(3,2);
for k=1:2 % 運行兩次,以做比較
tic;m_henon(n);t(1,k)=toc;
tic;mex20_henon(n);t(2,k)=toc;
tic;ri_mex12_henon(n);t(3,k)=toc;
end
t=t/t(1,1);

(4)顯示比較結果
filename=[ ' m_henon';
' mex20_henon';
'ri_mex12_henon';];
disp([' 各文件運行開銷的相對值比較表 '])
disp(blanks(1)') % 產生一個空行
disp([' 文件名 第一次運行 第二次運行 '])
disp([filename blanks(3)' blanks(3)' num2str(t)])
%blanks 產生兩個空列
各文件運行開銷的相對值比較表
文件名 第一次運行 第二次運行
m_henon 1 0.78086
mex20_henon 0.69753 0.59259
ri_mex12_henon 0.015432 0

12.5.2.3 利用編譯注記優化性能
【例 12.5.2 .3-1 】編譯注記 %#ivdep 的應用舉例。

(1)編寫如下兩個函數 M 文件,并存放在 d:\mywork 目錄上。
[ivdep0.m]
function A=ivdep0( )
A=1:10;
A(5:9)=A(3:7);

[ivdep.m]
function A=ivdep( )
A=1:10;
%#ivdep
A(5:9)=A(3:7);

(2)分別對這兩個文件進行編譯 。
cd d:\mywork
mcc -V1.2 ivdep0
mcc -V1.2 ivdep

(3)在 MATLAB 指令窗中運行以下指令。
tic;A0=ivdep0;t0=toc;
tic;A=ivdep;t=toc/t0;

(4)顯示結果 。
A0,A
disp([' 使用編譯注記 %#ivdep 后的運用時間僅為原來的 ' num2str(t)])
A0 =
1 2 3 4 3 4 5 6 7 10
A =
1 2 3 4 3 4 3 4 3 10

使用編譯注記 %#ivdep 后的運用時間僅為原來的 0.15152

分頁:

推薦圖文

機械熱點圖文

  • 數控車床加工編程典型實例分析2
  • 內螺紋車削加工——數控車床編程實例42
  • 車削M30x2-6g的普通螺紋-數控車床編程實例35
  • 子程序編程方法-數控車床編程實例36

機械風云人物

Copyright © 2004 51base.com Inc. All rights reserved.

無憂基地 版權所有│粵ICP備06098418號│XHTML | CSS

客服:+86-755-2212 2202 工作時間:周1~5 10點~16點

感謝中國網絡提供帶寬支持