E-BOOK 深入理解LLVM:MLIR原理与OpenAI Triton实现分析 LLVM AI编译器 MLI 彭成寒,俞佳嘉,李灵,李存 深入理解LLVM:MLIR原理与OpenAI Triton实现分析 LLVM AI编译器 MLI

深入理解LLVM:MLIR原理与OpenAI Triton实现分析 LLVM AI编译器 MLI

👤 彭成寒,俞佳嘉,李灵,李存 📖 机械工业出版社 📋 9787111807773 🌐 zh-CN
33
下载次数
4.8
用户评分

📦 下载本书

  • 理解MLIR架构:系统梳理MLIR核心概念与方言体系,解决初学者面对复杂IR结构时的认知障碍。
  • 掌握Triton实现:深入剖析OpenAI Triton的编译优化与降级流程,解决将Python代码高效转换为GPU高性能代码的难题。
  • 构建优化策略:针对不同计算场景,提供多面体编译、凸优化等数学理论支撑,解决高级优化无从下手的困境。
  • 提升实战能力:通过270余段精讲代码和60余幅图表,解决理论与实践脱节问题,助力读者快速上手MLIR开发。
  • 跟上最新版本:基于LLVM 20,配套镜像代码仓,解决使用旧版资料导致的技术滞后问题。
★★★
中级
入门初级中级进阶高级
  • 编译器研发工程师:希望深入掌握LLVM/MLIR技术栈,提升编译器开发效率与代码质量。
  • AI框架开发者:需要理解底层编译优化原理,以优化深度学习模型的推理与训练性能。
  • 高性能计算从业者:关注GPU代码生成与优化,期望利用MLIR提升异构计算性能。
  • 计算机专业研究生:研究方向为编译原理、程序分析或AI系统,需要系统学习MLIR理论与实践。
  • 技术爱好者:对编译器技术有浓厚兴趣,具备一定基础,希望拓展前沿知识领域。
  1. 基础优先:建议先通读第1-7章,扎实掌握MLIR核心概念,为后续方言和实战打下基础。
  2. 重点突破:第8-12章是方言详解,可结合代码示例反复练习,理解各方言的设计意图与适用场景。
  3. 实战驱动:第13章Triton实战是全书精华,建议边读边运行配套代码,跟踪编译流程,深化理解。
  4. 数学补强:第14-15章涉及数学理论,若基础薄弱可先略读,遇到具体优化问题时再回头精读。
  5. 配套练习:每章结束后,尝试修改示例代码或实现小型优化Pass,巩固所学知识。
  • 系统认知:全面理解MLIR的架构设计、核心概念与方言生态,构建完整的知识体系。
  • 实战技能:掌握基于MLIR的编译优化与降级流程,能够独立分析并解决实际编译器开发问题。
  • 前沿视野:洞悉AI编译器最新发展趋势,了解Triton等先进框架的内部实现机制。
  • 数学素养:掌握多面体编译、凸优化等数学工具,为高级优化研究奠定理论基础。
  • 工程能力:通过270余段代码精讲,提升代码阅读与编写能力,加速从理论到实践的转化。
  • 版本优势:基于LLVM 20的最新内容,确保所学技术紧跟社区发展,避免知识过时。

📖 书籍简介

产品特色

编辑推荐

1)前沿版本 ——基于 LLVM 20,配套镜像代码仓,实验全程可复现

2)Triton 拆解 ——完整剖析 OpenAI Triton 编译优化与降级流程,揭示 Python→GPU 高性能代码转换全路径

3)方言全图谱 ——15+ 核心方言上下游关系与协同优化机制系统梳理

4)立体资源 ——60余幅架构/流程图 + 270余段精讲代码,全景构建 MLIR 认知框架

5)数学补完 ——多面体编译理论、凸优化、整数规划,筑牢 MLIR 高级优化理论基础

内容简介

