LLVM将何去何从?

2021-12-28 14:01:31 来源: 半导体行业观察

来源:内容由半导体行业观察(ID:icbank) 编译自HPCWIRE ,谢谢。


现在,LLVM 编译器已经随处可见。但早在 2000 年,LLVM(low level virtual machine:低级虚拟机)才刚刚起步,作为一种思考如何克服 Java 虚拟机缺点的新方法而备受关注。当时,LLVM的开拓者Chris Lattner)还是伊利诺伊大学 Vikram Adve 的研究生。

“Java 正在接管世界。这真的很令人兴奋。没有人知道 Java 的界限在哪里。我们中的一些人对可能不适合它的那种工作负载有一些担忧。但是编译的故事还很早。即时编译器刚刚出现,”Lattner 回忆道。

上个月参加 SC21 的炉边谈话时,Lattner 回顾了 LLVM 是如何 从他 2000 年在伊利诺伊大学厄巴纳-香槟分校的硕士论文项目发展成为一个广泛的社区历程,几乎每个生产编译器和编程语言工具的大公司也都参与到这个社区当中。他还讨论了 LLVM 的未来、他在 Swift MLIR 方面的工作 ,以及在开源社区工作的回报和挑战。

“Vikram 和我有一个想法,如果我们采用这种即时编译器技术,但进行更多的提前编译,我们可以在整个程序优化分析方面获得更好的权衡,同时还可以构建分析工具,并获得更好的性能。LLVM(低级虚拟机)这个名称很多都来自于采用 Java 虚拟机并在其下构建一些东西的想法,这是一个您可以对其进行整个程序优化的平台,”Lattner 说。

“在构建了一大堆基础设施并学习了所有这些编译器的东西之后,我喜欢边做边学,我们实际上最终说,好吧,我们构建一个代码生成器怎么样?我们如何与 GCC (GNU Compiler Collection)集成。在很早的时候,它是作为 Java 的东西出现的,但最终成为了一个面向 C 和静态编译的工具语言获得了关注。所以,很多早期的创世纪都出轨了。但它成为了一个非常有用的平台,可用于大量不同领域的研究和应用。”

当然,Lattner 对编程世界并不陌生。他在 LLVM、Clang 和 Swift 方面的大部分工作都是在他在 Apple 期间完成的。Lattner 还在特斯拉领导其自动驾驶团队短暂工作过。他目前是开发 RISC-V 处理器的 SiFive 平台工程高级副总裁。

这里展示的是 Lattner 对他在 LLVM 社区的工作及其未来的一些评论(略有编辑)。

我在 Apple 的时光—— “你不明白……没有什么能取代 GCC”


当 Lattner 于 2005 年从伊利诺伊大学毕业时,LLVM 仍然是一个高级研究项目。“生成的代码的质量并不完美,但很有希望,”他回忆道。一位 Apple 工程师正在使用 LLVM,并与一位 Apple VP 进行了交流。当时 Lattner 正在通过邮件列表与工程师合作。

“时机恰到好处。Apple 一直在 GCC 上投入大量资金,我不知道当时是 GCC 技术还是 Apple 的 GCC 团队,但管理层对其缺乏进展感到非常沮丧。我与这位认为编译器很有趣的 VP 进行了交谈,他决定给我一个机会。他雇用了我并说,‘是的,你可以在这个 LLVM 上工作。表明这不是一个坏主意。[不久之后]他鼓励说'你可以有一年左右的时间来研究这个。最坏的情况是,你是个聪明人,我们可以让你在 GCC 上工作。'”

上任几周后,Lattner 记得曾被一位经验丰富的 Apple 工程师问到“你为什么在这里”。在解释了他的 LLVM 项目后,这位同事说:“你不明白。GCC 已经存在 20 年了,有数百人在研究它,没有什么能取代 GCC,你在浪费时间。” Lattner 说:“好吧,我不知道,但我玩得很开心。”

事实证明,图形领域非常需要即时编译器,而 LLVM 是一个很好的解决方案。

Lattner 说:“OpenGL 团队一直在苦苦挣扎,因为 Apple [正在] 推出 64 位 Mac,并从 PowerPC 转移到 Intel,以及一堆这样的东西。他们使用的是手工制作的即时编译器,而我们能够使用 LLVM 来解决他们的一系列问题,例如启用新硬件这些不是 GCC 设计用来做的事情。”

“所以 [LLVM 的部分] 是随着 10.4 Tiger 版本 (2007)一起被提供,最初用于提高图形性能。这显示了一些价值并证明了一些投资是合理的。我找了另一个人一起工作,我们从那时开始做另一件小事,再做另一件小事,一次一小步,”Lattner 回忆道。

