一般编译器错误_[翻译]MLIR:摩尔定律终结的编译器基础结构

[翻译]MLIR:摩尔定律终结的编译器基础结构

MLIR:A Compiler Infrastructure for the End of Moore's Law

作者:Chris Lattner等

翻译:汪岩

[摘要]本文提出了MLIR,这是一种构建可重用、可扩展编译器基础结构的新方法。MLIR旨在解决软件碎片化,改进异构硬件的编译过程,大大降低了构建领域特定编译器的成本,并有助于将现有的编译器连接在一起。MLIR还有助于在不同抽象级别、不同跨应用程序域、不同硬件目标和执行环境,改善代码生成器、翻译器和优化器的设计和实现。本文的贡献包括(1)讨论MLIR作为本文研究成果可能的扩展和进化,并指出这个新设计方法在设计、语义、优化规范、系统和工程等方面带来的挑战和机遇。(2)评估MLIR作为可减少构建编译器成本的通用架构,通过描述各种用例,显示本文研究成果在未来编程语言、编译器、执行环境和计算机体系结构方面的研究和教学机会。本文还介绍了MLIR设计基本原理、结构和语义。

  1. 简介

编译器设计是一个成熟的领域,包括许多广为人知的算法,可用于代码生成、静态分析、程序转换等。编译器设计领域已发展出许多成熟技术平台,这些平台现在已经在整个编译器社区大规模应用,包括LLVM编译器基础结构[25]、Java虚拟机(JVM)[26]等系统。这些流行系统的一个共同特征是它们的“one size fits all”方法,即与系统接口的是单一抽象级别,例如LLVM中间表示(IR)大致是“带有向量的C(C with vectors)”,而JVM提供了“具有垃圾收集器的面向对象类型系统(object-oriented type system with a garbage collector)”抽象。这种“one size fits all”的方法非常有价值,因为从源语言(C/C ++和Java)到这些抽象领域的映射非常直接。

同时应该指出,许多问题在较高或较低级别的抽象层级建模会更好。例如在LLVM IR上,对C ++代码进行源代码级分析非常困难。我们注意到,许多语言(例如Swift,Rust,Julia,Fortran)都开发了自己的IR,以解决这些语言领域特定的问题,例如语言/库相关的优化、流敏感( flow-sensitive)类型检查(例如线性类型)和改善降级(lowering)流程的实现。类似地,机器学习系统通常将“ML图”用作领域特定的抽象。

尽管领域特定IR的开发已经是一项已经被充分研究的技术,但其工程和实现成本仍然很高。对于这些系统的实现者而言,有时候基础结构的质量不一定是优先考虑的因素。这可能导致编译器系统的实现质量降低,这包括一些用户可见的问题,例如编译时间慢、错误的实现、诊断质量欠佳、优化代码的调试体验差等等。

MLIR项目的目的就是要应对这些编程语言设计和实现方面的挑战,采用的方法是通过非常简便地定义和引入新的抽象级别,并提供“现成的(in the box)”基础架构来解决常见的编译器工程问题。 MLIR的做法是:(1)标准化基于静态单赋值(SSA)的IR数据结构,(2)提供用于定义IR dialect的声明系统,(3)提供广泛的通用基础结构(包括文档、解析和打印逻辑、位置跟踪、多线程编译支持、pass管理等)。

本文探讨了MLIR系统的各个设计要点,将我们的经验应用于不同的问题,并讨论了这项工作可能对编程语言设计和教学产生的影响。

贡献

尽管大多数MLIR系统是由广为人知的编译器算法构建,但MLIR的设计要点很新颖,为其它研究提供了机会。本文的贡献是:

  • 描述了一种对工业界和学术界有重要应用价值的新型编译器基础结构;
  • 提出了一种构建可扩展和模块化编译器系统的新方法;
  • 选择了一些MLIR在不同领域的应用,说明了系统的通用性;
  • 分享了在MLIR基础架构上开发编译系统的经验。

1.2 MLIR起源

之所以会发起MLIR,首先是意识到现代机器学习框架由许多不同的编译器、图技术和运行时系统组成(请参见图1),但是这些部分没有共享公共的基础结构或设计观点,而且有些部分没有遵循最佳编译器设计实践,导致的后果是用户可以明显感觉到不便,包括不完善的错误消息、边界情况下的错误、不可预测的性能,以及难以支持新硬件。

我们很快意识到,整个编译器行业都存在一个类似的问题,那就是,诸如LLVM之类的现有编译系统在跨多语言实现的统一和集成方面非常成功,但是现代高级语言通常最终会构建自己的高级IR,并重复发明许多相同的更高层抽象技术(请参见图2)。同时,在LLVM社区经常出现一些争论,比如,如何最好地表示并行结构,如何共享常见的前端降级基础架构实现(例如,用于C调用约定或诸如OpenMP之类的跨语言功能),但都没有得出令人满意的解决方案。

