跳到主要内容

L6.4 终极工程愿景:统一 IR、AI-First 编译器与 LLM-Native 编译框架

三维坐标 layer: L6(应用与架构)level: Architectpillar: 编程与编译

这是全站的最后一篇。我们不再讲某个具体引擎的某个旋钮,而是站在编译器与硬件抽象的最高处,回答一个属于架构师的问题:当 NVIDIA GPU、华为昇腾 NPU 与无数 DSA(Domain-Specific Architecture)各自为政、各自一套 IR 时,谁来终结这场「编译器巴别塔」? 我们将构想三件「终极武器」——具 HAL(Hardware Abstraction Layer,硬件抽象层) 能力的统一 IRAI-First 智能编译器LLM-Native 编译框架——并以一份可落地的技术 RFC 把全站 L0–L6 的认知收口。

学习目标

  • 前置知识:读完(或至少通览过)全站 L0–L6 的主干——尤其 L1.1 异构芯片微架构(理解 Tensor Core / Cube-Vector 的硬件差异从何而来)与 L2.7 MLIR 统一 IR(知道方言体系与渐进 lowering 是什么)。本文不教某个旋钮,而是把这些散点收口成「编译与硬件抽象」的全局认知,所以越熟悉前面各层、读起来越有「拼图合拢」的快感。
  • 学完产出:① 能画出「SPMD 前端 → 统一高级 IR → AI-First 优化层 → HAL → 跨平台 DSA 后端」的五层愿景架构,并讲清 HAL 为什么是整张图的「腰」;② 能从「抽象的一等公民是谁」这一根本分歧,对比 AscendNPU IR(计算单元 + 显式搬运)与 cuTile IR(Tile 数据瓦片)两套世界观;③ 能解释 AI-First 编译器为什么把 Phase Ordering(编译相序) 建模成序列决策问题,以及可学习 Cost Model 与真机校准如何配合;④ 能权衡 HAL 抽象层级选在「算子级」还是「原语级」对新 DSA 接入成本峰值性能上限的相反影响;⑤ 亲手写出一份《统一 IR 设计》技术 RFC,并跑通一个纯 CPU 脚本,把同一张统一 IR 图 lower 到 NVIDIA 与昇腾两套目标代码、统计两套 IR 的算子覆盖率。
  • 阅读姿势:盯住一条主线——「终结编译器巴别塔的关键,不是再造一个 IR,而是在统一 IR 底座上叠一层 HAL,让上层优化与下层硬件彻底正交」。无论是统一 IR、AI-First 还是 LLM-Native 编译框架,本质都在回答同一个问题:怎样把「每接一种新硬件就重写一遍后端」的 N×M 复杂度,降成 N+M。

背景与现状

回望全站旅程:L0 我们铺开端到端全景,L1 触摸硅与显存的物理墙,L2 第一次看到「算子如何编译到硬件」,L3/L4 在框架层榨干训练与推理性能,L5 用 MLOps/LLMOps 把链路工业化,L6 把能力组装成 RAG 与 Agent 产品。但有一个矛盾贯穿始终却从未被根治——编译与硬件抽象的碎片化

今天的现实是一座编译器巴别塔

  • NVIDIA 阵营:CUDA C++ → NVVM/PTX → SASS,外加 Triton、CUTLASS、cuTile 等抽象层级,生态最厚但被单一厂商绑定。
  • 华为昇腾阵营:AscendC / TBE → AscendNPU IR(基于 MLIR 方言体系)→ CCE,主打 Cube/Vector 分离的达芬奇架构。
  • 长尾 DSA:Groq、Cerebras、Graphcore、各类 NPU/TPU 各有私有 IR 与工具链,算子覆盖率(Operator Coverage) 参差不齐。

