在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: 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之間的數據交換,大致有如下幾個函數和功能:
? ? ? ? ? (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=toctic
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 = tocerror = 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時可以缺省