A GPU programozásánál külön kell foglalkoznunk a memória kezelésével is. A GPU-nak ugyanis saját memóriája (grafikus memória) van, és a kernelek csak ebből a memóriából képesek adatokat olvasni, és csak ide képesek adatokat írni.
A GRafikus memória kezelésére a CUDA függvénykönyvtárban külön függvények vannak. A memória fogalalására a cudaMalloc függvényt használhatjuk. Formája:
- void cudaMalloc(void** devPtr, size_t size): lefoglal számunkra a GPU-n egy memóriaterületet. Paraméterei:
- devPtr: Pointer a lefoglalt memória címének;
- size: A lefoglalni kívánt memóriaterület mérete.
A cuda Malloc parancs segítségével általában minden foglalunk egy területet a GPU-n minden szükséges adatnak:
cudaMalloc((void**)&dev_c, sizeof(int) );
Ha le van foglalva a memória, akkor át kell tenni a feldolgozni kívánt adatokat a GPU-ra.el kell végezni a számítást, majd az eredményeket vissza kell másolni a központi memóriába.
A memória másolásához használhatjuk a cudaMemcpy() függvényt.
- cudaMemcpy( void* dst, const void* src, size_t count, enum cudaMemcpyKind kind): adatot másol két memóriaterület között. Paraméterei:
- dst: A cél terület első byte-jára mutató pointer;
- src: A forrás terület első byte-jára mutató pointer;
- count: Másoln kívánt bype-ok száma;
- kind: Másolás iránya. Ez a paraméter meghatrozza, hogy a központi, és a grafikus memória között milyen irányba másolunk. Értéke lehet:
- cudaMemcpyHostToHost,
- cudaMemcpyHostToDevice,
- cudaMemcpyDeviceToHost,
- cudaMemcpyDeviceToDevice.
A fenti kódrészletben a bemeneti adatokat nem kell átmásolni a kernelnek. A keretrendszer a függvények paramétereit automatikusan átteszi a grafikus memóriába. A visszatérési értéket viszont a kernel csak a GPU RAM-ba tudja menteni így azt utólag kell visszamásolni.
cudaMemcpy(&c, dev_c, sizeof(int), cudaMemcpyDeviceToHost);
Az adatkezelés végére már csak a takarítás marad. A lefoglalt memóriaterületek felszabadításáról ugyanis nekünk kell gondoskodni a cudaFree() függvénnyel.
- cudaFree(void* ptr): Felszabadít egy megadott memóriaterületet a grafikus memóriában. Paramétere:
- ptr: A felszabadítandó memóriaterületre mutató pointer.