面对这些挑战,我们认为我们无法承担实现N个改进的编译器的工作量,因此我们需要构建一个更通用的解决方案。我们可以花精力开发一套高质量的基础架构,这会让多个领域受益,会让我们能够逐步升级现有系统,让我们能够更轻松地解决眼下紧迫的问题,例如专用加速器的异构编译。

现在,我们在构建和部署基于MLIR的系统方面积累了大量经验,可以回顾一下MLIR基础架构的原理和设计,并讨论为什么要朝这个方向发展。

2. 设计原理

本节探讨了指导MLIR设计的需求。

内置少,一切可定制(Little builtin, everything customizable)

MLIR系统基于最少量的基本概念,大部分中间表示都完全可定制。在设计时,应当用少量抽象(类型、操作和属性,这是IR中最常见的)表示其它所有内容,从而可以使抽象更少、更一致,也让这些抽象易于理解、扩展和采用。从广义上讲,可定制性确保编译系统可以适应不断变化的需求,并且更有可能适用于未来的问题。从这个意义上讲,我们应该将IR构建为支持其中间语言的语法和语义、具有可重用组件和编程抽象的基础结构。

定制化成功的标准是可以表达多种抽象,包括机器学习图、AST、数学抽象(例如多面体)、控制流图(CFG)和指令级IR(例如LLVM IR),而且从抽象到编译系统无需使用任何硬编码概念。

当然,由于兼容性不佳,可定制性会带来内部碎片的风险。虽然不可能有一种纯粹的技术解决方案来解决生态系统碎片化问题,但系统应鼓励设计可重用抽象,并假定这些抽象会在设计的预料范围之外使用。

SSA和regions

静态单赋值形式[15]是编译器IR中广泛使用的表示形式。静态单赋值有许多优点,包括使数据流分析变得简单而稀疏,并且由于静态单赋值与延续传递风格(Continuation-Passing Style, CPS))的关系,编译器开发社区对静态单赋值已有广泛理解,并且已被应用到主要框架中。尽管许多现有的IR使用扁平的(flat)、线性CFG,但代表更高级别的抽象却推动将嵌套区域(nested regions)作为IR中最重要的概念。这超越了传统的区域形式,提升了抽象级别(例如,loop trees),加快了编译过程、指令提取或SIMD并行性[22,21,37]。为了支持异构编译,系统必须支持结构化控制流、并发构造、源语言中的闭包等等。一个具体的挑战就是在嵌套区域之上构造CFG分析和转换。

在此过程中,会牺牲LLVM的归一化(normalization),有时甚至牺牲其规范化(canonicalization)属性。能够将各种数据和控制结构降级为更小的归一化(normalized)表示集合,这对于控制编译器的复杂性至为重要。具有pre-header、header、latch、body的规范循环(canonical loop)结构是前端语言中各种循环构造的线性化控制流表示的典型情况。MLIR的目的是为用户提供一种选择,即,根据编译流程中pass的编译算法,可以将嵌套循环捕获为嵌套区域或线性化控制流。通过提供这种选择,我们可以脱离LLVM的normalization-only方向,同时保留了在必要时处理更高级别抽象的能力。反过来,采用MLIR的这些方法也产生了如何控制抽象规范化(normalization)的问题,这是下一段的主题。

【译注:“规范(canonical)”形式和“归一(normal)”形式之间的区别因不同领域而异。在领域中,规范形式为每个对象指定唯一的表示形式,而归一形式仅指定其形式,而无需唯一。因此,规范化比归一化要求更严格】

渐进式降级(Progressive lowering)

编译系统应支持渐进式降级,即,以较小的步幅,依次经过多个抽象级别,从较高级别的表示降低到最低级别。需要多层抽象是因为通用编译器基础结构必须支持多种平台和编程模型。

以前的编译器已经在其pipeline中引入了多个固定的抽象级别,例如Open64 WHIRL表示[30]具有五个级别,Clang/LLVM编译器从AST降级到LLVM IR、SelectionDAG、MachineInstr和MCInst。上述降级实现方式较为僵化,因而需要更灵活的设计来支持抽象级别的可扩展性。

这对转换不同阶段的排序有深刻影响。随着编译器专家们实现越来越多的转换pass,这些pass之间开始出现复杂交互。实际情况表明,将优化pass结合起来运行可以使编译器发现更多的程序有用信息。能说明合并pass好处的例子是混合常量传播、值编号(value numbering)和不可达代码消除的尝试[13]。一般而言,编译器pass可大致分为四个角色:(1)优化转换,(2)启用转换,(3)降级࿰

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值