在matlab中使用GPU加速,來加速矩陣運算。
首先如前面所說,並不是所有GPU都能在maltab中進行加速的,貌似只有NVDIA的顯卡可以吧。
硬件:GeForce GTX 980
軟件:Matlab 2015a (Matlab 2012以后的版本才帶有GPU加速的工具箱)
下面開始介紹怎么玩GPU加速
第一步:在matlab命令窗口,運行gpuDevice,查看自己的顯卡是否具備GPU加速功能
gpuDevice
正常情況下matlab會輸出如下結果代表具備GPU加速功能:
CUDADevice with properties: Name: 'GeForce GTX 980' Index: 1 ComputeCapability: '5.2' SupportsDouble: 1 DriverVersion: 7.5000 ToolkitVersion: 6.5000 MaxThreadsPerBlock: 1024 MaxShmemPerBlock: 49152 MaxThreadBlockSize: [1024 1024 64] MaxGridSize: [2.1475e+09 65535 65535] SIMDWidth: 32 TotalMemory: 4.2950e+09 AvailableMemory: 3.3203e+09 MultiprocessorCount: 16 ClockRateKHz: 1380000 ComputeMode: 'Default' GPUOverlapsTransfers: 1 KernelExecutionTimeout: 1 CanMapHostMemory: 1 DeviceSupported: 1 DeviceSelected: 1
第二步:CPU和GPU之間的數據交換,大致有如下幾個函數和功能:
(1)、將數據從CPU中搬入GPU,函數:gpuArray,用法 M = gpuArray(M);
(2)、在GPU中計算完成后,將數據搬出到CPU存儲,函數:gather,用法M=gather(M)。
下面給大家看看最簡單的用法以及處理同樣矩陣運算時的時間對比:
clear all clc M = rand(2000,2000); % 生成一個隨機矩陣 tic [A1,B1] = eig(M); % 求該隨機矩陣的特征值和特征向量 t1=toc tic M = gpuArray(M); % 將數據從CPU中搬到GPU [A2,B2] = eig(M); % 求特征值和特征向量 A2 = gather(A2); % 將數據從GPU中搬到CPU t2 = toc
輸出結果(運行時間對比):
t1 = 14.1483 t2 = 9.1567
總結:雖然加速不是特別明顯,不過還是非常給力的,需要說明的是,一般的GPU對於單精度型的數據運算加速更明顯一點,因此我們在編寫代碼時,最好能夠將數據從double型轉換為single型,即M=single(M),然后在使用M=gpuArray(M),將數據搬遷到GPU進行計算,下面看看轉換為單精度型后的時間對比:
clear all clc M = rand(2000,2000); % 生成一個隨機矩陣 tic [A1,B1] = eig(M); % 求該隨機矩陣的特征值和特征向量 t1=toc tic M = single(M); % 將數據轉換為單精度型 M = gpuArray(M); % 將數據從CPU中搬到GPU [A2,B2] = eig(M); % 求特征值和特征向量 A2 = gather(A2); % 將數據從GPU中搬到CPU t2 = toc
運行結果:
t1 = 14.8332 t2 = 5.0963
GPU對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 = toc error = norm(A3-A4,'fro') tic A1 = gpuArray(single(A)); [vv,dd] = eig(A1); t3 = toc
結果:
t = 3.1564 t2 = 7.1644 error = 0.0032 t3 = 5.2244 t4 = 17.6389
是不是加速更明顯了呢?
注:1、單精度型初始化矩陣函數例:X=rand(10,'single'); %定義在CPU上的一個10x10的隨機初始化數組
2、直接在GPU中初始化矩陣例:GX=rand(10,'gpuArray'); %直接在GPU設備上隨機初始化一個10x10的數組
3、判斷數據DATA是否存在於GPU內存中例:TF=existOnGPU(DATA)
4、計算效率統計例:t=gputimeit(F,N) %返回執行F操作N次所需的時間,當N=1時可以缺省