本书由国内头部科技企业资深编译器专家团队倾力撰写,凝练团队多年深耕MLIR的研究成果与工程实践经验。其主要设计思路如下。

 
1)系统阐释MLIR核心原理与基础概念,全景梳理各方言间的层级关系与协同机制,并深入探讨针对不同计算场景的优化策略。
2)为强化实战能力,以OpenAI Triton为标杆案例,细致解构其基于MLIR的实现流程与工程细节,帮助读者深度理解MLIR代码体系,从容应对实际业务开发挑战。
3)以60余幅手绘架构/流程图、270余段精讲代码为脉络,由浅入深地剖析MLIR技术体系,助力读者快速建立认知框架。

 
具体而言,本书共15章,分为4部分。

第一部分为MLIR基础知识(第1~7章),系统讲解MLIR的核心概念与底层机制,是理解后续内容的基石。

第二部分为MLIR方言详解(第8~12章),全面梳理MLIR生态中的核心方言体系,带领读者了解其强大的表达能力与优化潜力。

第三部分为MLIR实战项目剖析(即第13章),以OpenAI的Triton DSL为例,系统剖析MLIR的设计理念及其编译优化与降级流程。

第四部分为MLIR中的数学知识与应用(第14~15章),介绍实现MLIR高级优化的理论基础。

作者简介

彭成寒:AI编译器与虚拟机技术专家,目前专注于LLVM、MLIR相关的AI编译器研究,并在JVM、V8和WebAssembly等虚拟机技术方面有着丰富的研发经验。深耕IT领域近20年,曾涉足应用软件和大数据开发等多个领域,并著有《深入理解LLVM:代码生成》《JVM G1源码分析和调优》《新一代垃圾回收器ZGC设计与实现》《深入探索JVM垃圾回收:ARM服务器垃圾回收的挑战和优化》等重要领域专著。

 
俞佳嘉:华为编译器与编程语言实验室鸿蒙开发者生态构建技术首席专家。拥有10余年底层技术研发经验,曾在Intel、Microsoft、华为等公司从事过编译器、虚拟机、指令翻译等相关研发工作,并深入参与了Intel Houdini、华为方舟编译器等产品的核心研发工作。
李灵:从事AI编译器研发工作,拥有7年编译器和虚拟机相关研发工作经验,曾深度参与多项LLVM/MLIR编译器研发工作。
李存:从事AI编译器相关工作,拥有6年体系结构相关底软研发经验,曾深度参与龙芯中科二进制翻译器、华为AI编译器项目。

目录

