【PG 内核】JIT 编译:为什么 PG 要把 WHERE 子句编译成机器码
拆解 PostgreSQL 的 LLVM JIT 编译机制:JIT 编译的触发决策流程(jit_above_cost 三级阈值)、LLVM 模块管理与惰性编译、表达式求值从 EEO opcode 到 LLVM IR 再到机器码的完整路径、Tuple 变形(deforming)的 JIT 加速原理,以及 JIT 在 OLAP 场景的实际加速效果、编译开销和适用边界。
发布来自土法炼钢兴趣小组的知识、笔记、进展和应用。主题包括数据结构和算法、编程语言、网络安全、密码学等。
共 23 篇文章 · 返回首页
拆解 PostgreSQL 的 LLVM JIT 编译机制:JIT 编译的触发决策流程(jit_above_cost 三级阈值)、LLVM 模块管理与惰性编译、表达式求值从 EEO opcode 到 LLVM IR 再到机器码的完整路径、Tuple 变形(deforming)的 JIT 加速原理,以及 JIT 在 OLAP 场景的实际加速效果、编译开销和适用边界。
从 clang -target bpf 的 LLVM BPF 后端出发,讲清 BPF 目标文件 .o 的 ELF section 布局约定、DWARF 到 BTF 的转换管线、bpftool gen 的工具链集成,以及 BPF 特有的 inline asm 语法。
从三阶段编译器局限出发,串联 Halide、XLA、TVM 的 IR 裂变,说明 DSA 与 AI 编译器为何需要 MLIR 这类可组合的多层 IR 框架。
从 Module-Operation-Region-Block 四层结构出发,系统讲解 MLIR 的三条核心设计原则:渐进降阶、方言可组合性、基础设施复用,配合 IREE、CIRCT、Torch-MLIR 等实际案例建立心智模型。
从零构建 LLVM/MLIR 工程,用 mlir-opt 理解 .mlir 文本表示,运行规范化 Pass 并逐行解读转换结果,建立从命令行到 IR 变换的直觉。
深入 Operation、Op、Value、Block、Region 的 C++ 内存布局与继承体系:CRTP 模板包装、SSA 值的两种来源、Use 链表的遍历方法。这是后续所有 Pass 写作的基础。
解析 MLIR 的类型体系:内建类型(Integer、Float、Tensor、MemRef)与自定义方言类型的注册机制;区分 Type 与 Attribute 的设计意图;通过 OpBuilder 理解类型和属性在 IR 构造中的实际角色。
深入 MLIR 的 ODS 与 TableGen 工具链:从 .td 定义到自动生成的构建器、验证器、解析/打印器,理解声明式 IR 定义如何减少手写样板代码。
解析 MLIR 的嵌套区域控制流表示:Block 参数替代 phi 节点的设计动机、Region 的 SSACFG 与 Graph 两种类型、结构化控制流的表示能力,以及与 LLVM 经典 SSA 形式的对比。
详解 MLIR 的 Pass 基础设施:OperationPass 与 ModulePass 的分类与适用场景、Pass 依赖管理与流水线构建、Pass 选项系统、多线程执行模型,以及 mlir-opt 的调试命令。
深入 MLIR 的模式重写引擎:RewritePattern 的驱动模型、matchAndRewrite 的匹配与替换协议、规范化(Canonicalization)规则的编写、折叠与代数简化的最佳实践,以及 GreedyPatternRewriteDriver 的工作机制。
系统讲解 MLIR 的方言转换框架:TypeConverter 的类型映射、ConversionTarget 的合法性检查、完整转换与部分转换的适用边界、以 linalg bufferization 为例展示渐进降阶的实现模式。
解析 AI 编译的核心抽象层:Tensor 方言的不可变语义与操作、Linalg 方言的结构化操作(逐元素、归约、收缩)及其通用表示 linalg.generic,以矩阵乘法为例展示从高层表示到底层循环的完整降阶路径。
深入 MLIR 的循环层表示:Affine 方言的仿射约束与依赖分析、与多面体(Polyhedral)模型的联系、SCF 方言的结构化控制流,以及从 affine.for 到 scf.for 的降阶过程。
解析 MLIR 的 GPU 代码生成框架:GPU 方言的层次化并行模型(Block/Thread/Memory)、gpu.launch 的语义、SPIR-V 出口路径、内存层次抽象与 tiling 策略,以及与 Triton、IREE 的协作关系。
系统比较 PyTorch(Torch-MLIR)、TensorFlow(MHLO)、JAX(StableHLO)、ONNX(ONNX-MLIR)四种 AI 框架到 MLIR 的桥接方案:各自的 IR 翻译路径、方言映射方式和复用关系,分析 StableHLO 作为跨框架统一 IR 的地位与局限。
手把手构建微型 Tensor DSL:ODS 定义方言、写 tiny-to-linalg 降阶 Pass,经标准管线生成 LLVM IR,走完编译链闭环(参考 MLIR Toy 教程)。
MLIR 编译开发的实用工具箱:mlir-opt 的流水线诊断、IR dump 与 Pass 前后对比、mlir-tblgen 的使用方法、Pass 崩溃定位与 reproducer 生成、性能剖析与 IR 可视化工具的完整操作指南。
以 IREE 为实例,展示 MLIR 在实际 AI 编译器项目中的集成方式:编译流程剖析、HAL 运行时设计、设备驱动抽象、部署到移动端或边缘设备的完整链路。
全系列收官:回顾 MLIR 的设计哲学如何重塑编译器工程的边界,审视 MLIR 2.0 的社区规划、AI 生成编译器的可能性与陷阱、以及编译器基础设施的开放问题——从方言生态到 DSCO 愿景。
从三阶段编译器局限出发,系统讲解 MLIR 方言、渐进降阶与 Pass 基础设施,覆盖 Tensor/Linalg/Affine/GPU 到框架桥接的完整编译链。
寄存器分配是编译器后端对程序性能影响最大的优化。
SSA 是现代编译器 IR 的核心表示形式。从支配树到 φ 函数,理解 SSA 的构造和优化是深入编译器的必经之路。