c++ - 带有模板的 CUDA 内核启动宏

标签 c++ templates macros cuda kernel

我做了一个宏来简化 CUDA 内核调用:

#define LAUNCH LAUNCH_ASYNC

#define LAUNCH_ASYNC(kernel_name, gridsize, blocksize, ...) \
    LOG("Async kernel launch: " #kernel_name);              \
    kernel_name <<< (gridsize), (blocksize) >>> (__VA_ARGS__);

#define LAUNCH_SYNC(kernel_name, gridsize, blocksize, ...)     \
    LOG("Sync kernel launch: " #kernel_name);                  \
    kernel_name <<< (gridsize), (blocksize) >>> (__VA_ARGS__); \
    cudaDeviceSynchronize();                                   \
    // error check, etc...

用法:

LAUNCH(my_kernel, 32, 32, param1, param2)

LAUNCH(my_kernel<int>, 32, 32, param1, param2)

这很好用;通过第一个定义,我可以为调试启用同步调用和错误检查。

但是它不适用于如下所示的多个模板参数:

LAUNCH(my_kernel<int,float>, 32, 32, param1, param3)

我在调用宏的行中得到的错误消息:

error : expected a ">"

是否可以让这个宏与多个模板参数一起工作?

最佳答案

问题在于预处理器对尖括号嵌套一无所知,因此它将它们之间的逗号解释为宏参数分隔符。

如果内核启动语法支持内核名称周围的括号(我现在无法检查,不是在 CUDA 机器上),您可以这样做:

LAUNCH((my_kernel<int, float>), 32, 32, param1, param3)

关于c++ - 带有模板的 CUDA 内核启动宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14874351/

相关文章:

c++ - sdl_ttf 填充不良的表面

c++ - 调用 std::cout.rdbuf() 产生语法错误

c++ - 使用 Atomic Builtins 旋转线程屏障

c++ - 用 C++ 模板替换函数调用的 C 宏?

c++ - undefined reference 编译 OpenFP

c++ - 如何在不指定不必要的模板参数的情况下使用模板类的成员类型?

python - 如何在 django 中访问媒体文件

C++ 函数 switch 语句或数组对宏值的抽象

macros - 如何使用宏读取 SPSS 中的多个 Excel 文件?

c++ - 按值与按引用传递标准算法迭代器参数