Contents 目  录
前言
第一部分 MLIR基础知识
第1章 绪论 2
1.1 当前编译器的发展现状与面临的
问题 3
1.2 引入MLIR后的变化 5
1.3 MLIR使用示例 7
1.3.1 高层抽象模型 7
1.3.2 接入MLIR体系 8
1.3.3 使用线性代数描述代码 9
1.3.4 使用仿射描述代码 11
1.3.5 接入LLVM体系 12
1.3.6 MLIR使用示例小结 13
1.4 MLIR的不足 14
1.5 本章小结 15
第2章 MLIR概述 16
2.1 IR的组成、结构与存储 16
2.1.1 组成 17
2.1.2 结构 19
2.1.3 存储 20
2.2 关键功能 21
2.2.1 谓词、约束、特质和接口 21
2.2.2 匹配与重写 21
2.2.3 调试 22
2.2.4 表描述语言及工具 23
2.3 其他功能 23
2.4 本章小结 24
第3章 类型、属性、操作和方言
详解 25
3.1 类型 25
3.1.1 定义与注册 26
3.1.2 文法 33
3.1.3 使用方式 35
3.2 属性 37
3.2.1 定义与注册 37
3.2.2 文法 38
3.2.3 特性 39
3.3 操作 39
3.3.1 定义 39
3.3.2 内存布局 48
3.3.3 文法 53
3.4 方言 54
3.4.1 定义 54
3.4.2 扩展 57
3.4.3 管理操作、类型和属性 59
3.4.4 方言示例:内建方言 60
3.5 编译上下文管理 63
3.6 本章小结 65
第4章 谓词、特质和接口 66
4.1 谓词 66
4.1.1 谓词概述 66
4.1.2 MLIR中的常见谓词 70
4.2 特质 71
4.2.1 特质的用途 71
4.2.2 特质的定义和使用 72
4.2.3 MLIR中的常见特质 74
4.3 接口 76
4.3.1 方言接口 77
4.3.2 操作接口 79
4.4 本章小结 90
第5章 Pass系统的工作流程 91
5.1 Pass、PassManager与Pass Pipeline
的应用 91
5.1.1 Pass介绍 92
5.1.2 在TD中定义Pass 93
5.1.3 注册Pass与Pass Pipeline 97
5.1.4 Pass的执行顺序 99
5.1.5 Pass的约束 100
5.1.6 Pass的插桩机制 101
5.1.7 标准插桩 103
5.2 分析与分析管理 105
5.3 本章小结 106
第6章 操作匹配与重写机制 107
6.1 操作匹配的设计与实现 108
6.1.1 模式 108
6.1.2 重写 110
6.1.3 应用 113
6.2 MLIR框架中的两种典型应用 114
6.2.1 贪婪匹配 114
6.2.2 方言降级 120
6.2.3 常量折叠与模式匹配机制 126
6.3 本章小结 127
第7章 MLIR中常见的通用优化
技术 128
7.1 操作数位置排序 128
7.2 IR归一化 129
7.3 控制流下沉 130
7.4 公共子表达式消除 131
7.5 IR验证器 132
7.6 循环不变量外提 132
7.7 内存到寄存器转换 133
7.8 拓扑排序 135
7.9 聚合类型的标量替换 136
7.9.1 应用示例 136
7.9.2 实现过程 136
7.10 内联 137
7.10.1 应用示例 137
7.10.2 实现过程 139
7.11 稀疏条件常量传播 140
7.11.1 MLIR数据流分析框架 140
7.11.2 sccp的实现 142
7.12 本章小结 144
第二部分 MLIR方言详解
第8章 业务接入方言 148
8.1 业务接入方言概述 148
8.2 tosa方言 149
8.2.1 上下游关系 150
8.2.2 优化 150
8.2.3 降级示例 151
8.3 本章小结 153
第9章 优化方言 154
9.1 linalg方言 154
9.1.1 目标与定位 155
9.1.2 上下游关系 156
9.1.3 重要操作 162
9.1.4 优化与变换 170
9.2 affine方言 180
9.2.1 affine方言概述 180
9.2.2 仿射表达式与半仿射表达式 181
9.2.3 部分操作分类与说明 183
9.2.4 上下游关系 184
9.2.5 优化与变换 185
9.2.6 降级示例 186
9.2.7 扩展阅读:affine方言与传统
多面体编译的异同 187
9.3 vector方言 188
9.3.1 vector方言概述 188
9.3.2 常用操作 190
9.3.3 上下游关系 193
9.3.4 优化与变换 194
9.3.5 降级示例 196
9.4 bufferization方言 197
9.4.1 bufferization方言概述 197
9.4.2 优化与变换 198
9.4.3 降级示例 202
9.5 应用示例 203
9.6 本章小结 206
第10章 结构方言与数据方言 208
10.1 结构方言 208
10.1.1 func方言 209
10.1.2 scf方言 211
10.1.3 cf方言 216
10.2 数据方言 218
10.2.1 builtin方言 218
10.2.2 arith方言 218
10.2.3 index方言 221
10.2.4 complex方言 222
10.2.5 tensor方言 224
10.2.6 sparse_tensor方言 226
10.2.7 memref方言 227
10.2.8 shape方言 231
10.2.9 math方言 233
10.3 本章小结 235
第11章 目标输出方言 236
11.1 llvm方言 236
11.1.1 类型 237
11.1.2 属性 239
11.1.3 操作 239
11.1.4 降级示例 240
11.2 硬件方言 241
11.2.1 硬件方言概述 241
11.2.2 arm_sme方言 243
11.2.3 GPU相关知识概述 248
11.2.4 gpu方言 251
11.2.5 nvgpu方言 258
11.2.6 nvvm方言 261
11.3 本章小结 266
第12章 元编程方言 267
12.1 transform方言 267
12.1.1 transform方言概述 267
12.1.2 transform方言的扩展实现 270
12.1.3 变换机制实现的难点 271
12.1.4 关键操作 272
12.1.5 transform方言的应用与扩展 273
12.1.6 辅助接口与特质 274
12.1.7 方言扩展说明 275
12.2 pdl与pdl_interp方言及pdll 277
12.2.1 pdl方言 277
12.2.2 pdl_interp方言 278
12.2.3 pdll 279
12.3 irdl方言 281
12.3.1 概述 281
12.3.2 关键操作 282
12.3.3 应用示例 282
12.4 本章小结 283
第三部分 MLIR实战项目剖析
第13章 Triton DSL的设计与编译
 优化 286
