如何利用GPU(CUDA)加速Matlab程序?

在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. 配置環境

(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的混合編程。

 

  1. 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的內建函數完全相同,只需要在命令窗口內輸入對應的文件名稱即可。如下圖所示。

 

  1. 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. 獲得輸入、輸出參數

輸入,輸出參數的獲取可以用兩種方式

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語言)的混合編程。

 

發佈了61 篇原創文章 · 獲贊 121 · 訪問量 101萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章