繁体   English   中英

在CUDA中传递内核参数?

[英]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__函数参数传递给设备:

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

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

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

在实际函数参数之前评估执行配置的参数,并且像函数参数一样 ,当前通过共享内存传递给设备。

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

NVCC编译器生成隐藏编组的代码。 您可以在CUDA编程指南中找到参数大小和限制

调用它们时,参数将传递给内核; 否则你怎么会与GPU沟通? 它与在着色器中设置制服背后的想法相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM