我做了一个宏来简化 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/