背景
编译器后端的第一步是生成低级IR。低级IR可以理解为实现单个算子的算法的抽象表达形式。
编译器后端的第二步是后端优化。针对不同的硬件架构,不同的算法实现方式有不同的性能。后端优化的目的就是希望能找到算子的最优实现方式,达到最优的性能。编译器后端优化是AI编译器的核心内容。编译器后端的第三步是代码生成。代码生成即把优化后的低级IR转化成机器指令,这一步通常会借助其他成熟的编译工具来实现,不是AI编译器的核心内容。常用的编译工具包括跨平台的LLVM、Nvidia GPU的编译工具NVCC等等。AI编译器会将低级IR转化成这些成熟编译工具的输入形式,再调用它们生成机器指令。
针对不同的ir,目前现存的方式分为两种:
Halide-based IR
Halide-based IR的基本原理是Compute和Schedule的分离。 与其直接给出具体方案,在各种的shcedule中的方案找到最优解。 手写schedule的模板:例如Halide和TVM,他们的思想是将每个算子(conv2d)的计算分为compute和schedule。compute不需要考虑底层硬件架构来写计算规则,schedule是优化底层的tensor计算,包括如何访存,如何并行。缺点是描述优化的空间有限,也就是可以应用的原语有限。
Polyhedral-based IR
基于halide描述的IR,然后抽象出多项式的ir,描述一个计算是通过domain(所有数据的范围),Sequence(计算的映射以及规则),Band(计算的范围),Context(约束关系)。基于这个ir然后生成调度树,在树通过搜索算法中可以找到最优解。
一般情况下,多数的框架都是走dsl->halide IR->poly IR的。例如Tensor comprehension的技术路线。
同系列文章参考
图层面的技术
神经网络编译器图层面IR
神经网络编译器-常量折叠
神经网络编译器优化-死代码消除
算子层面的技术
Halide-based IR和 Polyhedral-based IR简介
后端优化技术loop transformation
神经网络编译器的Tensor优化:auto tune和auto schedule
神经网络的加速
神经网络的加速技术
神经网络稀疏性调研
神经网络中矩阵稀疏性的编码方式