MATLAB GPU加速
以前使用matlab
的時候,很多人都用過里面的并行工具箱,用的最多的應該就是parfor。實際上,matlab里面已經有不少工具箱里面都有了支持GPU加速的函數。使用matlab+GPU加速的前提是,機器必須安裝了支持CUDA的顯卡,而且CUDA驅動的版本在1.3以上。一些比較常用的函數
例如fft,ifft,三角函數,相關函數xcorr以及常用的運算符等等都可以進行加速。方法也很簡單,主要使用到gpuArray和gather這兩個函數。
以xcorr為例,假設我們要求向量A和B的互相關,一般是使用代碼
M = xcorr(A,B)
以下是使用gpu加速的版本
Ag = gpuArray(A);
Bg = gpuArray(B);
Mg = xcorr(Ag,Bg);
M = gather(Mg);
一般的小矩陣可能感覺不出來,不過如果矩陣規模很大,而且在多次循環內部,這個區別就很明顯了。mathwork的網站上有對xcorr的gpu加速效率的詳細分析報告,基本上,隨著矩陣規模擴大,gpu加速的倍數是直線上升。
除了相關函數,還有很多支持gpuArray數據類型的函數,具體可以用下面的指令查看
methods('gpuArray')
其中某個函數的說明可以用help查看
help gpuArray/functionname
上面的例子中,gpuArray是把數據轉換為GPU處理的類型,存儲到GPU的顯存里。gather是將數據轉移回來。除了將現有的矩陣轉移到GPU中,gpuArray自帶的方法還可以直接在GPU中創建數據:
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
這些方法的具體用法可以使用類似下面的命令尋求幫助
help gpuArray/eye
其實,用法和對應的普通函數的用法都是類似的。
II = gpuArray.eye(1024,'int32');
size(II)
1024 1024
還可以用下面的命令生成隨機數
parallel.gpu.rng
parallel.gpu.RandStream
對于CPU和GPU產生隨機數方法的比較,有興趣的可以看這里。
最后,一些處理普通數據的函數也可以用來檢測GPU數據的屬性
Function
Description
classUnderlying
Class of the underlying data in the array
existsOnGPU
Indication if array exists on the GPU and is accessible
isreal
Indication if array data is real
length
Length of vector or largest array dimension
ndims
Number of dimensions in the array
size
Size of array dimensions
值得注意的是,GPU的數據是要存到顯存里面的,顯存可沒有內存那么大,雖然maltab和CUDA為我們做了很多顯存管理的工作,但是我們還是要保證處理的矩陣不會把顯存撐爆。
matlab的工具箱支持GPU的情況
可以在下面的網頁上查詢
http://www.mathworks.cn/products/parallel-computing/builtin-parallel-support.html
其中對于圖像處理來說有一個很有用的。我曾經的一篇博文
介紹過使用 blockproc 函數加速滑動窗。其實,這個函數還可以進一步被GPU加速,方法就是設置其中的 'UseParallel’ 變量。例子
下面是用gpu解波動方程的例子,cpu和gpu版本程序
進行對比,改動其實不太大,細節見參考中第四個網頁
編譯.CU文件
對于其他一些復雜的,無法用matlab內部函數進行GPU加速的代碼,matlab還提供了一個更強大的工具,就是調用.cu文件。
熟悉matlab+c混合編程的都知道matlab可以把.c,.cc,.cpp等文件編譯為能夠使用的mex文件。對于CUDA程序.cu,matlab也提供了一套方法來調用,最終編譯成.ptx文件。
總結
以上是生活随笔為你收集整理的MATLAB GPU加速的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++调用MATLAB函数
- 下一篇: 数据结构基础(11) --循环链表的设