![]()
内容推荐 编译技术是计算机科学领域的一个重要分支,经过长时间的发展,当前编译技术的重点是中间过程的程序优化和后端代码的生成。本书主要内容分为8章。第1章从体系结构发展对编译技术的影响,引出多面体模型及其研究意义。第2章介绍了多面体模型的数学基础,包括相关的定义、定理和所需要的数学方法。第3章介绍了多面体模型对程序进行优化和代码生成的基本前提,即依赖关系的定义、性质及其测试和分析方法。第4章详解了多面体模型中最经典的Pluto调度算法,以及循环变换。第5章就多面体模型面向程序并行性的研究进行了梳理和归纳,对各种不同的循环分块形状实现原理进行了阐述。第6章针对如何利用局部性原理在多面体模型中进行优化进行了介绍。第7章介绍了根据多面体模型的数学抽象描述生成抽象语法树表示的方法。第8章介绍了多面体模型及其相关理论的最新进展。 本书是计算机科学与技术专业课程的教学参考书,适用于计算机和软件工程专业的大学生、研究生,也可供数学领域和人工智能芯片领域的相关人员参考。 作者简介 赵捷,2009年于清华大学获得工学学士学位,2018年于法国巴黎高等师范学校获得工学博士学位,现就职于数学工程与先进计算国家重点实验室。赵捷博士长期从事编译器高级优化和代码生成方面的研究,目前主要从事深度学习编译器的研究。 目录 第1章 体系结构发展对编译技术的影响 1.1 面向经典体系结构的性能优化 1.1.1 并行性发掘 1.1.2 存储层次结构 1.1.3 领域专用架构 1.2 编译器面临的挑战 1.2.1 并行性发掘 1.2.2 局部性发掘 1.2.3 编程模型和抽象层次 1.3 循环优化的数学抽象 1.3.1 多面体模型的基本概念 1.3.2 多面体模型在编译器中的应用 1.3.3 基于多面体模型的编译流程 第2章 程序抽象表示基础 2.1 抽象表示在编译器中发挥的作用 2.2 整数集合与仿射函数 2.2.1 静态仿射约束 2.2.2 整数集合 2.2.3 仿射函数 2.2.4 集合与映射的运算 2.3 Fourier-Motzkin消去法 2.4 调度树 2.4.1 调度的表示方式 2.4.2 调度树的结点 2.4.3 调度树的操作 2.4.4 调度表示的比较 2.5 抽象语法树 2.5.1 被执行关系 2.5.2 上下文信息 2.5.3 结点和表达式 2.6 各种抽象的工程实现 2.6.1 整数集合和仿射函数的实现 2.6.2 调度树的实现 2.6.3 抽象语法树的实现 第3章 依赖关系分析 3.1 依赖关系分析在编译优化中的作用 3.2 依赖及其性质 3.2.1 依赖的分类 3.2.2 距离向量与方向向量 3.2.3 循环无关依赖和循环携带依赖 3.2.4 依赖与变换 3.2.5 依赖的复杂性 3.3 依赖测试 3.3.1 精确测试与保守测试 3.3.2 ZIV测试 3.3.3 SIV测试 3.3.4 GCD测试 3.3.5 Banerjee测试 3.3.6 I测试 3.4 耦合下标依赖测试 3.4.1 扩展的GCD测试 3.4.2 λ测试 3.4.3 Delta测试 3.4.4 Omega测试 3.5 特殊的依赖测试 3.5.1 D测试 3.5.2 Range依赖测试 3.6 数据流分析 3.6.1 精确数据流分析 3.6.2 近似数据流分析 3.6.3 带标记的数据流分析 3.7 依赖与并行化 第4章 循环变换 4.1 适配体系结构特征的关键技术 4.2 预处理 4.2.1 循环正规化 4.2.2 死代码删除 4.2.3 别名分析 4.2.4 迭代空间分裂 4.3 多面体模型中的循环变换 4.3.1 循环变换分类 4.3.2 循环变换的复杂性 4.3.3 Pluto调度算法 4.4 仿射循环变换 4.4.1 循环交换 4.4.2 循环反转 4.4.3 循环延展 4.4.4 循环倾斜 4.4.5 循环合并 4.4.6 循环分布 4.5 近似仿射循环变换 4.5.1 循环分块 4.5.2 循环分段 4.5.3 循环展开压紧 4.6 代码生成过程中的循环变换 4.6.1 分块分离 4.6.2 循环展开 4.6.3 其他循环变换 4.7 循环压紧 第5章 开发并行性 5.1 利用多面体模型发掘数据并行 5.2 复杂的分块形状 5.2.1 交叉分块 5.2.2 分裂分块 5.2.3 钻石分块 5.2.4 六角形分块 5.3 Feautrier调度算法 5.3.1 一维时间表示的调度计算 5.3.2 多维时间表示的调度计算 5.4 开发向量化 5.4.1 可向量化Codelet 5.4.2 利于向量化的调度算法 5.5 面向分布式存储结构的并行 5.5.1 构造通信数据集 5.5.2 通信优化 第6章 挖掘局部性 6.1 金字塔形存储层次结构之外的挑战 6.2 面向不同优化目标的循环合并策略 6.2.1 基于依赖图的循环合并算法 6.2.2 拆分弱连通图 6.2.3 合并强连通分量 6.3 循环合并与循环分块的组合 6.3.1 先合并后分块 6.3.2 分块后再合并 6.3.3 提升高速缓存的使用率 6.4 数据空间变换 6.4.1 间接数据空间变换 6.4.2 显式数据空间变换 6.5 提升局部性的调度优化 6.5.1 循环分块后的重新调度 6.5.2 面向数据访存连续性的调度优化 6.6 数组压缩 6.6.1 内存竞争关系 6.6.2 划分数据空间 6.6.3 代价模型 第7章 代码生成 7.1 一个比输出指令序列更复杂的任务 7.2 代码生成方法 7.2.1 凸包算法 7.2.2 分割算法 7.3 分割代码生成 7.3.1 for循环生成 7.3.2 if语句的生成位置 7.3.3 循环展开 7.3.4 分块分离 7.3.5 循环退化 7.3.6 带偏移的跨步循环 7.4 if控制流优化 7.5 内存管理 7.5.1 CPU与GPU间的传输 7.5.2 内存提升 7.6 同步指令 第8章 多面体编译理论的最新进展 8.1 MLIR 8.1.1 MLIR基本概念 8.1.2 与多面体模型的集成 8.2 Halide 8.2.1 Halide设计理念 8.2.2 Halide调度树 8.3 Tiramisu 8.4 Tensor Comprehensions 8.5 AKG 8.6 面向Tensor Core的自动代码生成 参考文献 |