🔗如何在pytorch中调用cuda算子
2026-5-10
| 2026-5-10
字数 820阅读时长 3 分钟
type
Post
status
Published
date
May 10, 2026
slug
summary
PyTorch 自定义 CUDA 算子编写、绑定与调用示例教程
tags
pytorch
cuda
category
技术分享
icon
password
一个常见需求是:在 PyTorch 中调用自己编写的 CUDA 算子(custom CUDA op),以便验证算子正确性并进行性能评估。下面我以一个最简单的 add 算子为例,演示如何将 CUDA 与 PyTorch Extension 结合起来,从 0 到 1 完成编写、绑定与调用。

目录结构

假设所有文件都放在 operator_extension/ 目录下:
  • add_kernel.cu:CUDA kernel 与 launcher
  • op.h:对外暴露的 C++ 声明(供 .cpp 调用)
  • op.cpp:PyTorch C++ 扩展入口与 pybind11 绑定

1. 编写 CUDA kernel:add_kernel.cu

这里将计算逻辑放在 __global__ kernel 中,并通过 launch_add_op 作为一个干净的 C++ 接口对外暴露,方便后续从 PyTorch 的 C++ 扩展层调用。

2. 声明 launcher 接口:op.h

op.h 主要用于给 PyTorch C++ 侧(.cpp)提供函数声明:

3. 编写 PyTorch 扩展入口与绑定:op.cpp

op.cpp 中完成三件事:
  1. 校验输入 Tensor 是否为 CUDA 且连续
  1. 分配输出 Tensor 并调用 CUDA launcher
  1. 通过 pybind11 将函数暴露给 Python

这样分层设计的好处

  1. CUDA kernel(.cu)与 C++/PyTorch 绑定(.cpp)解耦
    1. Kernel 只关注并行计算;接口层只关注 Tensor 校验、形状推导与 Python 绑定。后续更换绑定方式(pybind / ATen / TorchScript)时,kernel 基本无需改动。
  1. 编译与调试更清晰
    1. .cu 由 NVCC 编译,.cpp 由 C++ 编译器编译,出错信息与编译选项边界更明确;也更便于对 kernel 单独做性能分析(nsys/nvprof)。
  1. 复用与扩展性更强
    1. 同一个 launcher(如 launch_add_op)可以复用到更多算子或更多前端(Python / C++)。新增算子通常只需要在接口层扩展即可。

4. Python 侧编译与调用

使用 torch.utils.cpp_extension.load 进行即时编译(JIT build):
运行后如果输出 Test passed!,说明自定义 CUDA 算子与 PyTorch 的结果一致,你就可以在此基础上继续扩展更复杂的算子逻辑了。
OMV+Jellyfin+Bangumi 看番新姿势(下)OpenClaw 从入门到顺滑:安装、飞书、Dashboard、多个 Agent 全搞定
Loading...