ATen、c10、torch.library分别负责什么?PyTorch的Dispatch机制是什么?ATen、c10、torch.library分别负责什么?
同一个「逻辑算子」(比如 torch.add)在不同设备(CPU/CUDA)、不同数据类型(float/int)、不同后端(如 MPS、XLA)上要有不同实现。若在 Python 里写满 if-else,代码会爆炸且难以扩展。Dispatch 的作用:根据 tensor 的设备、dtype、layout 等,在运行时把一次调用派发到对应的 C++/CUDA 实现,对用户只暴露一个 torch.add 接口。
torch.add(a, b) 等,多数会进 C++ 的 dispatch 表。CPU、CUDA、Autograd、Autocast 等),按优先级选一个 key,再根据 key 找到已注册的 kernel(实现体)。add 在 CUDA key 下注册了 CUDA 实现,在 CPU 下注册了 CPU 实现。反向时还有 Autograd key 下的梯度实现。这样,加新设备或新 dtype 只需注册新 kernel,不必改所有调用方。
ATen(A Tensor Library) 是 PyTorch 的核心 C++ 张量运算库:绝大多数「数学算子」的实现都在这里(CPU 与 CUDA)。你用的 torch.add、torch.mm、conv2d 等,在 C++ 侧大多是 ATen 里的函数。ATen 本身会参与 dispatch:例如根据 device 选 CPU 或 CUDA 的 kernel。可以粗略理解为:ATen = PyTorch 的算子实现集合 + 与 dispatch 的对接。
c10(Caffe2 的「10」)是 PyTorch 的底层基础设施库,和 ATen 并列/被 ATen 依赖,提供:
c10::optional、线程安全设施;Dispatcher::call)等。所以:c10 = 张量基础类型 + 设备/类型抽象 + dispatch 机制;ATen = 建在 c10 之上的算子实现。
torch.library 是 PyTorch 提供的在 Python/C++ 中注册自定义算子并接入现有 dispatch 体系的 API。你可以:
torch.library.define() 等定义新算子名;CPU、CUDA)注册 impl;autograd 实现或用 torch.library.autograd 相关 API 挂上反向。这样自定义算子可以和 torch.add 一样参与设备派发、自动求导、torch.compile 等,而不必改 ATen/c10 源码。一句话:torch.library = 扩展算子并接入 PyTorch dispatch 与 autograd 的官方方式。
| 返回模块 | 返回总览 |