幂等与不动点:编译器 pass 反复跑的真正含义 从一个 shell 脚本的'幂等'说起——同一个函数反复跑结果不变,这个朴素概念在编译器里有一个精确对应:不动点(fixed point)。本文讲清楚为什么 DCE、常量折叠这种优化 pass 总是写成'loop until no change',以及不动点之外的汇合性、单调性、终止性这几个相关概念。 zTgx 2 0 0 专题compileroptimization
编译器优化 pass 速查表:30 个名字背后的概念 编译器优化 pass 的名字一大堆——DCE、GVN、LICM、SCCP、SROA……每个都是一个独立的算法 + 一段术语。本文按'本地 / 函数级 / 循环 / 跨函数 / 后端 / 特殊'六类组织,每个 pass 给出英文全称、中文意思、做什么、为什么有用——读 LLVM 源码或自己写 pass 时当词典查。 zTgx 1 0 0 专题compileroptimization
mem2reg 为什么有效:从'看得见所有读写'说起 mem2reg 把'栈上变量 + load/store'提升成 SSA 寄存器值——这是打开后续一切优化的钥匙。但它能这么做,靠的是一个非常脆弱的前提:'编译器看得见这块内存的所有读写'。一旦 alloca 的地址逃逸到 load/store 之外的地方,这个前提就崩了,promote 就会产生错误的程序。本文用三个具体场景把'地址逃逸'讲透。 zTgx 1 0 0 专题compilerssa
MLIR 方言的高低层:看意图还是看机制 MLIR 方言的'高低'不是官方分级,而是按抽象层次来理解的。判断标准就一条:它离'人怎么想'近,还是离'机器怎么执行'近?用同一个矩阵乘从一行变成几十行的例子串起来看。 zTgx 1 0 0 专题compilermlir
PTX 入门:读懂 NVIDIA GPU 的虚拟汇编 PTX 是 NVIDIA GPU 的虚拟 ISA,介于 LLVM IR 和真正的 GPU 机器码 SASS 之间。它跟 x86 完全不同——指令格式统一、寄存器无限、地址空间显式。本文讲清楚 PTX 指令格式、state space(地址空间)、常用指令族,最后用一段 5 行的 hello_kernel PTX 逐行拆解。 zTgx 13 0 0 专题compilerptx
mem2reg:从 alloca-load-store 回到 SSA 几乎所有编译器前端都用 alloca-load-store 模型生成中间 IR——简单但冗余。mem2reg(memory-to-register,把'内存槽'升级回'寄存器值')是把这些冗余消掉、恢复 SSA 形式的经典优化。本文讲清楚 promotable alloca 的判定、phi 节点(φ,SSA 里的汇合节点)的插入、它在 cuda-oxide pipeline 里的位置,以及为什么它从'可选'变成了'必需'。 zTgx 1 0 0 专题compilerssa
Rust 单态化:Instance 类型与惰性实例化 Rust 的单态化跟很多人想的不一样——它不在编译期预先生成每个泛型实例的独立 MIR,而是用 Instance(def + args) 这种'定义 + 参数'的轻量结构,在 codegen 时按需替换。本文讲清楚 Instance 类型、惰性单态化、is_fully_monomorphized 的两个检查,以及 cuda-oxide 怎么用它过滤泛型代码。 zTgx 0 0 0 专题compilerrust
从 Rust 写 inline PTX 模板 会读 PTX 之后,下一步是从 Rust 里写自己的 PTX——这是实现自定义 GPU intrinsic 的必备技能。本文讲清楚 inline asm 的'模板 + 约束串'两段对应关系、临时寄存器作用域、谓词输出 selp 套路、format! 动态生成的陷阱,以及一个'读 shared memory 比对'的完整合成例子。 zTgx 0 0 0 专题compilerptx
cuda-oxide:hello-constant 全流程拆解——导读 用最简单的 hello-constant example,把 cuda-oxide 从一条 cargo 命令到 GPU 输出 42 之间发生的所有事,拆成 11 步逐站讲透。这是开篇——讲清楚我们要拆什么、为什么挑这个例子、整条路线长什么样。 zTgx 0 0 0 专题cuda-oxiderust
rustc -Z codegen-backend:替换 Rust 编译器后端 rustc 的 -Z codegen-backend 是 nightly 阶段的插件机制,允许把默认 LLVM 后端换成自定义实现——Cranelift、GCC、甚至 CUDA。详细讲它的协议、加载流程、CodegenBackend trait,以及自己写一个要注意什么。 zTgx 1 0 0 专题compilerrustc
cuda-oxide:hello-constant 拆解 01——鸟瞰整个管线 拆 hello-constant 系列的第一站。一条 cargo 命令背后启动了两个独立进程、七层 IR 翻译。这一篇画出全景图,后续每篇都会停在图上某个具体方框深入。 zTgx 0 0 0 专题cuda-oxiderust
cuda-oxide:hello-constant 拆解 03——rustc 前端把源码变成 MIR 拆 hello-constant 系列第三站。进入子进程,看 rustc 的前端流程——五段流水线把 src/main.rs 变成 MIR。我们 backend 拿到的输入到底长什么样?为什么 MIR 是恰到好处的过渡点?这一篇讲清楚 backend 的'原料'。 zTgx 0 0 0 专题cuda-oxiderust
cuda-oxide:开篇 用 Rust 直接写 CUDA kernel,编译成 PTX 跑在 GPU 上——cuda-oxide 是什么、为什么值得研究、这个系列要讲什么。 zTgx 1 0 0 专题cuda-oxiderust