第 40 题:如何为新的硬件后端添加编译器支持?以自定义AI芯片为例
题目
如何为新的硬件后端添加编译器支持?以自定义AI芯片为例
完整讲解
一、为新硬件添加编译器支持要做什么?
以 自定义 AI 芯片 为例,大致层次:一、 在编译器 IR 中能 表达 该硬件的计算与数据(新 dialect 或扩展现有 dialect);二、 实现 lowering:从高层 op(如 linalg、tensor)降到该硬件的 op/指令;三、 代码生成 或 runtime 接口:生成该芯片可执行的代码/配置,或调其 driver/SDK;四、 调优:tile 大小、映射、双缓冲等,可手写规则或接 auto-schedule。
二、以 MLIR 为例的落地步骤
- 定义 Dialect:为自定义芯片建 dialect,定义其 operation(如
mychip.compute、mychip.copy)、类型(如 mychip.buffer)、属性(如 tile 大小、mapping)。这样高层图可 lower 到「mychip 的 op」。
- Lowering passes:写 pass 把
linalg、tensor、scf 等降到 mychip op;包括 loop 到硬件的映射(哪个 loop 对应哪个维度、tiling、并行)。
- Codegen / Runtime:把
mychip op 序列转成该芯片的 指令流 或 API 调用(如 DMA、compute、sync);若芯片有自家编译器,可能生成其 IR 或源码。
- 集成与测试:在统一 pipeline 里插「高层 → mychip dialect → codegen」;用典型子图/模型做正确性与性能回归。
三、以 TVM 为例
- Target:注册新 target(如
mychip),声明能力(thread、vector 等)。
- Schedule / TIR:高层 TE 或 TensorIR lower 到 TIR;为 mychip 写 schedule 规则 或 TIR 到设备代码 的 codegen。
- Runtime:实现
DeviceAPI、kernel 加载等,使 host 能调该芯片上的 kernel。
四、共性
- 抽象:用 IR/dialect 描述硬件能力与映射;lowering:高层 → 设备相关 op/IR;codegen/runtime:出可执行形式。
- 新硬件往往要 手写或半自动 的映射与 codegen,再逐步加 auto-tune。
面试要点
- 三步:用 IR/dialect 表达硬件、写 lowering 从高层到该 dialect、codegen 或 runtime 出可执行代码。
- MLIR:新 dialect + op/类型 → lowering pass → codegen/runtime;TVM:target + schedule/codegen + DeviceAPI。
- 新芯片通常先手写映射与 codegen,再补 auto-tune 与融合规则。
记忆要点
- 新后端 = 表达(dialect/IR)+ lowering(高层→设备 op)+ codegen/runtime。
- MLIR:dialect + passes + codegen;TVM:target + schedule + DeviceAPI。
- 先实现正确性与基本映射,再优化与 auto-tune。