對(duì)于大規(guī)模重復(fù)的運(yùn)算,為了提高運(yùn)算速度肛捍,可以將部分核心代碼用C++來實(shí)現(xiàn),用編譯器編譯成動(dòng)態(tài)可執(zhí)行文件(mex文件)之众,在MATLAB中直接調(diào)用拙毫。
個(gè)人親歷,有一段Monte-Carlo仿真的MATLAB代碼棺禾,在Intel 8700K+32G的機(jī)器上缀蹄,運(yùn)行時(shí)間在1周左右,經(jīng)過C++重構(gòu)核心代碼后,可以在2天內(nèi)完成缺前。同時(shí)蛀醉,由于內(nèi)存的占用降低,可以進(jìn)行更大規(guī)模的仿真衅码。
MATLAB版本:R2018b拯刁;C++編譯器:Visual Studio 2015 Professional;
關(guān)于不同版本MATLAB支持的編譯器,參考官網(wǎng)鏈接逝段。
一垛玻、在Visual Studio中編寫C++文件。
1.1 新建一個(gè)win32項(xiàng)目
項(xiàng)目名最好與函數(shù)名一致奶躯,注意應(yīng)用程序類型設(shè)置為DLL帚桩。
1.2 配置項(xiàng)目屬性。
- 在項(xiàng)目名稱上右鍵 -> 屬性即可打開項(xiàng)目屬性頁嘹黔。
- 配置屬性->配置管理器->活動(dòng)平臺(tái)解決方案 -> 新建解決方案平臺(tái) -> x64账嚎;
- 配置屬性->C++ ->附加包含目錄,加入MATLAB目錄下的\extern\include 路徑参淹,默認(rèn)為C:\Program Files\MATLAB\R2018b\extern\include醉锄;
- 配置屬性->鏈接器->附加庫目錄,加入MATLAB目錄下的\extern\lib\win64\microsoft路徑浙值,默認(rèn)為C:\Program Files\MATLAB\R2018b\extern\lib\win64\microsoft恳不;
- 配置屬性->鏈接器->輸入->附加依賴項(xiàng), 添加libmx.lib开呐,libeng.lib烟勋,libmat.lib,libmex.lib這四個(gè)lib文件筐付;
- 配置屬性->鏈接器->常規(guī)->輸出文件卵惦,改為x64\Debug\vlda.mexw64 (vlda為項(xiàng)目名稱);
- 配置屬性->配置屬性->常規(guī)->目標(biāo)文件擴(kuò)展名,改為.mexw64;
- 新建模塊定義文件瓦戚,vlda.def沮尿,內(nèi)容為
LIBRARY;"vlda" // vlda為項(xiàng)目名稱
EXPORTS mexFunction
- 配置屬性->鏈接器->輸入->模塊定義文件,vlda.def较解;
1.3 編寫函數(shù)文件
在源文件里面已有vlda.cpp(vlda為項(xiàng)目名稱)畜疾,在vlda.cpp中編寫MEX函數(shù)文件。
mex函數(shù)的編寫注意事項(xiàng):
- 注意檢查輸入的參數(shù)類型印衔,參數(shù)數(shù)目妻献,MATLAB默認(rèn)的數(shù)據(jù)類型為double,一旦不匹配躲惰,MATLAB調(diào)用時(shí)會(huì)直接崩潰砂沛;
- 注意內(nèi)存泄漏献烦,分配的內(nèi)存彤敛,記得釋放掉;
- MATLAB 中的parfor可以在C++ 中輕松使用OpenMP實(shí)現(xiàn)了赌,具體為添加庫文件
# include "omp.h"
同時(shí)墨榄,在for循環(huán)前加上如下預(yù)編譯指令
#pragma omp parallel for
- 使用OpenMP時(shí),配置屬性->C++ ->語言->OpenMP支持揍拆,選為"是";
1.4 生成解決方案
編寫好mex函數(shù)后渠概,在項(xiàng)目名稱上右鍵->生成,從而進(jìn)行編譯嫂拴,生成.mex64文件播揪。
二、調(diào)試
- 將生成的.mexw64拷貝到MATLAB當(dāng)前目錄筒狠。
- 菜單欄:調(diào)試->附加到進(jìn)程->選擇MATLAB進(jìn)程猪狈,附加到進(jìn)程后,會(huì)經(jīng)歷較長時(shí)間的符號(hào)加載過程辩恼;
- 如果符號(hào)加載時(shí)間過長雇庙,可以通過設(shè)置符號(hào)位置來解決,菜單欄:調(diào)試->選項(xiàng)->符號(hào)->勾選Microsoft符號(hào)服務(wù)器灶伊;
- 在源代碼vlda.cpp中設(shè)置斷點(diǎn)疆前;
- 在MATLAB中調(diào)用.mex64文件,會(huì)跳轉(zhuǎn)到VS 2015 中的斷點(diǎn)聘萨,F(xiàn)10可單步執(zhí)行竹椒;
- 調(diào)試過程中修改vlda.cpp,重新生成解決方案米辐,將新生成的mexw64文件拷貝到MATLAB當(dāng)前目錄胸完,此時(shí),需要在matlab中clear掉原來的mexw64文件翘贮,即運(yùn)行命令
clear vlda.mexw64
三赊窥、發(fā)布
對(duì)于比較簡單的程序,直接用Debug版本的也沒什么問題狸页,但最好還是使用Release版本锨能。
- 配置屬性->配置管理器->活動(dòng)解決方案配置->Release ,其他設(shè)置參照1.2配置項(xiàng)目屬性設(shè)置。
- 如果mexw64文件需要拷貝到別的電腦上運(yùn)行芍耘,可以考慮采用靜態(tài)編譯腹侣。配置屬性->C++ ->代碼生成->運(yùn)行庫:多線程(/MT);配置屬性->常規(guī)->MFC的使用:在靜態(tài)庫中使用MFC齿穗。
四、總結(jié)
將部分核心代碼用C++實(shí)現(xiàn)后饺律,能夠極大的提高運(yùn)算速度窃页,同時(shí)降低內(nèi)存的使用跺株。另一方面,借助于OpenMP脖卖,可以很方便的實(shí)現(xiàn)并行計(jì)算乒省,將多核CPU的利用率維持在100%。