
深入理解LLVM:MLIR原理与OpenAI Triton实现分析 内容简介
本书由国内头部科技企业资深编译器专家团队倾力撰写,凝练团队多年深耕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高级优化的理论基础。
深入理解LLVM:MLIR原理与OpenAI Triton实现分析 作者简介
彭成寒: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编译器项目。
深入理解LLVM:MLIR原理与OpenAI Triton实现分析 目录
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
