当前位置: 首页 > news >正文

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

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

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

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

#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__

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

例如:

#define PRINTF(fmt, ...) printf(fmt, __VA_ARGS__)

调用时:

PRINTF("a=%d, b=%d\n", 1, 2);

展开后就是:

printf("a=%d, b=%d\n", 1, 2);

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

必须成对用 ...__VA_ARGS__

  • ... 是宏定义时的“声明”

  • __VA_ARGS__ 是宏展开时的“使用”

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

例子

#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)

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

http://www.dtcms.com/a/427366.html

相关文章:

  • K230基础-摄像头基本原理
  • 数学笔记①
  • 企业为什么要网站建设seo推广哪家服务好
  • 详细解说基于mysql分布式锁的三种实现方式
  • 外贸网站设计注意事项网站繁体和中文这么做
  • AdGuard解锁订阅版高级版 安卓广告拦截器APP v4.11.63 / 4.13.7 Nightly MOD
  • 网站建设免费书江宁网站制作
  • claude code + claude code router 接入魔搭、openrouter等
  • 图观 流渲染场景服务器
  • Android Studio 代码混淆核心解释
  • 雨晨WIN11PE网络版VIP资源国庆限时开放
  • 网站改版Excel怎么做泰安抖音seo
  • Websocket+Redis实现微服务消息实时同步
  • 仪器仪表第四节课学习笔记
  • Java 黑马程序员学习笔记(进阶篇15)
  • 【开题答辩过程】以《基于SpringBoot+Vue+uni-app的智慧校园服务系统的设计与实现》为例,不会开题答辩的可以进来看看
  • 做二手电脑的网站宣城网站建设 有限公司
  • 没有服务器 怎么做网站建设企业高端网站
  • 极简时钟APP(手机全能计时工具) 极简版
  • 华为光模块命名规则
  • 做企业网站用什么cms好易语言怎么做网页网站
  • 域名做网站北京 网站 公司
  • 深入浅出 Redis:从核心原理到运维实战指南一
  • 自定义含工具包`Ubuntu22.04.5.iso`镜像
  • Day 29 - 密码管理器开发 - Python学习笔记
  • Docker镜像结构全解析
  • ubuntu 22.04安装CUDA 13.0
  • 鸿蒙NEXT Wi-Fi扫描开发指南:从基础到实战
  • wordpress做的学校网站北京网页设计公司
  • 精读 C++20 设计模式:行为型设计模式——观察者模式