深度学习编译器介绍——前端编译

深度学习编译器需要理解输入的源程序并将其映射到目标机。为了实现这两项任务,编译器的设计被分解为两个主要部分:前端和后端。

本节部分内容摘自https://openmlsys.github.io/


    深度学习编译器需要理解输入的源程序并将其映射到目标机。为了实现这两项任务,编译器的设计被分解为两个主要部分:前端和后端。前端是不感知具体后端硬件的,因此前端执行的全部都是与硬件无关的编译优化。

    前端的主要功能:解决编译生成的中间表示的低效性,使得代码的长度变短,计算图更简洁,编译与运行的时间减少,执行期间处理器的能耗变低。前端流程可以用下图表示:

attachments-2022-11-mg2nHzjD636baf873e0c9.png

    传统中间表示如LLVM IR,能够很好地满足通用编译器的基本功能需求,包括类型系统、控制流和数据流分析等。然而,它们偏向机器语言,难以满足机器学习框架编译器的中间表示的需求。因此出现了大量支持自动微分等深度学习特有功能的中间表示,如TorchScript IR、XLA HLO和MLIR等。


    前端编译优化的方法有很多,机器学习框架也有很多不同于传统编译器的优化方式,包括无用与不可达代码消除、常量传播和常量折叠、公共子表达式消除。


attachments-2022-11-0QeTlvCD636bb4fa3361c.png

    无用与不可达代码消除:无用代码是指输出结果没有被任何其他代码所使用的代码。不可达代码是指没有有效的控制流路径包含该代码。删除无用或不可达的代码可以使得中间表示更小,提高程序的编译与执行速度。无用与不可达代码一方面有可能来自于程序编写者的编写失误,也有可能是其他编译优化所产生的结果。



attachments-2022-11-htu6TcgT636bb5643f562.png

常量传播:如果某些量为已知值的常量,那么可以在编译时刻将使用这些量的地方进行替换。

常量折叠:多个量进行计算时,如果能够在编译时刻直接计算出其结果,那么变量将由常量替换



attachments-2022-11-1HFxk3h6636bb6f210349.png

公共子表达式消除:如果一个表达式E已经计算过了,并且从先前的计算到现在E中所有变量的值都没有发生变化,那么E就成为了公共子表达式。对于这种表达式,没有必要花时间再对它进行计算,只需要直接用前面计算过的表达式结果代替E就可以了。







你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
FC
FC

4 篇文章

作家榜 »

  1. Panda-admin 37 文章
  2. 解弘艺 17 文章
  3. 高曾谊 16 文章
  4. 旺仔牛奶opo 15 文章
  5. 胡中天 14 文章
  6. LH 14 文章
  7. 罗柏荣 13 文章
  8. 林晨 12 文章