深入 P10 核心:Dispatcher 与硬件抽象层
作为 TensorPlay 的计算核心,P10 库的设计目标是“极致的灵活性”。为了在支持多种硬件(CPU, CUDA, Edge)的同时保持接口的一致性,我们引入了两套关键设计模式。
Tensor 与 TensorImpl:接口与实现分离
在 P10 中,用户交互的 p10::Tensor 实际上是一个轻量级的句柄,它持有一个指向 p10::TensorImpl 的智能指针。
- TensorImpl:是一个抽象基类,定义了存储张量元数据(Shape, Stride, Device)和数据指针的标准。
- 子类适配:
CPUImpl、CUDAImpl甚至针对嵌入式设备的EdgeImpl分别实现了具体的存储管理和计算逻辑。
Dispatcher:算子分发的指挥官
当用户调用 add() 或 matmul() 时,P10 不会硬编码计算逻辑,而是将其交给 Dispatcher。
Dispatcher 会根据张量的 DispatchKey(由设备类型和数据类型组成),从全局注册表中查找并调用最适合当前硬件的内核函数(Kernel)。这种机制允许开发者在不修改 P10 核心源码的情况下,通过简单的注册即可添加对新算子或新硬件的支持。
效率的保证
虽然存在抽象层,但通过 C++ 的内联优化和零开销抽象(Zero-cost Abstractions),P10 在调度路径上的开销被压缩到了纳秒级,确保了框架在计算任务下的高效执行。
