在程序中可以将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()函数。