Operator 类¶
class Operator 是 DTorch 中所有算子的抽象基类,定义在 dtorch/core/operators/operator.h。它采用模板方法模式(Template Method Pattern),在基类中定义了算子推断和执行的算法骨架,派生类通过重写特定的虚函数来实现各自的功能。
1. Operator 基类¶
1.1 核心成员¶
class Operator {
protected:
std::string mOpName; // 算子名称
uint64_t mUniqueId; // 全局唯一 ID
OperatorType mOpType; // 算子类型枚举
std::shared_ptr<OpParam> mOpParam; // 算子参数(多态)
OperandArray mInputOperands; // 输入 Operand 列表
OperandArray mOutputOperands; // 输出 Operand 列表
OperatorAssignInfo mOperatorAssignInfo; // Kernel 分配信息(Stream、Device 等)
};
关键依赖类型:
| 类型 | 位置 | 说明 |
|---|---|---|
OperatorType |
operator_param.h |
枚举所有算子类型(kActivation, kConv, kReduce, …),通过 DTORCH_FOREACH_OPERATOR_TYPE 宏统一定义 |
OpParam |
operator_param.h |
算子参数的抽象基类,通过 OperatorType 枚举标识算子类型。所有派生类参数结构体都继承自 OpParam |
Operand |
dtorch/core/operand.h |
计算图中的张量节点,持有 Shape、Stride、DataKind、DeviceMesh、PlacementSeq 等元信息 |
OperatorAssignInfo |
operator_assign_info.h |
描述算子在哪些 Stream(Device + StreamType)上执行 |
2. 派生类体系¶
所有算子分为三大类别,分别位于对应的子目录中:
dtorch/core/operators/
├── operator.h / .cc ← Operator 基类
├── operator_param.h / .cc ← OpParam 基类 + OperatorType 枚举
├── operator_factory.h / .cc ← OperatorFactory 工厂类
├── placement_signature.h / .cc ← PlacementSignature 匹配引擎
│
├── standard/ ← 标准算子(LibTorch 后端实现)
│ ├── activation_op.h ReLU, GELU, SiLU 等激活函数
│ ├── broadcast_binary_op.h add, mul, sub, div 等广播二元运算
| ...
│
├── fused_compile/ ← 融合编译算子(性能优化)
│ ├── apply_rotary_emb_op.h RoPE 位置编码融合
│ ├── silu_linear_chunk.h SiLU + Linear 融合
│ └── layer_norm_mul_add.h LayerNorm + Mul + Add 融合
│
└── system/ ← 系统算子(不产生输出 Tensor)
├── nvtx_op.h NVTX 性能标记
└── memory_op.h 显存管理
此外还有两个特殊算子位于顶层:
FuseOp(fuse_op.h) — 表示一个子图的融合节点,由LogicalGraph和主导算子类型组成SubGraphOp(subgraph_op.h) — 封装子图,内部持有LogicalGraph
3 算法骨架:模板方法模式¶
详细说明、算法骨架和所有可重写虚函数的完整指南见 Operator 模板方法模式文档。
4. PlacementSignature 分布式规则¶
PlacementSignature 是 DTorch 分布式算子的核心机制,用于描述算子输入和输出 Tensor 的 Placement 映射关系。
PlacementSignature 的完整说明(包括 Builder API、典型实现模式、匹配流程)请参见 placement_signature.md。
5. Operator 生命周期¶
一个 Operator 从创建到执行的完整流程:
1. 工厂构造
OperatorFactory::NewOperatorOrThrow(opParamPtr, inputOperands)
├── ConstructOperator(opParamPtr) ← 根据 OpType 创建对应的派生类实例
├── SetUniqueId() / AssignUniqueId()
├── SetInputOperands(inputOperands)
├── CreateOutputOperands() ← 根据 InferOutputSize() 创建空 Output Operand
│
2. 推断阶段
├── Infer()
│ ├── InferOutput()
│ │ ├── CheckInput() ← 校验输入合法性
│ │ ├── InferOutputMetaInfo() ← ★ 派生类实现:推断 Shape/Stride/DataKind
│ │ └── InferOutputDistributedSpecFromPlacementSignature() ← 分布式信息推断
│ └── InferOperatorAssignInfo() ← 分配 Kernel→Stream 映射
│
3. 拓扑注册
└── UpdateIOOperandTopology() ← 建立 Operand 的生产者/消费者关系
在构图阶段(步骤 1-3)完毕后,算子被添加到计算图中。执行阶段由 EagerGraphExecutor 驱动,Worker 线程调用 Compute() 执行实际计算:
6. 添加新 Operator 的步骤¶
详细步骤请参见 how_to_add_operator.md。
7. 文件索引¶
| 文件 | 说明 |
|---|---|
dtorch/core/operators/operator.h |
Operator 基类声明 |
dtorch/core/operators/operator.cc |
Operator 基类实现(推断、校验、拓扑) |
dtorch/core/operators/operator_param.h |
OpParam 基类 + OperatorType 枚举 |
dtorch/core/operators/operator_factory.h/.cc |
OperatorFactory 单例工厂 + 算子注册 |
dtorch/core/operators/placement_signature.h/.cc |
PlacementSignature + Builder 实现 |
dtorch/core/operators/operator_assign_info.h |
OperatorAssignInfo(Stream 分配) |
dtorch/core/operators/subgraph_op.h |
SubGraphOp 子图封装 |
dtorch/core/operators/fuse_op.h |
FuseOp 融合算子 |
dtorch/core/operators/standard/ |
标准算子实现目录 |
dtorch/core/operators/fused_compile/ |
融合编译算子目录 |
dtorch/core/operators/system/ |
系统算子目录 |