在Matlab中調用GPU的CUDA API進行並行加速,主要有兩種途徑:
1)對現有Matlab代碼的簡單改寫,調用Matlab中支持CUDA的函數進行加速。
2)將C語言的CUDA函數封裝成庫,在Matlab中進行調用。
前者簡單方便,效率低;後者效率高,稍微麻煩。
一、matlab中直接的gpu加速計算
matlab中直接做GPU計算分爲三個步驟。
(1)數據的初始化
使用gpuArray()則可生成gpu端數據,a=gpuArray(b),即爲將cpu端數據b拷貝到gpu端的a中。
(2)對GPU數據進行操作
可以使用matlab中的庫函數對gpuarray直接進行操作。
(3)把GPU上的數據回傳給CPU
使用gather()則可將gpu端的數據傳回cpu端。
二、 Matlab中調用CUDA C
- 配置環境
(1)Matlab環境配置:
1mex -setupC 配置編譯器。注:若c語言編譯器和matlab版本不匹配系統會報錯:找不到編譯器活SDK等。配置成功後顯示下圖所示信息。
2 mex -setup c++ 選擇語言,在編譯器配置成功後選擇所需的語言。配置成功後顯示如下圖所示信息。
Matlab環境配置結束。
(2)系統環境變量配置
打開電腦中的高級系統設置。選擇環境變量,在系統變量的Path變量中添加所安裝matlab文件夾中的extern\lib\win64\microsoft,matlab\lib\win64和matlab\bin\win64。如下圖所示
系統變量配置結束。
(3)VS2015環境配置:
1打開VS中得項目工程文件,對項目進行屬性設置,在解決方案資源管理器中選中項目,右鍵選擇屬性進行項目屬性配置。如下圖所示。
2在項目得屬性頁中對所有配置進行一下操作。首先對VC++ 目錄欄中得包含目錄及庫目錄進行配置。在包含目錄中添加所安裝matlab文件夾中的extern\include和extern\include\win64,在庫目錄中添加extern\lib\win64\microsoft。如下圖所示。(本機matlab安裝於D:\matlab文件夾。)
接着配置鏈接器,選擇常規選項欄中得附加庫目錄進行編輯。添加所安裝的Matlab文件夾中的extern\lib\win64\microsoft.如下圖所示。
最後配置鏈接器輸入選項欄中的附加依賴項。在附加依賴項中添加:libmat.lib
、libmx.lib、libmex.lib、libeng.lib如圖所示。
現VS環境配置結束。
在matlab,VS2015和系統變量成功配置後即可進行matlab與CUDA C的混合編程。
- matlab中調用.cu程序
在對matlab的配置中安裝了mex文件,MEX文件是一種可在matlab環境中調用的C語言(或fortran)衍生程序。
以matlab安裝目錄下的mexGPUExample.cu文件爲例,該文件在所安裝的matlab文件夾中的toolbox\distcomp\gpu\extern\src\mex夾內,在matlab中更改路徑到相應的位置。如下圖所示。
首先使用mexcuda針對該mexGPUExample.cu文件,生成其mex文件。在命令行輸入mexcuda mexGPUExample.cu。如下圖所示。
Mex文件生成成功會有如下顯示,並生成相應的mex64文件
MEX文件的調用極爲方便,其調用方式與MATALAB的內建函數完全相同,只需要在命令窗口內輸入對應的文件名稱即可。如下圖所示。
- C語言MEX程序代碼文件
C語言MEX程序代碼文件有計算子例程(Computational routine)和接口子程序(GatWay routine)兩個相互獨立的子程序組成。其中,計算子例程的功能是完成所需要的計算,它和具有相同功能的一般C源程序文件相同;接口子程序的功能則是計算子程序和MATALAB的接口,用戶實現兩個不同內存空間中的通信。
接口函數:mexFunction
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
nlhs:輸出參數數目
plhs:指向輸出參數的指針
nrhs:輸入參數數目
prhs:指向輸入參數的指針
- 獲得輸入、輸出參數
輸入,輸出參數的獲取可以用兩種方式
1讀取mat數據文件
將matlab中所需要的數據以mat文件形式保存。如save(‘路徑’,’變量名稱’)。
之後則可在程序中對該mat文件數據進行讀寫操作。(注:所讀寫的文件按每一列依次操作)。
2使用接口函數傳遞參數
如:[a,b]=test(c,d,e)
c,d,e爲3個輸入參數,a,b爲兩個輸出參數這裏的輸入輸出參數的指針都是指向mxArray類型。當調用test函數時會將prhs[0]=c ,prhs[1]=d ,prhs[2]=e。在c語言程序中需要使用的是mxArray指針指向的數據。因此在需要對mxArray數據進行轉換。mxGetPr函數從指向mxArray類型數據的prhs[0]獲得了指向double類型的指針。再通過mxGetM和mxGetN來獲得輸入參數的行數和列數後即可構造相應的輸入矩陣。
a,b爲兩個輸出參數。a=plhs[0], b=plhs[1],因爲輸出參數的指針爲指向mxArray類型,需對該數據構造相應的mxArray。
mxCreateDoubleMatrix(int m, int n, mxComplexity ComplexFlag)函數得到m*n矩陣大小的mxArray的指針,現即可放入plhs[],中傳回。對輸出參數的賦值與輸入參數相同。
在完成了以上步驟之後即成功完成了matlab與cuda(c語言)的混合編程。