CUDA中的内核参数传递

Kernel parameter passing in CUDA?

本文关键字:参数传递 内核 CUDA      更新时间:2023-10-16

对于CUDA内核是如何工作的,我有一个新手的疑问。

如果有以下代码(使用此处的函数cuPrintf):

#include "cuPrintf.cu"
__global__ void testKernel(int param){
    cuPrintf("Param value: %dn", 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可以从主机内存中读取吗?

谢谢,

Andrea

根据E.2.5.2节。CUDA C编程指南中的功能参数

__global__函数参数传递到设备:

  • 经由共享存储器并且在计算能力为1x的设备上被限制为256字节
  • 并且在计算能力2.x及更高的设备上被限制为4KB

声明void testKernel(int param)表示param是通过值传递的,而不是通过引用传递的。换句话说,堆栈包含a值的副本,而不是指向a的指针。CUDA将堆栈复制到GPU上运行的内核。

根据CUDA编程指南(附录B.16),参数通过共享内存传递到设备。

执行的自变量在实际函数参数和类似函数参数,当前为通过共享内存传递到装置

当您调用这些参数时,它们会被传递给内核;否则,您将如何与GPU通信?这与在着色器中设置统一材质背后的想法相同。

在运行时API中,全局函数的参数隐式编组并从主机复制到设备。

NVCC编译器生成对您隐藏编组的代码。您可以在CUDA编程指南

中找到参数大小和限制