这意味着每接入一种新硬件,框架团队就要重写一遍后端、重调一遍 Phase Ordering(编译相序)、重建一遍算子库。这是 AI Infra 当前最大的隐性税。 业界的破局方向正逐渐清晰,可概括为三句话:

  • 统一 IR:以 MLIR 的多方言、可渐进 lowering 能力为底座,向上提供统一高级语义、向下挂接 HAL 屏蔽硬件差异(参考 OpenXLA/StableHLO、IREE 的实践)。
  • AI-First 编译器:编译优化本身是一个巨大的组合搜索空间(Pass 选择与排序、tiling、fusion 策略),用大模型 / 强化学习(RL)作为 Agent 自动探索,取代手工堆砌的启发式(如 Google MLGO、AlphaTensor 的思路延伸)。
  • LLM-Native 编译框架:以 SPMD(Single Program Multiple Data) 为统一前端编程模型,后端无缝支持 NVIDIA GPU / 昇腾 / 任意 DSA,把分布式切分与代码生成自动化

业界信号:MLIR 已成为事实上的「IR 的 IR」——TensorFlow、PyTorch(torch-mlir)、Triton、IREE、昇腾的 AscendNPU IR 均构建其上。这说明产业的下注方向不是「再造一个 IR」,而是「在统一 IR 底座上叠 HAL 与智能调优」。本文正是沿这条主线把愿景讲透。

原理与架构

2.1 终极愿景的分层架构:统一 IR + HAL

要终结巴别塔,核心不是发明新语言,而是设计一个可渐进 lowering、向下经 HAL 解耦硬件的统一 IR 分层体系。下图是这一愿景的整体架构:

自顶向下读这张图:SPMD 前端把「写一遍,到处并行」变成现实 → 统一高级 IR 携带高维张量语义与 sharding 标注 → AI-First 优化层用 Agent 自动决定 Pass 顺序与 tiling → HAL 把「内存层级 / 计算单元 / 通信原语」抽象成统一接口,这是解耦硬件的关键一层 → 各 DSA 后端只需实现 HAL 接口,即可被自动 codegen。HAL 是整张架构的「腰」——它让上层优化与下层硬件彻底正交。

2.2 横向对比:AscendNPU IR vs cuTile IR 语法 SPEC

设计统一 IR 前,必须先看清两套代表性 IR 的语义差异。下表从语法 SPEC、高维语义、算子覆盖率三个维度横向对比:

维度AscendNPU IR(昇腾)cuTile IR(NVIDIA tile 级抽象)
IR 底座MLIR 方言,多 region 结构tile/block 级中间表示,贴近 PTX 之上
核心抽象单元Cube(矩阵)+ Vector(向量)分离Tile(瓦片)为一等公民,统一标量/向量/张量
内存层级语义显式 UB(Unified Buffer)/ L1 / GM,需手工搬运显式 SMEM / register tile,编译器辅助分配
高维语义高维 tensor + 显式 tiling 标注,强调达芬奇流水高维 tile 视图 + 自动 swizzle/layout 推导
算子表达粒度偏向「指令级 + 流水编排」偏向「tile 级数据流 + 隐式同步」
算子覆盖率倾向Cube 类(GEMM/Conv)覆盖极强,长尾 elementwise 需手写Attention/GEMM 类 tile 模式覆盖强,控制流密集算子较弱
同步模型显式 pipe / event 同步(生产者-消费者)偏隐式(warp/block 级 barrier 自动插入)

需要强调的是:两套 IR 的根本分歧在于**「抽象的一等公民是谁」**——昇腾以「计算单元(Cube/Vector)+ 显式搬运」为中心,cuTile 以「Tile(数据瓦片)」为中心。统一 IR 的设计本质,就是找到一个能同时投影到这两种世界观的更高级抽象,再由 HAL 向下分裂。 这正是 RFC(模块 3)要回答的核心问题。

2.3 AI-First:把 Phase Ordering 交给 Agent