13.1 GPU优化挑战与Triton DSL设计
思路 286
13.2 Triton DSL的编译 288
13.2.1 Triton中的方言 288
13.2.2 Triton的编译过程 290
13.3 Triton的编译优化及降级 291
13.3.1 编译过程的优化与降级 291
13.3.2 Python代码解析与Triton IR
生成 295
13.3.3 Triton IR的优化 298
13.3.4 TritonGPU IR中的数据布局 303
13.3.5 TritonGPU IR的优化 311
13.3.6 基于MLIR社区方言的优化与
降级 363
13.4 Triton的未来发展趋势 364
13.5 本章小结 366
第四部分 MLIR中的数学知识与应用
第14章 多面体编译理论概述 368
14.1 仿射集、凸集、锥与多面体的
 定义 369
14.2 凸集的保凸运算 370
14.3 凸函数的保凸运算 371
14.4 一般优化与凸优化问题 371
14.4.1 一般优化问题的形式 372
14.4.2 凸优化问题的形式 372
14.5 循环优化 373
14.5.1 循环中的内存依赖分析 373
14.5.2 循环并行 377
14.5.3 循环融合 385
14.5.4 循环分块 390
14.6 本章小结 391
第15章 整数规划求解方法 392
15.1 方程组求解 392
15.1.1 高斯消元法 393
15.1.2 傅里叶-莫茨金消元法 395
15.2 线性规划与单纯形法 397
15.2.1 线性规划 397
15.2.2 单纯形法的发展与理论
基础 398
15.2.3 单纯形法简介 401
15.3 整数规划与分支定界法 406
15.4 Presburger算术 407
15.4.1 概述 408
15.4.2 化简 409
15.4.3 集合操作 409
15.5 MLIR中的整数规划求解分析 410
15.5.1 无目标的可行性求解与单纯
形表变换 411
15.5.2 整数规划求解的变量分类与
实现方式 412
15.6 本章小结 414
附录 其他方言 415

前言/序言

