CUDA编程——核函数参数传递与GPU内存分配与调用

在程序中可以将CPU程序中的参数传递给核函数。

__global__ void add(int a,int b,int *c) {

*c = a + b;

}

int main(void) {

int c;

int *dev_c;

//在分配GPU的内存

cudaMalloc((void**)&dev_c, sizeof(int));

//调用核函数

add <<<1, 1 >>> (2, 7, dev_c);

//将GPU运算结果传递给主机

cudaMemcpy(&c, dev_c, sizeof(int), cudaMemcpyDeviceToHost);

printf("2 + 7 = %d\n", c);

//释放GPU指针内存

cudaFree(dev_c);

return 0;

}

其中参数的传递是在核函数的尖括号后面,而且需要注意设备执行任何有用的操作都需要分配内存。其中cudaMalloc()是分配GPU中内存的函数,第一个参数是一个指针,用于保存新分配内存地址的变量,第二个参数是分配内存的大小。

可以将cudMalloc()分配的指针传递给在设备上执行的函数。设备中的代码中使用cudaMalloc()分配的指针进行内存读/写操作。将cudaMalloc()分配的指针传递给主机上执行的函数。指针用完后,需要调用cudaFree()释放指针内存。cudaMemcpy()函数是访问设备内存的最常见的方法,其中cudaMemcpyToHost参数表明运行时源指针时一个设备指针,目标指针时一个主机指针,而cudaMemcpyHostToDevice表明与cudaMemcpyToHost相反的含义,还可以填写cudaMemcpyDeviceToDevice表明两个指针都位于设备上,如果源指针和目标指针都位于主机上,直接调用标准C的memcpy()函数。