传统编译器的 Phase Ordering 是一个臭名昭著的 NP-hard 难题:几十个 Pass(fusion、tiling、向量化、布局变换……),不同顺序对最终性能影响可达数倍,而手工启发式只能覆盖极小子空间。AI-First 编译器的思路是把它建模为序列决策问题,用 RL / LLM Agent 探索:

核心在于:AI-First 的价值不在「替人写 Pass」,而在自动探索 Pass 的组合与顺序。可学习 Cost Model 提供廉价 reward 让搜索高效收敛,真机仅用于校准——这与 Google MLGO(用 ML 做 inline/regalloc 决策)一脉相承,但目标域升级为「整条 AI 编译相序」。

动手实践:撰写《统一 IR 设计》技术 RFC

实验目标:作为架构师,把上面的愿景落成一份可评审、可落地的技术 RFC。产出物 = 一份含「背景 / 语义 SPEC / 算子覆盖率评估 / 迁移路线」的 RFC 文档 + 一个纯 CPU 可跑的 Python 脚本:它构造一个最小统一 IR 数据结构,演示一次 matmul + relulowering,并统计两套 IR 的算子覆盖率

3.1 环境准备

# 纯 CPU 即可,仅用标准库,无需任何第三方依赖
python3 -m venv .venv && source .venv/bin/activate
python3 --version # 建议 3.10+
mkdir -p rfc-unified-ir && cd rfc-unified-ir

3.2 RFC 骨架(语义 SPEC + 迁移路线)

先把 RFC 文档结构定下来——这是架构师交付的「主产物」,脚本只是它的附录证据。

# RFC-001:UniIR —— 具 HAL 能力的统一 AI 编译 IR

## 1. 背景与动机(Motivation)
- 问题:编译器巴别塔,每接一种 DSA 需重写后端,N×M 复杂度。
- 目标:统一高级 IR + HAL,把 N×M 降为 N+M。

## 2. 语义 SPEC(Semantics)
- 类型系统:UniTensor<dtype, shape, layout, sharding>
- 算子集(Core Op Set):matmul / conv / elementwise / reduce / reshape / collective
- 内存模型:抽象层级 {GLOBAL, L2, SHARED, REG} → 由 HAL 映射到 HBM/UB/SMEM
- 并行语义:SPMD + 显式 sharding 标注(mesh, axis)
- 渐进 lowering:HighLevel → Structured(linalg) → HAL → TargetISA

## 3. HAL 接口规范(Hardware Abstraction Layer)
- mem_alloc(level) / mem_copy(src,dst) / compute(unit, op) / collective(primitive)
- 每个后端(NVIDIA/昇腾/DSA)实现这组接口即可被 codegen。

## 4. 算子覆盖率评估(Coverage Evaluation)
- 以「核心算子集」为基准,统计各 IR 已覆盖比例(见附录脚本)。

## 5. 迁移路线(Migration Plan)
- 阶段一:在 MLIR 上定义 UniIR 方言,前端接 torch-mlir。
- 阶段二:实现 NVIDIA + 昇腾两个 HAL 后端,跑通核心算子。
- 阶段三:接入 AI-First Pass 搜索,长尾 DSA 通过 HAL 快速接入。
- 风险与回退:覆盖率不足的算子保留 fallback 到原生后端。

3.3 代码:最小统一 IR + lowering + 覆盖率统计

"""
uniir_demo.py —— 最小统一 IR 数据结构 + lowering 演示 + 算子覆盖率统计
纯标准库,CPU 可跑:python3 uniir_demo.py
"""
from dataclasses import dataclass, field
from typing import List, Dict
from enum import Enum


# ---------- 1. 统一 IR 的最小数据结构 ----------
class MemLevel(Enum):
GLOBAL = "GLOBAL" # HAL 映射 → HBM / GM
SHARED = "SHARED" # HAL 映射 → SMEM / UB
REG = "REG" # HAL 映射 → register / L0


@dataclass
class UniTensor:
name: str
shape: tuple
dtype: str = "f16"
level: MemLevel = MemLevel.GLOBAL


