如果优化后在MATLAB中运行时间还是难以忍受,这时如果没有更好的算法供选择,可以考虑用MATLAB的外部程序接口来试试。
如果程序中的循环和矩阵 *** 作比较多,同样的程序转成Fortran MEX后速度通常会有10x甚至100x以上的提高。
如果MEX运行时间还比较慢怎么办?能不能类似于MATLAB中剖析M文件那样,对MEX进行剖析并找出瓶颈予以优化呢?几经摸索,笔者终于发现了两个不错的方法。
MEX有C和Fortran两种。
下面的方法针对Fortran MEX文件的剖析,对C MEX可能也适用。
需要的软件如下:Microsoft Visual Studio 专业版、MATLAB、Intel Visual Fortran、Intel Vtune Performance Analyzer或Intel VTune Amplifier。
方法一:利用Visual Studio 的性能工具在MATLAB中用mex编译得到MEX文件(扩展名.mexw32或.mexw64)。
注意要用-g开关来编译。
例如:mex -v -g source.F。
只有这样才剖析时才会分析其中调用的各subroutine。
打开VS,依次选择工具->性能工具->性能向导从下拉框中选择“分析动态链接库(.DLL)”,点击“下一步”点击“DLL路径”文本框右侧的按钮,从下面文件类型框选择“所有文件”,找到要剖析的MEX文件,点击“确定”。
也可以直接输入路径。
例如:C:\……\source.mexw32点击“可执行文件路径”文本框右侧的按钮,找到matlab.exe文件,点击“确定”。
与上一步一样,也可直接输入路径。
例如:C:\Program Files\MATLAB\R2008a\bin\matlab.exe点击“下一步”,选择“采样”,“下一步”,“完成”。
只有选“采样”才能附加到MATLAB进程。
在VS右侧的“性能资源管理器”中右击最顶层,选择“附加/分离”,然后从d出来的对话框中选择MATALB进程,点击“附加”。
在MATLAB中运行你的程序,在程序结束后返回VS,在“性能资源管理器”中右击最顶层,选择“附加/分离”,然后从d出的对话框中选择MATLAB进程,点击“分离”。
VS会给出性能报告。
点击“函数”标签,找到你的MEX文件,点右边的+。
此时就会看到详细的分析报告。
Exclusive Percent 较大的函数就是你源代码中需要设法优化的目标这个方法的分析结果只能统计到函数,不能统计代码行的调用次数和耗时。
要剖析到代码行可以用下面的方法。
方法二:利用Intel Vtune Performance Analyzer修改mexopts.bat:该文件默认位置为C:\Documents and Settings\你的用户名\Applilcation Data\MathWorks\MATLAB\R2008a\mexopts.bat。
找到并打开该文件,在文件中找到 set OPTIMFLAGS= …… 在其后添加 -Zi。
用-g开关mex你的Fortran MEX源文件。
如 mex -v -g source.F打开Intel Vtune Performance Analyzer(IVPA)并建立分析项目。
在IVPA中选择File-New Project,选择Quick Performance Analysist Wizard,点击OK。
在d出的对话框中,选中No Application To Launch。
此时先不要点Go。
打开MATLAB,运行程序调用你要剖析的MEX文件。
运行后返回IVPA,点击GO。
IVPA会对CUP中运行的所有进程进行分析,所以分析是最好少开其他程序。
默认的分析时间是20秒。
如果感觉时间不够,可以在Tuning Browser中右击项目名称,选择Properties,然后修改Duration值。
IVPA分析完成后,从Process列表中找到MATLAB双击。
一层层的双击进入,直到找到你的MEX进程。
双击进入,然后点击右键,选择View As – Horizontal Bar Chart,就可以找到最耗时的子程序。
双击子程序的名称,就会调查源码。
通过右边的Clockticks和Instructions Retired列中的数字就可以查找代码中的瓶颈所在。
方法三:利用Intel VTune Amplifier修改mexopts.bat:该文件默认位置在C:\Documents and Settings\你的用户名\Applilcation Data\MathWorks\MATLAB\R2008a\mexopts.bat。
找到并打开该文件,在文件中找到 set OPTIMFLAGS= …… 在其后添加 -Zi。
用-g开关mex你的Fortran MEX源文件。
如 mex -v -g source.F打开Intel VTune Amplifier 。
选择File-New-Project;Project Name栏中给project取个名字,比如叫MexProfile;Location栏是分析结果保存位置,保持默认或选一个位置;点击下面的Create Project按钮。
在d出的xxx – Project Properties对话框中的Target面板中,Target type选Attach to Process;然后到Windows任务管理器中查一下MATLAB的PID(如果没有启动MATLAB,先启动;如果任务管理器中没有PID,点击查看菜单-选择列-选中PID),输入PID后点击OK。
点击工具栏上的New Analysis图吧(向右箭头);在MATLAB中运行包含要剖析MEX的程序;然后点击AM中的Start开始剖析。
剖析一段时间或程序结束后点击Stop,软件会自动分析剖析结果。
分析完成后切换到Bottom-up面板,双击你要查看的函数名称,即可查看各代码行的耗时分析结果。
找到瓶颈进行优化。
纯个人摸索出来的方法,可能上面的步骤并非最佳,但至少可以实现MEX程序代码的剖析了。
不足之处大家欢迎指正。
谁有更好的方法也欢迎拿出来分享。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)