【问题标题】:Can I use vararg functions in CUDA device-side code?我可以在 CUDA 设备端代码中使用可变参数函数吗?
【发布时间】:2020-03-30 06:09:20
【问题描述】:

我知道我们不能用可变数量的参数编写 CUDA 内核:

Is it possible to have a CUDA kernel with varying number of parameters?

(至少不是 C 可变参数的意义;我们可以使用 C++ 可变参数模板。)

但是非内核设备端代码,即__device__ 函数呢?这些可以是可变参数函数吗?

【问题讨论】:

    标签: cuda variadic-functions gpgpu


    【解决方案1】:

    是的,我们可以编写可变参数设备端函数。

    例如:

    #include <stdio.h>
    #include <stdarg.h>
    
    __device__ void foo(const char* str, ...) 
    {
        va_list ap;
        va_start(ap, str);
        int arg = va_arg(ap, int); // making an assumption here
        printf("str is \"%s\", first va_list argument is %d\n", str, arg);
    }
    

    这个compiles fine with NVCC - 并且有效,前提是您实际上传递了一个以空字符结尾的字符串和一个int。如果 CUDA 的 printf() 本身以这种方式实现,我不会感到惊讶。

    【讨论】:

    • 对于那些对 C++ 可变参数模板感到好奇的人 - 它们无需修改也能正常工作。
    • @IGarFieldI:在问题中提到了这一点。此外,NVIDIA 的文档和培训材料清楚地说明了这一点。
    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多