.agents/skills/paddle-op-dev/references/kernel-dev.md
Kernel 在 paddle/phi/kernels 目录下开发。
paddle/phi/kernels/
├── xxx_kernel.h
├── xxx_kernel.cc
├── xxx_grad_kernel.h
└── xxx_grad_kernel.cc
paddle/phi/kernels/
├── xxx_kernel.h # 前向声明
├── cpu/xxx_kernel.cc # CPU 前向实现
├── gpu/xxx_kernel.cu # GPU 前向实现
├── xxx_grad_kernel.h # 反向声明
├── cpu/xxx_grad_kernel.cc # CPU 反向实现
└── gpu/xxx_grad_kernel.cu # GPU 反向实现
template <typename T, typename Context>
void XxxKernel(const Context& dev_ctx,
const DenseTensor& input, // Tensor 输入
int attr1, // 属性输入
DenseTensor* out); // 输出
参数映射:
Tensor -> const DenseTensor&Tensor[] -> const std::vector<const DenseTensor*>&Tensor -> DenseTensor*Tensor[] -> std::vector<DenseTensor*>const Context& dev_ctx使用 PD_REGISTER_KERNEL 宏注册 Kernel:
PD_REGISTER_KERNEL(
kernel_name, // kernel 注册名,与 YAML 中 kernel:func 一致
backend, // 后端:CPU, GPU 等
layout, // 布局:ALL_LAYOUT
kernel_fn, // kernel 函数
data_types... // 支持的数据类型
) {}
示例:
// CPU 注册
PD_REGISTER_KERNEL(
trace, CPU, ALL_LAYOUT, phi::TraceKernel, float, double, int, int64_t, phi::dtype::complex<float>, phi::dtype::complex<double>
) {}
// GPU 注册
PD_REGISTER_KERNEL(
trace, GPU, ALL_LAYOUT, phi::TraceKernel, float, double, int, int64_t, phi::dtype::complex<float>, phi::dtype::complex<double>
) {}
文件:paddle/phi/kernels/trace_kernel.h
#pragma once
#include "paddle/phi/core/dense_tensor.h"
namespace phi {
template <typename T, typename Context>
void TraceKernel(const Context& dev_ctx,
const DenseTensor& x,
int offset,
int axis1,
int axis2,
DenseTensor* out);
} // namespace phi
文件:paddle/phi/kernels/cpu/trace_kernel.cc
#include "paddle/phi/kernels/trace_kernel.h"
#include "paddle/phi/backends/cpu/cpu_context.h"
#include "paddle/phi/core/kernel_registry.h"
// 其他需要的头文件...
namespace phi {
template <typename T, typename Context>
void TraceKernel(const Context& dev_ctx,
const DenseTensor& x,
int offset,
int axis1,
int axis2,
DenseTensor* out) {
// 分配输出内存
dev_ctx.template Alloc<T>(out);
// 实现计算逻辑...
}
} // namespace phi
// 注册 CPU Kernel
PD_REGISTER_KERNEL(
trace, CPU, ALL_LAYOUT, phi::TraceKernel,
float, double, int, int64_t,
phi::dtype::complex<float>, phi::dtype::complex<double>
) {}
文件:paddle/phi/kernels/gpu/trace_kernel.cu
#include "paddle/phi/kernels/trace_kernel.h"
#include "paddle/phi/backends/gpu/gpu_context.h"
#include "paddle/phi/core/kernel_registry.h"
// 其他需要的头文件...
namespace phi {
template <typename T, typename Context>
void TraceKernel(const Context& dev_ctx,
const DenseTensor& x,
int offset,
int axis1,
int axis2,
DenseTensor* out) {
// 分配输出内存
dev_ctx.template Alloc<T>(out);
// GPU 计算逻辑(CUDA kernel 调用等)...
}
} // namespace phi
// 注册 GPU Kernel
PD_REGISTER_KERNEL(
trace, GPU, ALL_LAYOUT, phi::TraceKernel,
float, double, int, int64_t,
phi::dtype::complex<float>, phi::dtype::complex<double>
) {}
trace_grad_kernel.h#pragma once
#include "paddle/phi/core/dense_tensor.h"
namespace phi {
template <typename T, typename Context>
void TraceGradKernel(const Context& dev_ctx,
const DenseTensor& x,
const DenseTensor& out_grad,
int offset,
int axis1,
int axis2,
DenseTensor* x_grad);
} // namespace phi
PD_REGISTER_KERNEL(
trace_grad, CPU, ALL_LAYOUT, phi::TraceGradKernel,
float, double, int, int64_t,
phi::dtype::complex<float>, phi::dtype::complex<double>
) {}
Paddle 与 PyTorch 的算子在数学逻辑上往往一致,实现 Kernel 时可参考 PyTorch 的对应实现来加速开发。
| 类型 | PyTorch 路径 |
|---|---|
| CPU Kernel | aten/src/ATen/native/xxx.cpp |
| GPU Kernel | aten/src/ATen/native/cuda/xxx.cu |
| 算子注册 | aten/src/ATen/native/native_functions.yaml |
| 数学工具 | aten/src/ATen/native/Math.h |
native_functions.yaml 中找到目标算子的声明dispatch 字段定位 CPU/GPU 实现文件DenseTensor、dev_ctx.template Alloc<T>(out) 等)| PyTorch | Paddle |
|---|---|
at::Tensor | phi::DenseTensor |
tensor.data_ptr<T>() | tensor.data<T>() |
tensor.numel() | tensor.numel() |
tensor.dim() | tensor.dims().size() |
tensor.size(i) | tensor.dims()[i] |
tensor.stride(i) | tensor.strides()[i] |
TORCH_CHECK(...) | PADDLE_ENFORCE_XX(...) |
at::parallel_for | phi::funcs::ForRange |
CUDA: AT_DISPATCH_FLOATING_TYPES | 通过 PD_REGISTER_KERNEL 模板参数指定 |
derivatives.yaml 和对应 _backward 实现dev_ctx.template Alloc<T>(out) 分配输出内存XxxKernel(大驼峰)XxxGradKernelkernel:func 一致(全小写+下划线)paddle/phi/backends/cpu/cpu_context.hpaddle/phi/backends/gpu/gpu_context.hpaddle/phi/core/kernel_registry.hfloat, double, int, int64_t, phi::dtype::float16, phi::dtype::bfloat16, phi::dtype::complex<float>, phi::dtype::complex<double>paddle/phi/kernels/funcs/ 中实现 functor