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)

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

相关推荐
hanlin035 小时前
刷题笔记:力扣第32题-最长有效括号
笔记·算法·leetcode
xian_wwq6 小时前
【学习笔记】Milvus 如何完成一次向量相似度检索,Milvus 索引到底应该怎么选?-15
笔记·学习·milvus
wujiuhsu9 小时前
图片里的简体中文怎么翻译成繁体?商品图、详情页和海报批量转换方法
经验分享·笔记
keyipatience13 小时前
JS学习笔记(2)数组,函数,作用域,对象
前端·javascript·笔记·学习·html
你想知道什么?13 小时前
词向量总结-学习笔记
人工智能·笔记·学习
He BianGu13 小时前
【笔记】WPF中RenderOptions类的详细功能
笔记·wpf
用AI来创业吧13 小时前
网站建设公司哪家好:报价差 3 倍,差在哪四项成本上(选型笔记)
笔记·性能优化·软件工程·安全威胁分析
一支蜉蝣15 小时前
Day25 XD安全笔记 安全开发-PHP 应用&文件管理模块&包含&上传&遍历&写入&删除&下载&安全
笔记·网络安全·php
Awh-15 小时前
ARM 裸机开发 DAY10 学习笔记
arm开发·笔记·学习
He BianGu15 小时前
【笔记】WPF中CachingHint的功能
笔记·wpf