【问题标题】:Kernel parameter passing in CUDA?在 CUDA 中传递内核参数?
【发布时间】:2011-06-27 21:15:33
【问题描述】:

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

谢谢,

安德烈亚

【问题讨论】:

  • 函数变量被 NVCC 编译器隐式编组并复制到设备中。

标签: c++ c memory cuda


【解决方案1】:

根据 E.2.5.2 节。 CUDA C Programming Guide中的函数参数

__global__ 函数参数传递给设备:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 所以,如果我理解正确的话,在内核执行期间param 将进入GPU 内存堆栈。因此,如果我多次阅读它,我将不会访问任何“主机内存”,从而降低性能,对吧?
    • 文档并不清楚内核参数的存储位置。您可以假设它在快速内存中:寄存器、共享或常量。正如 kirbuchi 在他的回答中所说,CUDA 编程指南(3.0 指南中的第 B.13 节)说“执行配置的参数在实际函数参数之前进行评估,并且与函数参数一样,当前通过共享内存传递给设备”。
    • 完美。再次感谢您的所有回答。
    【解决方案3】:

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

    执行的参数 配置之前评估 实际的函数参数和 喜欢 函数参数,目前是 通过共享内存传递给 设备。

    【讨论】:

    • 引用指的是执行配置参数(4 和 1),而不是 OP 询问的函数参数(a == 456)。
    • @Steve 你是对的,但是它将它们与它所说的也通过共享内存传递的函数参数进行比较。应该强调那部分:)
    • 传递内核参数的方法因架构而异。计算能力 1.* 设备将值放在共享内存中。计算能力 >= 2.0 将值放入常量内存中。
    • 那并不是真正的场景,因为你可以修改每个参数,假设 ar 是一个 int 参数,因此 - 你我写: at = threadIdx.x;这不会导致您修改块中所有线程的唯一共享值。
    【解决方案4】:

    参数在调用时传递给内核;否则你将如何与 GPU 通信?这与在着色器中设置制服背后的想法相同。

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 2019-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-14
        • 1970-01-01
        • 1970-01-01
        • 2011-05-09
        • 1970-01-01
        相关资源
        最近更新 更多