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);