@dataclass
class UniOp:
"""统一高级 IR 算子节点"""
kind: str # matmul / relu / ...
inputs: List[UniTensor]
output: UniTensor
attrs: Dict = field(default_factory=dict)


# ---------- 2. HAL 抽象接口(各后端实现这组方法即可被 codegen)----------
class HAL:
target = "abstract"
def mem_alloc(self, t: UniTensor) -> str: raise NotImplementedError
def compute(self, op: UniOp) -> str: raise NotImplementedError


class NvHAL(HAL):
target = "nvidia"
_LV = {MemLevel.GLOBAL: "HBM", MemLevel.SHARED: "SMEM", MemLevel.REG: "reg"}
def mem_alloc(self, t):
return f"// nv: alloc {t.name}{t.shape} on {self._LV[t.level]}"
def compute(self, op):
m = {"matmul": "mma.sync.tile", "relu": "vec.max(x,0)"}
return f"// nv: {m.get(op.kind, op.kind)} -> {op.output.name}"


class AscendHAL(HAL):
target = "ascend"
_LV = {MemLevel.GLOBAL: "GM", MemLevel.SHARED: "UB", MemLevel.REG: "L0"}
def mem_alloc(self, t):
return f"// ascend: alloc {t.name}{t.shape} on {self._LV[t.level]}"
def compute(self, op):
m = {"matmul": "Cube.mmad", "relu": "Vector.relu"}
return f"// ascend: {m.get(op.kind, op.kind)} -> {op.output.name}"


# ---------- 3. lowering:统一 IR → HAL 目标代码 ----------
def lower(ops: List[UniOp], hal: HAL) -> List[str]:
code = [f"=== lowering to [{hal.target}] ==="]
seen = set()
for op in ops:
for t in op.inputs + [op.output]:
if t.name not in seen:
code.append(hal.mem_alloc(t)); seen.add(t.name)
code.append(hal.compute(op))
return code


# ---------- 4. 算子覆盖率评估 ----------
CORE_OP_SET = {"matmul", "conv", "relu", "reduce", "reshape", "softmax",
"layernorm", "collective_allreduce"}

# 各 IR 自报已覆盖算子(真实场景应从后端能力表读取)
ASCEND_NPU_IR = {"matmul", "conv", "relu", "reduce", "reshape", "softmax"}
CUTILE_IR = {"matmul", "relu", "softmax", "layernorm", "reshape", "reduce"}


def coverage(ir_ops: set, base: set = CORE_OP_SET) -> float:
return len(ir_ops & base) / len(base) * 100


def report_coverage():
print("=== 算子覆盖率评估(基准 = 核心算子集 %d 个)===" % len(CORE_OP_SET))
for name, ops in [("AscendNPU IR", ASCEND_NPU_IR), ("cuTile IR", CUTILE_IR)]:
miss = sorted(CORE_OP_SET - ops)
print(f" {name:14s}: {coverage(ops):5.1f}% 缺失={miss}")
both = ASCEND_NPU_IR & CUTILE_IR
print(f" 两者交集(统一 IR 首批稳态算子): {sorted(both)}")


# ---------- 5. 主流程 ----------
if __name__ == "__main__":
x = UniTensor("X", (1024, 1024))
w = UniTensor("W", (1024, 1024))
h = UniTensor("H", (1024, 1024), level=MemLevel.SHARED)
y = UniTensor("Y", (1024, 1024))
graph = [
UniOp("matmul", [x, w], h, attrs={"tile": (128, 128)}),
UniOp("relu", [h], y),
]
for hal in (NvHAL(), AscendHAL()):
print("\n".join(lower(graph, hal)), "\n")
report_coverage()

运行:

python3 uniir_demo.py

你会看到同一张统一 IR 图被无差别 lower 到 NVIDIA(mma.sync.tile / SMEM)与昇腾(Cube.mmad / UB)两套目标代码——这正是 HAL 解耦的威力;随后输出两套 IR 对核心算子集的覆盖率百分比与缺失清单,以及「交集」作为统一 IR 首批可稳定落地的算子集合。这份输出,就是 RFC「算子覆盖率评估」一节的客观证据。

