Matlab+GPU加速學習筆記(一)


在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時可以缺省 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM