在CUDA中传递内核参数?

And*_*rea 16 c c++ memory 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();
}
Run Code Online (Sandbox Code Playgroud)

执行的输出是:

Param value: 456
Param value: 456
Param value: 456
Param value: 456
Run Code Online (Sandbox Code Playgroud)

我无法得到内核如何读取我传递的参数的正确值,是不是它在主机内存中分配?GPU可以从主机内存中读取吗?

谢谢,

安德里亚

phi*_*hil 17

根据E.2.5.2节." CUDA C编程指南"中的"函数参数"

__global__函数参数传递给设备:

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


Jes*_*all 13

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