踩坑预警 (Gotchas)

  • 别把统一 IR 当「最大公约数」:取交集只是起步稳态,长尾算子必须靠 HAL fallback 到原生后端,否则覆盖率永远卡在交集,丧失工程价值。
  • HAL 抽象层级选错=灾难:抽象太高(只暴露算子)会丢失 tiling/搬运的关键调优旋钮;太低(暴露 ISA)则等于没抽象。正确的腰线是「内存层级 + 计算单元 + 通信原语」三类原语,本 demo 即按此切分。
  • AI-First 不是银弹:RL/LLM 搜索 Phase Ordering 极度依赖 Cost Model 的保真度——Cost Model 不准,搜出来的「最优序」在真机上可能更慢。务必保留真机校准回路。
  • 覆盖率数字会骗人:同名算子语义可能不等价(如 softmax 的数值稳定实现、reduce 的轴语义),覆盖率统计必须配语义一致性测试,否则「覆盖了」只是假象。
  • MDX 渲染陷阱:本文 mermaid 节点文本含 / 等字符须用引号包裹;表格中的竖线 | 若出现在内容里需转义,避免破坏排版。

深入思考

下面三题每题先给题干,再用 <details> 折叠一份图文并茂的参考答案。建议先合上答案自己想 3 分钟,再展开对照。

思考题 1:抽象层级抉择

你要为统一 IR 设计 HAL。若把抽象做在「算子级」(后端只需实现 matmul/conv/...),与做在「原语级」(mem_alloc/compute/collective)相比,各自如何影响新 DSA 接入成本峰值性能上限?请结合 2.2 节 AscendNPU IR 的 Cube/Vector 分离与 cuTile 的 Tile 抽象,论证你的腰线选在哪里。

展开参考答案(含 HAL 抽象层级权衡图 + 接入成本对比表)

结论:算子级抽象「接入快、上限低」,原语级抽象「接入慢、上限高」;正确的腰线既不是最高(只暴露算子)也不是最低(暴露 ISA),而是「内存层级 + 计算单元 + 通信原语」三类原语——它保留了 tiling 与搬运这两个关键调优旋钮,又不把后端拖进逐条指令的泥潭。

三种腰线的接入成本 / 性能上限对比:

腰线位置后端要实现什么新 DSA 接入成本峰值性能上限失配的硬件世界观
算子级几十个高层算子语义低(填表即可)低:tiling/搬运被黑盒,长尾算子还得 fallback既藏不住昇腾 Cube/Vector 分离,也用不上 cuTile 的 swizzle
原语级(推荐)内存层级 + 计算单元 + 通信原语三类中:实现三类原语并各自调优高:调优旋钮仍在编译器手里能同时投影到 Cube/Vector「显式搬运」与 Tile「数据瓦片」两套世界观
ISA 级逐条目标指令高:等于没抽象最高(理论)N×M 复杂度回归,巴别塔重现

为什么腰线选原语级:2.2 节已点明两套 IR 的根本分歧是「抽象的一等公民是谁」——昇腾以「计算单元(Cube/Vector)+ 显式搬运」为中心,cuTile 以「Tile 数据瓦片」为中心。算子级 HAL 把搬运与 tiling 全藏进黑盒,等于强行抹平这条分歧线,昇腾的显式流水编排和 cuTile 的 layout 推导都无从表达,峰值自然上不去;ISA 级则等于没抽象,每个后端从零写,N×M 复杂度回归。唯有「内存层级(GLOBAL/SHARED/REG)+ 计算单元(Cube/Tensor Core/Vector)+ 通信原语」这条腰线,既给后端留下了把 SHARED 映射成 UB 还是 SMEM、把 compute 落到 Cube.mmad 还是 mma.sync 的自由,又统一了上层接口——本文 demo 的 NvHAL / AscendHAL 正是按此切分。

