我可以在 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()
本身以这种方式实现,我不会感到惊讶。
我知道我们不能用可变数量的参数编写 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()
本身以这种方式实现,我不会感到惊讶。