cuda编程笔记(25)-- 如何像函数对象一样使用核函数

在C++中,函数可以被归类为可调用对象,可以像参数一样传给其他函数。那么cuda里的核函数想要实现这样的效果应该怎么办呢?

很明显,核函数不可以像普通函数一样被抽象成可调用对象传给std::function,那应该怎么实现?

既然高级语言的抽象用不了,只能使用低级的方式了,那就是宏定义

cpp 复制代码
#define CUDA_KERNEL_CALL(kernel, nblks, nthrs, shmem, stream, ...)   \
  {                                                                  \
      (kernel)<<<(nblks), (nthrs), (shmem), (stream)>>>(__VA_ARGS__);\
      cudaError_t e = cudaGetLastError();                            \
      if (!(e == cudaSuccess || e == cudaErrorCudartUnloading)) {    \
        std::cerr << "CUDA kernel launch error: " << cudaGetErrorString(e) << std::endl;\
        }                                                            \
  }                                                                  \

这个其实和 C/C++ 宏(macro)里的可变参数语法有关,和 CUDA 本身没关系。

宏里的 ...__VA_ARGS__

在宏定义里,如果最后写上 ...,就表示这个宏可以接收可变数量的参数

例如:

cpp 复制代码
#define PRINTF(fmt, ...) printf(fmt, __VA_ARGS__)

调用时:

cpp 复制代码
PRINTF("a=%d, b=%d\n", 1, 2);

展开后就是:

cpp 复制代码
printf("a=%d, b=%d\n", 1, 2);

这里 ... 就是占位符,__VA_ARGS__ 是一个特殊的标识符,表示"把传进来的所有可变参数原封不动填进去"。

必须成对用 ...__VA_ARGS__

  • ... 是宏定义时的"声明"

  • __VA_ARGS__ 是宏展开时的"使用"

就像函数声明参数,然后函数体里使用参数一样。

例子

cpp 复制代码
#define CUDA_KERNEL_CALL(kernel, nblks, nthrs, shmem, stream, ...)   \
  {                                                                  \
      (kernel)<<<(nblks), (nthrs), (shmem), (stream)>>>(__VA_ARGS__);\
      cudaError_t e = cudaGetLastError();                            \
      if (!(e == cudaSuccess || e == cudaErrorCudartUnloading)) {    \
        std::cerr << "CUDA kernel launch error: " << cudaGetErrorString(e) << std::endl;\
        }                                                            \
  }                                                                  \

__global__ void globalCopy(const float* data, float* out,const int N) {
    int idx = threadIdx.x + blockIdx.x * blockDim.x;
    if (idx < N) {
        out[idx] = data[idx];
    }
}

//调用端
CUDA_KERNEL_CALL(globalCopy,1,32,0,0,d_data,d_out,32)

这样想调用哪个核函数,都可以用这个宏

相关推荐
alwaysuzybaiyy31 分钟前
物联网控制|计算机控制-刘川来胡乃平版|第4章:过程通道与人机接口-4.4Human-Machine Interface|课堂笔记|
笔记·物联网·powerpoint
弘毅 失败的 mian1 小时前
C++、Java 还是测试开发?
java·c++·经验分享·笔记·测试开发·技术方向·就业
AA陈超2 小时前
ASC学习笔记0019:返回给定游戏属性的当前值,如果未找到该属性则返回零。
c++·笔记·学习·游戏·ue5·虚幻引擎
星星20256 小时前
VSCode插件精选:4款高效UML绘图工具
笔记
lkbhua莱克瓦2410 小时前
Java基础——方法
java·开发语言·笔记·github·学习方法
p666666666811 小时前
STM32-bootloader引导程序跳转机制笔记
笔记·stm32·嵌入式硬件
智者知已应修善业12 小时前
【c语言蓝桥杯计算卡片题】2023-2-12
c语言·c++·经验分享·笔记·算法·蓝桥杯
Elias不吃糖14 小时前
NebulaChat项目构建笔记
linux·c++·笔记·多线程
d111111111d14 小时前
STM32外设学习-串口数据包笔记-(程序)
笔记·stm32·单片机·嵌入式硬件·学习
弘毅 失败的 mian15 小时前
编译和链接
c语言·经验分享·笔记·编程入门