Skip navigation

Beépített GPU függvények

Komplexebb műveletek a GPU-n

Előfordul, hogy komplexebb műveleteket akarunk végezni az adatainkkal. Például, ha van egy kőpünk, akkor azon végezhetünk konvolúció műveletet a MATLAB beépített conv2(...) fggvénye segítségével.

I = double(imread('Lena.png'))/255;
I = rgb2gray(I);
imshow(I);

mask = ones(25)./(25^2);

tic;
result = conv2(I, mask);
toc;
imshow(result);

Láttuk viszont, hogy a convolúció tipikusan olyan művelet ami sokkal gyorsabban fut a GPU-n. A programunk felgyorsítása érdekében ezért mi a MATLAB fejlesztői a legtöbb beépített füöggvénycsomag műveleteit kiterjesztették a GPU-n való futásra.

Ismét csak annyi a dolgunk, hogy a gpuArray(...) függvénnyel áttegyük a képet a grafikus memóriába, és ha a conv2(...) függvény paraméterül gpuArray typusú adatot kap, akkor automatikusan a GPU-n számol majd.

I2 = gpuArray(I);
mask2 = gpuArray(mask);

tic;
result2 = conv2(I2, mask2);
toc;
imshow(result2);

Ezen a ponton meg kell viszont jegyeznünk, hogy van egy kis különbség CPU-n és GPU-n futó függvényei között. Alapértelmezeten ugyanis a MATLAB a CPU-n számol, ami double típusra optimalizált célhardvert tartalmaz. Ezért a MATLAB a nagyobb pontosság érdekében alapvetően 64 bites double értékeket használ.

A GPU ezzel szemben 32 bites float értékekre van optimalizálva, ezért akkor működik optimális hatékonysággal, ha ilyen adattípust használunk. A 32 bites float a MATLAB-ban single névvel van ellátva.

I3 = gpuArray(single(I));
mask3 = gpuArray(single(mask));

tic;
result3 = conv2(I3, mask3);
toc;

imshow(result3);

Feladatok

  • Nézzünk meg még néhány műveltet, hogy működik-e a GPU-n.
  • Mérjük ki a műveltek gyorsulását!