在CUDA中传递内核参数?

时间:2011-06-27 21:15:34

标签: c++ c memory cuda

我对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可以从主机内存中读取吗?

谢谢,

安德烈

5 个答案:

答案 0 :(得分:16)

根据E.2.5.2节。 CUDA C Programming Guide

中的函数参数

__ global__函数参数传递给设备:

  • 通过共享内存,在计算能力1.x,
  • 的设备上限制为256字节
  • 通过常量内存,在计算能力2.x及更高版本的设备上限制为4 KB。

答案 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

中找到参数大小和限制