我对CUDA内核如何工作有一个新手怀疑。
如果有以下代码(使用从here获取的函数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可以从主机内存中读取吗?
谢谢,
安德烈
答案 0 :(得分:16)
根据E.2.5.2节。 CUDA C Programming Guide
中的函数参数__ global__函数参数传递给设备:
答案 1 :(得分:13)
声明void testKernel(int param)
表示param
是按值传递的,而不是通过引用传递的。换句话说,堆栈包含a
值的副本,而不是指向a
的指针。 CUDA将堆栈复制到GPU上运行的内核。
答案 2 :(得分:3)
根据CUDA编程指南(附录B.16),参数通过共享内存传递给设备。
执行的参数 配置在之前评估 实际的函数参数和之类的 函数参数,目前 通过共享内存传递给 设备
答案 3 :(得分:0)
当你调用它们时,参数会传递给内核;否则你怎么会与GPU沟通?它与在着色器中设置制服背后的想法相同。
答案 4 :(得分:0)
在运行时API中,全局函数的参数被隐式编组并从主机复制到设备。
NVCC编译器会生成隐藏编组的代码。您可以在CUDA Programming Guide
中找到参数大小和限制