看GPU代码中, 发现都只拷贝数组到显存中,而对其它参数都可以直接传递给核函数,难道这些变量就可以不用拷贝到显存中而直接使用么?
比如
cuda_alloc_test(int size){
float* dev_a;
float* a = new float[size];
cudamalloc((void**)&dev_a, size*sizeof(float))
dot<<<blocks,threads>>>(size,dev_a);
cudamemcpy(a ,dev_a , size*sizeof(flaot), cudamemcpyhosttodevice);
}
对size 就不需要在device 中申请 dev_size,而直接传递变量 么?
LZ您好:
1:kernel参数列表中的所有参数自身都将在调用kernel函数的时候,自动复制到device端。这一点和普通的c语言中的调用函数时参数的处理是相似的,都是复制过去。
2:正因为1:,所以这些参数本身都必须在host端保存,否则host端将无法访问到这些参数并复制给device端。
3:数组/线性缓冲区的用法也符合上述要求。您需要在host端定义一个指针,并用这个指针指向cudaMalloc()申请到的device端空间的地址。(也就是这个指针本身在host端存储,但是其保存的地址信息则是device端的地址,在host端是无效的。)
这样,您在启动kernel函数的时候,会将这个host端保存的指针复制给device端,因为这个指针自身保存在host端,所以这个赋值是没有问题的。
同时这个指针保存的地址是device端的地址,这样kenrel函数在device端执行的时候,也能访问到正确的device端的存储空间(一般是global memory)。
4:如果是本身在host端定义一个数组a,并将数组名a作为参数给kernel函数,那么在启动函数的时候,复制参数这一步是没有问题的,但是数组名作为指向数组的指针,其保存的数组的首地址,这个地址是host端的地址,在device端是无效的,kernel一般会就此挂掉。
http://cudazone.nvidia.cn/forum/forum.php?mod=viewthread&tid=7056&extra=page%3D1
近期的这个帖子就是4:中叙述的问题。
大致如上,祝您编码顺利~