Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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 方式
设备内存泄漏手动 aclrtFreeDeviceBuffer<T>Drop 自动释放
资源释放顺序错误程序员约定生命周期系统在编译期阻止
使用已释放的流无检查编译错误
发送不安全类型到设备无检查DeviceSend trait 约束
忘记同步静默数据错误类型系统可扩展为强制