思考题 2:AI-First 的信任边界

当 RL Agent 搜出的 Phase Ordering 在 Cost Model 上得分最高、但在某款新 DSA 真机上反而劣化 20%,你的编译框架该如何设计回退与置信度机制,才能既享受自动调优的红利、又不让线上模型踩雷?结合 2.3 节,并说说这与 L5 讲的「可观测 / 灰度发布」有何相通之处。

展开参考答案(含置信度门控与回退闭环图 + 安全检查清单)

结论:AI-First 的红利必须用一道「真机校准 + 置信度门控 + 安全回退」的闭环来兜底——Cost Model 只负责高效搜索,真机延迟才是唯一可信奖励;任何候选序列在置信度不足或真机劣化时,一律回退到已知基线,绝不直接上线。

安全机制清单(缺一不可):

  1. 真机是唯一可信奖励:2.3 节强调 Cost Model 提供「廉价 reward」让搜索收敛,但它是预测。新 DSA 上 Cost Model 几乎必然失准(训练分布没覆盖),所以候选序列上线前必须真机/模拟器实测,劣化 20% 这种事正是「Cost Model 高分 ≠ 真机快」的典型。
  2. 置信度门控:维护 Cost Model 在该硬件上的历史预测误差;误差大时直接判定「不可信」,跳过搜索结果、回退基线。这等价于给 Agent 的输出加了一道「我有没有资格替这款硬件做决定」的自检。
  3. 安全回退:任何环节(置信度低 / 真机劣化 / 灰度指标异常)都收敛到同一个已知基线相序——保证「最坏情况也不比手工启发式差」,这是上线的底线契约。
  4. 持续校准:真机延迟回灌修正 Cost Model,让它在该硬件上越用越准——这正是 2.3 节「离线训练 + 在线搜索 + 真机校准」闭环的落地。

与 L5「可观测 / 灰度发布」的相通之处:本质完全同构——L5 把一个新模型版本先灰度小流量、用可观测指标盯住、异常即回滚;这里把一个新编译相序当作「待发布版本」,先真机验证、再灰度放量、指标异常即回退基线。AI-First 编译器不是「一锤定音的自动调优」,而是把 L5 的「渐进交付 + 可回滚」纪律下沉到了编译层——自动探索负责「快」,灰度回退负责「稳」,二者缺一就要么不敢用、要么踩雷。

思考题 3:迁移路线的终局

假设统一 IR + HAL 落地后,一家公司想把存量基于 CUDA 手写 kernel 的推理服务平滑迁到昇腾。回看全站 L0–L6,哪几层因为这套统一 IR 而几乎「免改」、哪几层仍需人工介入?「编程与编译」这根支柱,为什么是异构迁移成本的真正阀门?

展开参考答案(含 L0–L6 迁移改动热力图 + 免改/需改分层表)

结论:统一 IR + HAL 让 L5/L6 这类「业务与运维层」几乎免改、L3/L4 框架层小改,而真正的迁移工作量被牢牢压在 L1/L2「硬件 + 编译」这一跳——因为只有这里要把「贴着 CUDA 的世界观」翻译成昇腾的世界观;HAL 把这跳从「逐个 kernel 重写」收窄成「补齐覆盖率不足的算子」,但补不全的长尾仍需人工。

L0–L6 分层:免改 / 需改判定

迁移改动量为什么
L6 应用 / Agent / RAG🟢 几乎免改业务逻辑与硬件无关,调的是统一 IR 之上的高层 API
L5 MLOps / LLMOps🟢 几乎免改流水线、监控、灰度面向「模型 + 服务」,与底层 ISA 解耦
L4 推理框架🟡 小改换后端目标、重跑性能基线与精度回归,配置层面为主
L3 训练框架🟡 小改SPMD/sharding 标注随 mesh 调整,并行语义由统一 IR 承载
L2 算子 / 编译🔴 重灾区统一 IR 交集内算子自动 lower,但长尾算子要补 HAL 实现 + 调优,覆盖率缺口在此
L1 硬件微架构🔴 差异之源Cube/Vector 显式搬运 vs Tensor Core 隐式调度,世界观分歧的物理根源

