大家都知道,MATLAB中有個Profiler,可以幫助我們剖析M文件,找出瓶頸所在以便優化。如果優化後在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右側的「性能資源管理器」中右擊最頂層,選擇「附加/分離」,然後從彈出來的對話框中選擇MATALB進程,點擊「附加」。
- 在MATLAB中運行你的程序,在程序結束後返回VS,在「性能資源管理器」中右擊最頂層,選擇「附加/分離」,然後從彈出的對話框中選擇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。在彈出的對話框中,選中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按鈕。
- 在彈出的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程序代碼的剖析了。不足之處大家歡迎指正。誰有更好的方法也歡迎拿出來分享。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/251237.html