“它获得了动力,并最终开始替换 GCC 的部分内容。在此过程中的另一件事是,GPU 团队试图为通用 GPU 计算制作一种着色语言,[然后] 变成了我们现在所知的 OpenCL, 并成为 Clang 的第一个用户。”

其余的当然是非常丰富的 LLVM 社区开发和协作历史。

协作的风险和回报——“是时候离开了。”


毫不奇怪,建立一个商业竞争者在其中协作的开源开发社区具有挑战性。这不是 LLVM 独有的,但考虑到它的耐力和成长性,其他人可能会从中吸取教训。

Lattner 说:“看看 LLVM 社区,你有英特尔、AMD、苹果、谷歌和索尼以及所有这些正在合作的人。我们让 [它发挥作用] 的方式之一是受到卓越技术和共同价值观的推动,以及对成功的共同理解。”

“作为一个社区,我们总是通过工程师对工程师来解决问题。例如,对我来说,当我在 Apple 或任何附属机构时,在与社区合作时我会戴上我的 LLVM 帽子,但我会戴上我的 Apple 帽子来解决未发货硬件的内部问题。我们决定我们许多人所戴的公司帽子不会成为 LLVM 社区的一部分。这不是要提出一个话题,比如我现在需要安装这个补丁才能发布,”他说。

Lattner 说,通过吸引志同道合的合作者,共同理解有助于为 LLVM 社区的发展提供信息。“我为这样一个事实感到自豪,我们有一些人在商业环境中相互对抗,但仍然可以工作并就在 GPU 或其他任何内核中建模的最佳方式达成一致。是,”他说。

事情并不总是那么顺利。

“多年来,我们不得不将人们逐出社区,这种情况并不常见。当我们认为他们不符合价值体系 [或] 他们不愿意与人合作或者他们不符合社区的发展方向时,这是个必然选择,这也非常困难,因为他们中的一些人是多产的贡献者,而且确实很痛苦,但保持社区凝聚力 [和] 价值体系非常重要,”Lattner 说。

LLVM Warts & Redo – 从头开始是个好主意吗?


“我是 LLVM 最大的批评者,因为我知道所有的问题,”Lattner 半开玩笑地说,并指出 LLVM 现在已经 20 多年了。“LLVM 绝对是一件好事,但无论如何它都不是一件完美的事情。我真的很高兴多年来我们能够在 LLVM 上不断升级、迭代和改进。但是现在到了关键点,某些更改是架构上的,并且很难进行。

“其中一个例子是 LLVM 编译器本身不是内部多线程的。我知道你怎么看,但我认为多核不再是未来。还有一些设计决定,我不打算详细讨论,令人遗憾。其中许多,只有像我这样的书呆子才关心,他们不是社区面临的战略问题,但其他人确实是,”Lattner 说。

“[其中] LLVM 在循环转换、HPC 风格的转换、自动并行化、OpenMP 支持方面从未非常出色。LLVM 有效并且非常有用,但它可能会好得多。这些 [弱点] 都可以追溯到 LLVM 中的设计决策,其中 LLVM 的世界观实际上是一种带有向量的 C 世界观。原始设计前提阻碍了某些类型的进化,”他说。

现在,Lattner 指出,LLVM 项目总体上有许多子项目,包括 MLIR 和其他正在打破这些障碍并解决其中一些问题的项目。“但通常,当人们询问 LLVM 时,他们会想到 Clang 和标准 C/C++ pipeline,但它并没有完全采用该领域的所有新技术,”Lattner 说。

当问自到拉特纳会建议何时重新开始时。

他回应道:“是的,我做到了。那就是MLIR(multi-level intermediate representation)。当您以并非真正设计使用的方式使用 LLVM 时,它会很慢。例如, Rust 社区以突破 LLVM 性能的界限而闻名,因为他们的编译模型实例化了成吨的东西。这给编译器带来了巨大的压力和负担,例如 C 或更简单的低级语言所没有的。它在 Rust 社区中带来了令人惊奇的事情,但它要求编译器完成这个编程模型中隐含的所有这些工作,”他说。

“从头开始,您必须决定要解决哪些问题。我有兴趣用 LLVM 修复的问题归结为它不能很好地模拟更高级别的抽象,例如循环和诸如此类的事情。我认为任何个人传球的恒定时间表现通常都可以。我在 LLVM 中看到的另一个挑战是它是一组复杂的技术,因此除非您了解所有不同的部分,否则它是一个难以使用的工具。有时,人们会写很多不应该运行的通行证。所以,我并不认为 LLVM 是完美的答案。”

让 LLVM 变得更好——在谷歌时,Lattner 解决了 MLIR


