Matlab之GPU加速方法
一般代碼加速方法
Matlab目前只支持Nvidia的顯卡。
GPU設備確認
想知道自己的電腦有沒有這個能力,在Matlab中運行 gpuDevice
。
只要數據格式是gpuArray
格式的,那么計算過程會自動的調用GPU進行計算。
GPU和CPU之間數據傳遞
- gpuArray
I) 將CPU內存數據傳到GPU內存中
X=rand(10,'single'); %定義在CPU上的一個10x10的隨機初始化數組 GX=gpuArray(X); %在GPU開始數組GX,並且將X的值賦給GX GX2=GX.*GX; %GPU上執行數組對應位置的點乘
還有很多支持 gpuArray 數據類型的函數,具體可以用 methods(‘gpuArray’) 查看。下列某函數的說明可以用 help gpuArray/functionname 查看:
gpuArray.ones gpuArray.colon gpuArray.zeros gpuArray.rand gpuArray.inf gpuArray.randi gpuArray.nan gpuArray.randn gpuArray.true gpuArray.linspace gpuArray.false gpuArray.logspace gpuArray.eye
其實,這些函數的用法和對應的普通函數的用法都是類似的。
II = gpuArray.eye(1024,'int32'); size(II) ans=1024 1024
II)在GPU內存中隨機初始化一些內存數據。
GX=rand(10,'gpuArray'); %直接在GPU設備上隨機初始化一個10x10的數組 %%常用的隨機初始化函數有:eye, ones, zeros, rand, randi, randn.
- gather
將GPU內存中的數據拷貝回CPU內存中。
X2=gather(GX2) %將GPU內存中的數組GX2賦值給CPU中的X2
TIPS
有時候GPU受限於硬件架構,單精度的計算遠快於雙精度。這時候可以考慮在拷貝的時候順便轉換一下精度 A = gpuArray(single(B)) 。
復雜代碼加速方法
對於一些復雜的,無法用matlab內部函數進行GPU加速的代碼,matlab還提供了一個更強大的工具,就是調用.cu文件。
matlab+c混合編程把.c,.cc,.cpp等文件編譯為能夠使用的mex文件。對於CUDA程序.cu,matlab也提供了一套方法來調用,最終編譯成.ptx文件。