[英]Kernel parameter passing in CUDA?
关于CUDA内核如何工作,我有一个新手怀疑。
如果有以下代码(使用从此处获取的函数cuPrintf
):
#include "cuPrintf.cu"
__global__ void testKernel(int param){
cuPrintf("Param value: %d\n", param);
}
int main(void){
// initialize cuPrintf
cudaPrintfInit();
int a = 456;
testKernel<<<4,1>>>(a);
// display the device's greeting
cudaPrintfDisplay();
// clean up after cuPrintf
cudaPrintfEnd();
}
执行的输出是:
Param value: 456
Param value: 456
Param value: 456
Param value: 456
我无法得到内核如何读取我传递的参数的正确值,是不是在主机内存中分配了? GPU可以从主机内存中读取吗?
谢谢,
安德里亚
根据E.2.5.2节。 “ CUDA C编程指南”中的函数参数
__global__函数参数传递给设备:
声明void testKernel(int param)
表示param
是通过值传递的,而不是通过引用传递的。 换句话说,该堆栈包含的拷贝a
的值,而不是一个指向a
。 CUDA将堆栈复制到GPU上运行的内核。
根据CUDA编程指南(附录B.16),参数通过共享内存传递给设备。
在实际函数参数之前评估执行配置的参数,并且像函数参数一样 ,当前通过共享内存传递给设备。
在运行时API中, 全局函数的参数被隐式编组并从主机复制到设备。
NVCC编译器生成隐藏编组的代码。 您可以在CUDA编程指南中找到参数大小和限制
调用它们时,参数将传递给内核; 否则你怎么会与GPU沟通? 它与在着色器中设置制服背后的想法相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.