MILR 是 LLVM 中的一个子项目,旨在帮助其提供更现代的功能。Lattner 从 Apple 转到 Google,在那里他从事 MLIR 的工作。

“我将从问题陈述开始 [which] 回到之前关于 LLVM 有什么问题的问题?因此,LLVM 对解决设计空间的 C 与向量部分感兴趣,但设计空间中还有许多其他有趣的部分,其中 LLVM 可能在一些小方面有所帮助,但并没有真正帮助解决固有问题。如果您谈论将计算分配到集群,LLVM 不会做任何事情。如果您谈论机器学习,并且我有表示为张量的并行工作负载,那么 LLVM 无济于事。如果你看看其他领域,例如硬件设计,LLVM 有一些你可以使用的功能 [但] 真的不是很好,”Lattner 说。

“另一个背景是谷歌和 TensorFlow 团队。【虽然】 TensorFlow 本身并没有被广泛认为是这样的,它确实是一套编译器技术。它有 TensorFlow 图。它有这个带有 HLO 图的 XLA 编译器框架。它可以为 CPU 和 GPU 生成代码。它还有许多其他技术组件,例如 TensorFlow Lite,这是一个完全独立的机器学习框架,带有来回转换器,”他说。

Lattner 说,但实际情况是TensorFlow 拥有如此庞大的基础设施,一个包含“七到八个不同 IR”的生态系统。“没有人像编译器 IR 那样构建它们。人们将 TensorFlow 图视为协议缓冲区,而不是 IR 表示。结果,周围的质量不是很好。没有什么是真正集成的。不同系统之间存在所有这些不同的技术孤岛。人们无法相互交谈,因为他们不明白他们都在空间的不同部分解决相同的问题,”Lattner 回忆道。

Lattner 说,MLIR 源于这样一种想法——如何整合这些完全不同的世界,在这些世界中,你正在开发一个巨大的多节点机器学习加速器,比如 GPU,而我正在开发一个 Arm TensorFlow轻量级移动部署场景。它们之间没有共同点。”

Lattner 说:“构建编译器有一个困难的部分,这与域无关。如果你看看像 LLVM 这样的编译器,它是 LLVM 的重要组成部分,所有这些基础设施都用于测试、调试信息、遍历图、构建控制流图、定义调用图或分析传递管理器——无论您是构建 CPU JIT 编译器还是构建 TensorFlow 图形样式表示,所有此类内容都很常见。编译器基础架构上的表示对于您的目标域是不变的。”

MLIR 演变成“正在采用编译器基础架构的概念,并将领域从其中移除。

MLIR 是一个独立于领域的编译器基础设施,允许您在顶部构建特定于领域的垂直领域。它提供了定义你的 IR、你的表示的能力,比如你的加、减、乘、除、存储。你有哪些核心抽象?例如,在软件中,您拥有功能。在硬件方面,您有 Verilog 模块。MILR 可以做到这两点,”他说。

“开箱即用地构建所有这些有用的功能,让 Google 实验室的我们可以说,“我们有七种不同的编译器,让我们开始在底部统一它们并将它们拉到相同的技术堆栈中。我们可以开始共享代码,并打破这些障碍。” 此外,因为你有一个东西,而且它已经被很多人使用,你可以投资让它变得非常非常好。像这样投资基础设施是你经常没有机会做的事情。”

Lattner 表示,他不仅很高兴看到 MLIR 被整个行业采用,特别是在机器学习类应用中,而且在量子计算等新领域也被采用。“在 SiFive,我们将它用于硬件设计和芯片设计类型的问题——任何地方都可以从编译器能够表示设计中受益,”他说。
原文链接:
https://www.hpcwire.com/2021/12/27/lessons-from-llvm-an-sc21-fireside-chat-with-chris-lattner/

*免责声明:本文由作者原创。文章内容系作者个人观点,半导体行业观察转载仅为了传达一种不同的观点,不代表半导体行业观察对该观点赞同或支持,如果有任何异议,欢迎联系半导体行业观察。


今天是《半导体行业观察》为您分享的第2902内容,欢迎关注。

推荐阅读


国内超低功耗MCU赛道迎“黄金时代”,中科芯蕊在行动

台积电的第三代半导体布局

下一代EUV光刻机即将爆发


半导体行业观察

半导体第一垂直媒体

实时 专业 原创 深度


识别二维码 ,回复下方关键词,阅读更多

晶圆|集成电路|设备 |汽车芯片|存储|台积电|AI|封装

回复 投稿 ,看《如何成为“半导体行业观察”的一员 》

回复 搜索 ,还能轻松找到其他你感兴趣的文章!

责任编辑:Sophie

相关文章

半导体行业观察
摩尔芯闻

热门评论