English | 中文版
7. 端到端流程解析
让我们完整地追踪一次 cargo run 从源代码到 NPU 执行结果的全过程。
7.1 编译阶段
graph TD
A["Rust 内核源码<br/>kernels/src/lib.rs"] -->|"rustc + rustc_codegen_mlir"| B["Rust MIR<br/>类型检查完毕,单态化完成"]
B -->|"builder_methods.rs:<br/>MIR 操作 → MLIR 操作"| C["MLIR 模块<br/>LLVM · Arith · CF 方言<br/>hacc.entry 属性"]
C -->|"compile_ascend.rs:<br/>合并所有模块"| D["合并后的 MLIR<br/>内核代码 + ascend_std 依赖"]
D -->|"mlir_to_cpp"| E["生成的 C++<br/>AscendC 类: TBuf,<br/>DataCopy, ReduceMax, Exp, ..."]
E --> F["ascend_compile crate<br/>目标抽象层 · 验证<br/>Bisheng 调用 · C ABI + CLI"]
F -->|"310P: --cce-aicore-arch=dav-m200"| G["NPU 二进制 · kernel.acl.o<br/>昇腾 310P 机器码"]
F -->|"910B: --cce-aicore-arch=dav-c220"| H["NPU 二进制 · kernel.acl.o<br/>昇腾 910B 机器码<br/>(413 个测试已验证)"]
7.1.1 ascend_compile 编译中枢
ascend_compile crate (crates/ascend_compile/) 是一个独立的编译库,将内核编译与 rustc_codegen_mlir 后端解耦。任何 C++ 内核生成器——无论来自 ascend-rs 自身的 MLIR→C++ 流水线、TileLang、Triton、PyPTO(CANN 的 tile 级算子 DSL)还是未来的前端——都可以使用它来编译 AscendC 内核:
graph TD
A1["ascend-rs<br/>Rust→MLIR→C++"] --> E["AscendC C++ 内核源码"]
A2["TileLang<br/>Python DSL→AscendC(规划中)"] -.-> E
A3["Triton<br/>GPU 内核编译器(规划中)"] -.-> E
A4["PyTorch<br/>torch.compile(规划中)"] -.-> E
A5["PyPTO<br/>CANN tile 级 DSL(规划中)"] -.-> E
E --> F["ascend_compile<br/><br/>Rust API · C ABI · CLI · Python<br/><br/>编译前 3 项验证检查<br/>双标志路径 · 310P + 910B<br/>目标文件或共享库输出"]
F --> G["NPU 二进制 · .o / .so"]
这一架构使更广泛的昇腾生态系统能够受益于 ascend-rs 经过验证的编译流水线,而无需依赖 Rust 或 rustc。虚线箭头表示尚未实现的规划集成。
7.2 运行阶段
graph TD
subgraph Host["宿主机 CPU"]
H1["Acl::new()"] --> H2["Device::new"]
H2 --> H3["AclContext"]
H3 --> H4["AclStream"]
H4 --> H5["DeviceBuffer::from_slice()"]
H5 --> H6["kernel.launch()"]
H6 --> H7["stream.sync()"]
H7 --> H8["z_device.to_host()"]
H8 --> H9["验证结果"]
H9 --> H10["RAII Drop · 自动清理"]
end
subgraph Device["NPU 设备"]
D1["AI Core 0<br/>block_idx=0<br/>处理 x 0..8"]
D2["AI Core 1<br/>block_idx=1<br/>处理 x 8..16"]
D3["设备内存<br/>x: 输入 A · y: 输入 B<br/>z: 输出 = A * B"]
end
H4 -.->|"绑定到设备"| D3
H5 -.->|"Host → Device 拷贝"| D3
H6 -.->|"内核执行"| D1
H6 -.->|"内核执行"| D2
H7 -.->|"完成信号"| Device
H8 -.->|"Device → Host 回传"| D3
H10 -.->|"设备资源释放"| Device
7.3 内存安全保障
在整个流程中,ascend-rs 提供了以下编译期安全保障:
| 安全问题 | C++ 方式 | ascend-rs 方式 |
|---|---|---|
| 设备内存泄漏 | 手动 aclrtFree | DeviceBuffer<T> 的 Drop 自动释放 |
| 资源释放顺序错误 | 程序员约定 | 生命周期系统在编译期阻止 |
| 使用已释放的流 | 无检查 | 编译错误 |
| 发送不安全类型到设备 | 无检查 | DeviceSend trait 约束 |
| 忘记同步 | 静默数据错误 | 类型系统可扩展为强制 |