Preface 前言
为何写作本书
本书是“深入理解LLVM”系列图书的第二本。在该系列的第一本《深入理解LLVM:代码生成》中,我们以BPF后端为例详细介绍了LLVM代码生成的整个流程。而本书的重点则聚焦于介绍MLIR。
MLIR目前是LLVM中的一个顶级子项目,它由Chris Lattner在谷歌孵化,最早应用于TensorFlow。2019年,MLIR正式开源。截至2025年,它依然是编译领域最热门的技术方向之一。
需要说明的是,MLIR并非传统意义上的编译器,而是用于构建编译器的基础设施。过去几年间,MLIR的应用极为广泛,涵盖AI编译器,如IREE、Triton、XLA等;领域特定编译器,如同态加密编译器、量子编译器;专有硬件架构配套编译器,如众多硬件公司都在基于MLIR开发自家的专有编译器,甚至在一些新型编程语言的开发中也能看到它的身影。
然而,MLIR的学习曲线较为陡峭,对开发者并不十分友好。它引入了诸多全新概念,如接口、降级(Lowering)、类型检查、重写等。这些概念都是在传统编程知识与编译器基础知识之上构建起来的。这就意味着开发者不仅要熟练掌握C++语言、模板等知识要点,还得深入了解传统编译器的基础知识,如静态单赋值形式(SSA)、TableGen等,甚至还需涉猎Python开发以及C++与Python之间的互操作等相关内容。只有全面掌握这些知识体系,开发者才能运用MLIR高效开展各类编译器开发工作。但受限于篇幅,本书无法对这些基础知识进行详尽介绍。对于C++、模板等知识,读者可以参考相关的专业开发书籍;对于编译器基础部分的内容,读者可参考《深入理解LLVM:代码生成》,该书对SSA、TableGen等知识
有较为详细的讲解。
内容设置说明
本书内容基于LLVM 20展开。不同的LLVM版本在算法实现和工具命令上可能略有差异,读者在进行实验时应注意选择正确的版本,否则得到的结果可能和本书中给出的并不一致。为了保证读者和笔者使用相同的源码,笔者维护了一个LLVM代码仓的镜像:https://github.com/inside-compiler/llvm-project。
本书着重阐释MLIR的原理,全方位囊括MLIR的各类基础概念,包括方言、操作、贪婪匹配、方言降级以及部分优化原理等。此外,本书对MLIR社区所提供的方言和操作进行了简明介绍,深入梳理了各个方言之间的上下游关系,并分析了不同方言所采用的优化策略,帮助读者构建起清晰的知识脉络。
为使读者切实领会MLIR在实际场景中的运用,本书以OpenAI主导的Triton编译器为例,细致剖析了其基于MLIR的实现流程,助力读者全面、深入地掌握MLIR知识及其应用技巧。
最后,本书专门介绍了MLIR在循环优化方面涉及的数学内容,包括凸优化的基础概念、将循环问题映射为优化问题的方法、线性规划和整数规划的原理以及相应的求解过程,拓宽读者在MLIR应用中的知识边界。
如何阅读本书
本书结构清晰,层次分明,既涵盖理论基础,又融合工程实践,为编译器开发者、AI框架研究人员及高性能计算从业者提供了宝贵的技术参考。全书共15章,分为4部分,具体内容如下。
第一部分为MLIR基础知识(第1~7章),系统讲解MLIR的核心概念与底层机制,是理解后续内容的基石。
第1章介绍当前编译器的发展现状与面临的问题,说明了MLIR如何通过多层级IR(Intermediate Representation,中间表示)架构解决领域特定语言(Domain-Specific Language,DSL)集成、优化复用和目标适配等问题,并通过具体示例展示了从高层模型到LLVM IR的完整转换路径,最后分析了MLIR的不足,帮助读者建立对MLIR价值的直观认知。
第2章详细解析了MLIR中IR的组成、结构、存储格式及关键功能,如谓词、重写机制和调试支持,同时介绍了表描述语言等工具链,为后续深入开发打下基础。
第3章深入探讨了MLIR中的类型、属性、操作和方言的定义、注册与使用流程等,以及编译上下文管理,揭示了MLIR灵活扩展能力的实现原理,帮助读者掌握自定义DSL的关键技术。
第4章聚焦谓词、特质与接口的实现机制与使用方式,阐述其在约束表达、行为抽象和跨方言交互中的重要作用,提升代码的可维护性与模块化程度。
第5章全面解析Pass系统的工作流程,包括Pass、PassManager与Pass Pipeline的应用,以及Pass分析与分析管理,帮助读者构建高效的Pass优化Pipeline。
第6章深入剖析操作匹配与重写机制,阐明其在贪婪匹配、方言降级和常量折叠中的核心作用,这些是实现IR变换不可或缺的技术支撑。
第7章汇总了MLIR中常见的通用优化技术,如循环不变量外提、稀疏条件常量传播等,并结合数据流分析框架讲解其实现原理,极大提升读者对编译优化策略的理解深度与应用能力。
第二部分为MLIR方言详解(第8~12章),全面梳理MLIR生态中的核心方言体系,带领读者了解其强大的表达能力与优化潜力。
第8章介绍业务接入方言(如tosa),阐明tosa作为AI模型前端抽象的作用及其向底层方言的转换路径与降级示例,为模型部署提供了标准化接口。
第9章重点分析linalg、affine、vector、bufferization等关键优化方言,展示它们在张量运算、循环优化、向量化和内存缓冲化方面的强大处理能力,并通过典型降级示例揭示了多层次优化的协同机制。
第10章解析结构方言(func、scf、cf)和数据方言(tensor、memref、arith等),这些是构建完整程序语义的基石,也是连接高层语义与底层实现的桥梁。
第11章探讨目标输出方言,包括llvm以及面向GPU、ARM等硬件的专用方言(如gpu、nvgpu、nvvm),揭示MLIR如何实现跨平台代码生成。
第12章深入分析了元编程方言(transform、pdl、irdl),介绍如何通过声明的方式描述优化变换,提升了编译器的开发效率与可验证性,代表了编译器自动化的新方向。
第三部分为MLIR实战项目剖析(即第13章),以OpenAI的Triton DSL为例系统剖析MLIR的设计理念及其编译优化与降级流程,详细展示从Python代码到GPU高效代码的关键转换过程,揭示了Triton在AI算子自动化优化中的技术优势,并展望了其未来发展方向,为构建领域专用编译器提供了完整范式。
第四部分为MLIR中的数学知识与应用(第14~15章),介绍实现MLIR高级优化的理论基础。
第14章介绍了多面体编译理论,涵盖主要概念(仿射集、凸集、锥、多面体、凸函数)的定义与常见凸集与凸函数的保凸运算,以及凸优化问题形式及循环优化的方法,帮助读者理解affine方言背后的数学原理。
第15章讲解了整数规划求解方法,涵盖方程组求解、线性规划与单纯形法、整数规划与分支定界法,并解析了MLIR中的Presburger算术与整数规划求解分析,以增强读者对复杂优化决策过程的洞察力。
本书不仅是一本技术手册,更是一部融合理论、架构与实践的深度指南,可帮助读者从零构建对MLIR体系的完整认知,掌握构建高性能领域专用编译器的核心能力,从而在AI编译、异构计算和系统软件开发等领域发挥实际作用。
写作分工
本书的写作分工如下:第9章由李灵、彭成寒共同完成,第11章由李存、彭成寒共同完成,第13章主要由俞佳嘉完成,其余内容由彭成寒完成;全书由彭成寒审阅定稿。
勘误与支持
鉴于本人学识有限,书中难免存在疏漏与不足之处。在此,恳请广大读者不吝赐教,予以批评指正。若你在阅读时发现问题,烦请通过https://github.com/inside-compiler/Inside-LLVM-Code-Gen/issues提交反馈。此外,本书的最新勘误信息将在https://inside-compiler.github.io/持续更新,供你查阅。
由衷期待收到各位读者的真挚反馈。在技术探索之路上,挑战与惊喜并存,愿我们相互鼓励,携手共进。
致谢
感谢来自华为、中科加禾、字节跳动、美团、摩尔线程等公司的编译器专家对本书的审阅,特别感谢朱钏、郭恩待、段富臣、陈龙、王龙、季涛、闫柏成、左传勇、苏可、韩翔、张聪、闫明辉、朱天阳、吴震宇、黄灏、庄熠等专家。他们以敏锐的专业眼光和严谨的治学态度对书稿进行了全面且深入的审阅,并提出了一系列具有建设性、针对性的宝贵意见和建议。这些反馈为书稿的完善指明了方向,使本书在内容准确性、逻辑连贯性以及可读性等方面均得到了显著提升。对于他们的悉心指导与无私帮助,我满怀敬佩与感激之情。
最后,我要把最深沉的感激献给我的家人。在本书创作的漫长岁月里,他们给予我始终如一的理解、毫无保留的支持与默默无私的付出。他们承担了生活中的烦琐事务,为我营造了一个宁静、和谐的创作环境,让我能够心无旁骛地投入到本书的写作中,从而能精心打磨每一个章节和每一段文字。正是家人的温暖陪伴与坚定的支持,我才得以顺利完成这项意义重大的工作。在此,我要向家人表达无尽的爱意与感激。

彭成寒

📑 章节目录

  1. 绪论:编译器发展现状与MLIR引入
  2. MLIR概述:IR组成、结构与关键功能
  3. 类型、属性、操作和方言详解
  4. 谓词、特质和接口
  5. MLIR的匹配与重写机制
  6. MLIR的调试与表驱动开发
  7. MLIR的编译流程与Pass管理
  8. 核心方言:内建方言与标准方言
  9. 张量、Linalg与仿射方言
  10. GPU与SPIR-V方言
  11. LLVM方言与代码生成
  12. 其他重要方言与协同优化
  13. OpenAI Triton实战:编译优化与降级全流程
  14. 多面体编译理论与凸优化基础
  15. 整数规划与高级优化应用