我可以在 CUDA 设备端代码中使用可变参数函数吗?

Can I use vararg functions in CUDA device-side code?

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

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

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

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

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

例如:

#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 - 并且可以工作,前提是您实际传递了一个以 null 结尾的字符串和一个 int。如果 CUDA 的 printf() 本身以这种方式实现,我不会感到惊讶。