
摩尔定律需要一个拥抱,当小型硅计算机芯片上填充晶体管的日子屈指可数的时候,硬件加速器出现了。
在对加速器进行编程时,应用程序将某些任务卸载到系统硬件上以加速该任务的过程,这时必须构建一个全新的软件支持。硬件加速器运行某些任务的速度比CPU快几个数量级,但它们不能开箱即用。软件需要有效地使用加速器的指令,使其与整个应用系统兼容。这转化为大量的工程工作,然后必须维护这些以各种编程语言编译的工作,让代码在新芯片运行。
现在,来自麻省理工学院计算机科学和AI实验室(CSAIL)的科学家创造了一种新的编程语言,称为“Exo”,用于在硬件加速器上编写高性能代码。Exo帮助低级性能工程师将他们指定想要计算的非常简单的程序转换为非常复杂的程序,这些程序执行与规范相同的事情,但使用这些特殊的加速器芯片后,速度要快得多。例如,工程师可以使用Exo将简单的矩阵乘法变成更复杂的程序,通过使用这些特殊的加速器,程序的运行速度可以快几个数量级。
与其他编程语言和编译器不同,Exo是围绕一个叫做“Exocompilation”的概念构建的。“传统上,很多研究都集中在特定硬件的自动化优化过程上,”Yuka Ikarashi说,他是电子工程和计算机科学的博士生,也是CSAIL附属公司的一篇关于Exo的新论文的第一作者。“这对于大多数程序员来说很好,但是对于性能工程师来说,编译器在提供帮助的同时也经常成为障碍。因为编译器的优化是自动的,出错时效率可能是45%而不是90%,却没有好的方法来修复它。”

有了Exocompilation,性能工程师可选择哪些优化、何时应用以及以何种顺序,这些都由编译器负责,返回给性能工程师的是最终结果。这样,他们就不必浪费时间,Exo负责确保所有这些优化都是正确的。因此,性能工程师可以把时间花在提高性能上,而不是调试复杂的优化代码。
“Exo语言是一种编译器,它在目标硬件上进行参数化;康奈尔大学(Cornell University)计算机科学系助理教授Adrian Sampson说,“同一个编译器可以适应许多不同的硬件加速器。“Exo不是编写一堆杂乱的C++代码来编译一个新的加速器,而是给你一个抽象、统一的方法来写下你想要的硬件的‘形状’。然后,您可以重用现有的Exo编译器来适应新的描述,而不是从头开始编写全新的东西。这类工作的潜在影响是巨大的。如果硬件创新者可以不再担心为每一个新的硬件想法开发新编译器的成本,他们就可以尝试和发布更多的想法。该行业可以打破对传统硬件的依赖,传统硬件的成功仅仅是因为生态系统的锁定,尽管其效率低下。”
今天制造的最高性能计算机芯片,如谷歌的TPU、苹果的神经引擎(Neural Engine)或英伟达的张量核心(Tensor Cores),通过加速所谓的“关键子程序”、内核或高性能计算(HPC)子程序来推动科学计算和机器学习应用。
这些程序是必不可少的。例如,基本线性代数子程序(BLAS)是这种子程序的“库”或集合,它们专用于线性代数计算,并实现许多机器学习任务,如神经网络、天气预报、云计算和药物发现。BLAS如此重要,以至于它为Jack Dongarra赢得了2021年的图灵奖(Turing Award)。然而,这些新芯片需要数百名工程师来设计,也只能达到HPC软件库允许的水平。
目前,这种性能优化仍然是手工完成的,以确保这些芯片上的每一个终级计算周期都得到利用。HPC子例程通常以超过90%的峰值理论效率运行,硬件工程师竭尽全力为这些理论峰值再增加5%或10%的速度。因此,如果没有积极地优化软件,所有的努力都白费了——这正是Exo的价值。
Exocompilation的另一个关键部分是,性能工程师可以描述他们想要优化的新芯片,而不必修改编译器。传统上,硬件接口的定义由编译器开发人员维护,但对于大多数新的加速器芯片,硬件接口是专有的。公司必须维护他们自己的整个传统编译器的副本(分支),修改以支持他们特定的芯片。除了性能工程师之外,这需要雇佣编译器开发团队。
“在Exo中,我们将特定于硬件的后端定义从Exo编译器中具体化。这使我们能够更好地区分Exo(一个开源项目)和特定于硬件的代码(通常是专有的)。我们已经展示了可以使用Exo快速编写与英特尔手工优化的数学内核库一样高性能的代码。加州大学伯克利分校(University of California at Berkeley)的博士后Gilbert Bernstein说:“我们正在与几家公司的工程师和研究人员积极合作。”
Exo的未来需要探索一种更高效的调度元语言,并扩展其语义以支持并行编程模型,从而将其应用于更多的加速器,包括GPU。
参考链接:
https://news.mit.edu/2022/programming-language-hardware-accelerators-0711