Matlab 使用GPU加速 转载
在matlab中使用GPU加速,來加速矩陣運算。
首先如前面所說,并不是所有GPU都能在maltab中進行加速的,貌似只有NVDIA的顯卡可以吧。
硬件:GeForce GTX 980
軟件:Matlab 2015a ?(Matlab 2012以后的版本才帶有GPU加速的工具箱)
下面開始介紹怎么玩GPU加速
第一步:在matlab命令窗口,運行gpuDevice,查看自己的顯卡是否具備GPU加速功能
gpuDevice正常情況下matlab會輸出如下結(jié)果代表具備GPU加速功能:
CUDADevice with properties:Name: 'GeForce GTX 980'Index: 1ComputeCapability: '5.2'SupportsDouble: 1DriverVersion: 7.5000ToolkitVersion: 6.5000MaxThreadsPerBlock: 1024MaxShmemPerBlock: 49152MaxThreadBlockSize: [1024 1024 64]MaxGridSize: [2.1475e+09 65535 65535]SIMDWidth: 32TotalMemory: 4.2950e+09AvailableMemory: 3.3203e+09MultiprocessorCount: 16ClockRateKHz: 1380000ComputeMode: 'Default'GPUOverlapsTransfers: 1KernelExecutionTimeout: 1CanMapHostMemory: 1DeviceSupported: 1DeviceSelected: 1第二步:CPU和GPU之間的數(shù)據(jù)交換,大致有如下幾個函數(shù)和功能:
? ? ? ? ? (1)、將數(shù)據(jù)從CPU中搬入GPU,函數(shù):gpuArray,用法 M = gpuArray(M);
? ? ? ? ? (2)、在GPU中計算完成后,將數(shù)據(jù)搬出到CPU存儲,函數(shù):gather,用法M=gather(M)。
下面給大家看看最簡單的用法以及處理同樣矩陣運算時的時間對比:
clear all clc M = rand(2000,2000); % 生成一個隨機矩陣 tic [A1,B1] = eig(M); % 求該隨機矩陣的特征值和特征向量 t1=toc tic M = gpuArray(M); % 將數(shù)據(jù)從CPU中搬到GPU [A2,B2] = eig(M); % 求特征值和特征向量 A2 = gather(A2); % 將數(shù)據(jù)從GPU中搬到CPU t2 = toc輸出結(jié)果(運行時間對比):
t1 = 14.1483 t2 = 9.1567總結(jié):雖然加速不是特別明顯,不過還是非常給力的,需要說明的是,一般的GPU對于單精度型的數(shù)據(jù)運算加速更明顯一點,因此我們在編寫代碼時,最好能夠?qū)?shù)據(jù)從double型轉(zhuǎn)換為single型,即M=single(M),然后在使用M=gpuArray(M),將數(shù)據(jù)搬遷到GPU進行計算,下面看看轉(zhuǎn)換為單精度型后的時間對比:
clear all clc M = rand(2000,2000); % 生成一個隨機矩陣 tic [A1,B1] = eig(M); % 求該隨機矩陣的特征值和特征向量 t1=toctic M = single(M); % 將數(shù)據(jù)轉(zhuǎn)換為單精度型 M = gpuArray(M); % 將數(shù)據(jù)從CPU中搬到GPU [A2,B2] = eig(M); % 求特征值和特征向量 A2 = gather(A2); % 將數(shù)據(jù)從GPU中搬到CPU t2 = toc運行結(jié)果:
t1 = 14.8332 t2 = 5.0963GPU對eig和svd進行加速,和cpu運行時間對比
clear all A = rand(2000,2000); tic A1 = gpuArray(single(A)); [U,S,V] = svd(A1,'econ'); A2 = U*S*V'; A3 = gather(A2); t = toc tic [U1,S1,V1] = svd(A,'econ'); A4 = U1*S1*V1'; t2 = tocerror = norm(A3-A4,'fro')tic A1 = gpuArray(single(A)); [vv,dd] = eig(A1); t3 = toc結(jié)果:
t = 3.1564 t2 = 7.1644 error = 0.0032 t3 = 5.2244 t4 = 17.6389
是不是加速更明顯了呢?
注:1、單精度型初始化矩陣函數(shù)例:X=rand(10,'single'); ?%定義在CPU上的一個10x10的隨機初始化數(shù)組
? ? ? 2、直接在GPU中初始化矩陣例:GX=rand(10,'gpuArray'); ??%直接在GPU設(shè)備上隨機初始化一個10x10的數(shù)組
3、判斷數(shù)據(jù)DATA是否存在于GPU內(nèi)存中例:TF=existOnGPU(DATA)
? ? ? 4、計算效率統(tǒng)計例:t=gputimeit(F,N)???????? %返回執(zhí)行F操作N次所需的時間,當N=1時可以缺省
轉(zhuǎn)載于:https://www.cnblogs.com/phyzrx/p/7475201.html
總結(jié)
以上是生活随笔為你收集整理的Matlab 使用GPU加速 转载的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 接近3个小时!两个One More Th
- 下一篇: Win11测试版又出bug:C盘没24G