A kód CPU-n futó részén az előkészítés egy külön függvényben, az initCUDA(...) -ban kapott helyet.
Az elékszítés most több lépésben zajlik.
A függvényben először lekérdezzük, hogy hány és milyen GPU van a számítógépben, és kiírjuk a paramétereit.
int deviceCount = 0;
CUresult err = cuInit(0);
int major = 0, minor = 0;
if (err == CUDA_SUCCESS)
checkCudaErrors(cuDeviceGetCount(&deviceCount));
if (deviceCount == 0) {
fprintf(stderr, "Error: no devices supporting CUDA\n");
exit(-1);
}
// get first CUDA device
checkCudaErrors(cuDeviceGet(&device, 0));
char name[100];
cuDeviceGetName(name, 100, device);
printf("> Using device 0: %s\n", name);
// get compute capabilities and the devicename
checkCudaErrors(cuDeviceComputeCapability(&major, &minor, device));
printf("> GPU Device has SM %d.%d compute capability\n", major, minor);
checkCudaErrors(cuDeviceTotalMem(&totalGlobalMem, device));
printf(" Total amount of global memory: %llu bytes\n",
(unsigned long long)totalGlobalMem);
printf(" 64-bit Memory Address: %s\n",
(totalGlobalMem > (unsigned long long)4 * 1024 * 1024 * 1024L) ?
"YES" : "NO");
Meg kell jegyezni, hogy ez a programnak nem volt szerves része.
A következő kódrészek viszont elengedhetetlenek. A Teljes kód sok hibakezelést használ, de mi itt csak a lényegi részekre térünk ki.
Először is létre kell hozni egy kontextust, amiben dolgozni tudunk.
err = cuCtxCreate(&context, 0, device);
A következő lépés a modul betültése. Itt gyakorlatilag be kell tölteni a filet, ami a lefordított kernelt tartalmazza.
err = cuModuleLoad(&module, module_file);
Ha a modul be van töltve ki kell választani belőle azt a kernel függvényt ,amit valójában el akarunk indítani.
err = cuModuleGetFunction(&function, module, kernel_name);
Innentől kezdve a programunk készen áll az indításra.
Végül már csak annyi dolgunk maradt, hogy elő kell készítenünk a GPU memóriát, és át kell másolnunk bele a használt adatokat. Ez a CUDA driver-api-ban megszokotthoz hasonló cuMemAlloc(...), és cuMemcpyHtoD(...) függvényekkel történik.
cuMemAlloc(d_a, sizeof(int) * N);
cuMemAlloc(d_b, sizeof(int) * N);
cuMemAlloc(d_c, sizeof(int) * N);
és
cuMemcpyHtoD(d_a, a, sizeof(int) * N);
cuMemcpyHtoD(d_b, b, sizeof(int) * N);