算一遍迁移工作量的「收窄」:没有统一 IR 时,存量 CUDA 手写 kernel 要逐个翻译成昇腾 Ascend C——假设 100 个自定义算子,就是 100 份重写 + 100 份调优。有了统一 IR + HAL 后:本文 demo 显示两套 IR 的交集(如 matmul/relu/softmax/reduce/reshape)能被同一张 IR 图无差别 lower,这部分免改;只剩交集之外的长尾(比如 cuTile 缺的控制流密集算子、AscendNPU 缺的某些 elementwise)需要人工补 HAL 实现。于是工作量从「100 个全重写」收窄到「20 个长尾补齐」——这正是 RFC「迁移路线」里「覆盖率不足的算子保留 fallback」那条风险回退的价值。

为什么「编程与编译」是真正的阀门:因为模型最终都要落成针对特定硬件的指令,而 L5/L6 的免改、L3/L4 的小改,全都建立在「L2 这一跳能把统一 IR 正确、高效地 lower 到目标硬件」之上。上层框架能抽象掉调度、运维能抽象掉发布,但「代码 → 硬件指令」这一跳的算子覆盖与性能调优无法被抽象掉——它要么是巴别塔的税(每家重写),要么是统一 IR + HAL 收窄后的长尾人工。这根「编程与编译」支柱卡在所有上层能力与所有底层硬件的交汇点上,松一寸则全栈受益,紧一寸则全栈受困——这就是它成为异构迁移成本真正阀门的根本原因。

延伸阅读

1. 核心 Paper / 规范

  • MLIR: A Compiler Infrastructure for the End of Moore's Law(2020)— 统一 IR 的方言与渐进 lowering 思想之源。
  • MLGO: a Machine Learning Guided Compiler Optimizations Framework(Google,2021)— AI-First 编译器的工程化先声。
  • AlphaTensor / AlphaDev(DeepMind)— 用搜索/RL 重写底层算法与代码的范式,可类比 Phase Ordering 探索。

2. 相关高 Star 仓库与源码必读路径

  • llvm/llvm-projectmlir/ 目录)— 看 Dialect/LinalgDialect/Affine 如何承载结构化高级语义与 lowering。
  • openxla/iree — 端到端「统一 IR → 多后端 HAL → codegen」的最完整开源参照,重点看其 HAL 抽象层设计。
  • triton-lang/tritonllvm/torch-mlir — 前端如何降到 MLIR,理解 SPMD/tile 前端的工程接口。

3. 优质博客 / 公开课

  • OpenXLA 与 IREE 官方设计文档(HAL、StableHLO 稳定算子集的演进逻辑)。
  • 华为昇腾 AscendC / AscendNPU IR 开发者文档(Cube/Vector 编程模型)。
  • Stanford CS / MIT 6.5940 关于编译与高效深度学习的系统课,建立软硬协同的全局观。

全站收束 🎯 从 L0「硅到智能」的端到端全景出发,我们一路下探 L1 的物理墙、L2 的算子编译、L3/L4 的训推框架、L5 的工业化运维,最终在 L6 这里登顶,望见了 AI Infra 的终极工程愿景——一套具 HAL 能力的统一 IR、一个会自我探索相序的 AI-First 编译器、一个让「写一遍、跑遍所有硬件」成真的 LLM-Native 编译框架。这不是又一篇「下一站」,而是整张地图的闭环:当年那张七层栈图上每一根连线背后的复杂度,最终都收敛回「编程与编译」这根支柱。愿你带着这份全局系统观,去把这座编译器巴别塔,亲手拆掉。 —— 全站终。