MLIR项目是一种构建可重用和可扩展的编译器基础结构的新颖方法。MLIR旨在解决软件碎片问题,改善异构硬件的编译,显着降低构建特定于域的编译器的成本,并有助于将现有的编译器连接在一起。
要引用MLIR,请使用 此Arxiv出版物 。
更多资源
有关MLIR的更多信息,请参见:
另请参阅TensorFlow MLIR SIG,该组织每周组织一次有关MLIR的公开“开放设计会议”。 如果您想讨论特定主题或有疑问,请将其添加到议程文档中。 有关如何加入会议的详细信息,请参阅议程文档。
MLIR是做什么用的?
MLIR旨在成为一种混合IR,它可以在统一的基础架构中支持多种不同的需求。例如,这包括
- 表示数据流图的能力(例如在TensorFlow中),包括动态形状,用户可扩展的op生态系统,TensorFlow变量等
- 通常在此类图表上进行优化和转换(例如在Grappler中)
- 适合于优化的形式表示ML操作的内核
- 能够托管跨内核的高性能计算风格的循环优化(融合,循环交换,平铺等),并能够转换数据的内存布局
- 代码生成的“降低”转换,例如DMA插入,显式缓存管理,内存平铺以及针对1D和2D寄存器体系结构的矢量化
- 够表示特定于目标的操作,例如加速器特定的高级操作。
- 在深度学习图上进行量化和其他图转换。
MLIR是一种常见的IR,也支持特定于硬件的操作。 因此,对MLIR周围基础架构的任何投资(例如,编译器对其进行的工作都应通过)应产生良好的回报; 许多目标可以使用该基础架构并将从中受益
MLIR是强大的表示形式,但也有非目标。 我们不尝试支持底层机器代码生成算法(例如寄存器分配和指令调度)。 它们更适合较低级别的优化器(例如LLVM)。 而且,我们不希望MLIR成为最终用户自己将内核编写为源语言的源语言(类似于CUDA C ++)。 另一方面,MLIR提供了代表任何此类DSL并将其集成到生态系统中的骨干。
编译器基础架构
在构建MLIR时,我们从构建其他IR(LLVM IR,XLA HLO和Swift SIL)获得的经验中受益。 MLIR框架鼓励现有的最佳做法,例如 编写和维护IR规范,构建IR验证程序,提供将MLIR文件转储和解析为文本的功能,使用FileCheck工具编写广泛的单元测试以及将基础结构构建为一组可以以新方式组合的模块化库。
其他课程已经以微妙的方式整合到设计中。 例如,LLVM具有非显而易见的设计错误,这些错误会阻止多线程编译器同时处理LLVM模块中的多个功能。 MLIR通过限制SSA范围以减少use-def链并用显式符号引用替换跨功能引用来解决这些问题。