在程序中可以將CPU程序中的參數(shù)傳遞給核函數(shù)。
__global__ void add(int a,int b,int *c) {
????*c = a + b;
}
int main(void) {
????int c;
????int *dev_c;
? ? //在分配GPU的內(nèi)存
????cudaMalloc((void**)&dev_c, sizeof(int));
? ? //調(diào)用核函數(shù)
????add <<<1, 1 >>> (2, 7, dev_c);
? ? //將GPU運(yùn)算結(jié)果傳遞給主機(jī)
????cudaMemcpy(&c, dev_c, sizeof(int), cudaMemcpyDeviceToHost);
????printf("2 + 7 = %d\n", c);
? ? //釋放GPU指針內(nèi)存
????cudaFree(dev_c);
????return 0;
}
????其中參數(shù)的傳遞是在核函數(shù)的尖括號(hào)后面,而且需要注意設(shè)備執(zhí)行任何有用的操作都需要分配內(nèi)存。其中cudaMalloc()是分配GPU中內(nèi)存的函數(shù),第一個(gè)參數(shù)是一個(gè)指針,用于保存新分配內(nèi)存地址的變量,第二個(gè)參數(shù)是分配內(nèi)存的大小。
????可以將cudMalloc()分配的指針傳遞給在設(shè)備上執(zhí)行的函數(shù)。設(shè)備中的代碼中使用cudaMalloc()分配的指針進(jìn)行內(nèi)存讀/寫操作。將cudaMalloc()分配的指針傳遞給主機(jī)上執(zhí)行的函數(shù)。指針用完后,需要調(diào)用cudaFree()釋放指針內(nèi)存。cudaMemcpy()函數(shù)是訪問(wèn)設(shè)備內(nèi)存的最常見(jiàn)的方法,其中cudaMemcpyToHost參數(shù)表明運(yùn)行時(shí)源指針時(shí)一個(gè)設(shè)備指針,目標(biāo)指針時(shí)一個(gè)主機(jī)指針,而cudaMemcpyHostToDevice表明與cudaMemcpyToHost相反的含義,還可以填寫cudaMemcpyDeviceToDevice表明兩個(gè)指針都位于設(shè)備上,如果源指針和目標(biāo)指針都位于主機(jī)上,直接調(diào)用標(biāo)準(zhǔn)C的memcpy()函數(shù)。