其他
作者简介:赵捷(清华大学工学学士,法国巴黎高等师范学校工学博士),长期从事编译器高级优化和代码生成方面的研究,目前主要从事深度学习编译器的研究。李宝亮(清华大学获工学学士,国防科学技术大学工学博士),长期从事体系结构性能分析优化方面的研究,目前主要从事深度学习专用加速芯片的研制和相关系统软件和编程语言的开发。随着人工智能、大数据和云计算的飞速发展,基于领域特定体系结构(DSA)的芯片[1-5]设计受到越来越多的关注。然而,领域特定体系结构在微架构和编程模型等方面也与通用CPU和GPU存在巨大差异[6-8],为了充分发挥DSA的性能优势并提高编程灵活性,编译器需要弥合上层编程模型与底层硬件结构的巨大鸿沟,在充分发挥硬件性能的前提下尽可能降低软件的编程难度。系统性能优化涵盖的优化内容纷繁复杂,在各种层级上都可以实现面向不同粒度、不同目标的优化。具体到面向深度学习的编译优化,通过这几年的不断努力尝试[9-14],业界逐渐形成了面向深度学习领域的计算图优化方法和面向通用计算领域的经典编译优化方法相结合的方式实现深度学习应用的端到端优化体系。首先,将深度学习应用转换为计算图描述、在计算图上实现硬件结构无关的图层编译优化[15-21],然后再将计算图的子图下降到以循环为核心的计算描述,并实现硬件相关的循环编译优化[12,14]的编译流程。在硬件相关的循环优化阶段,编译器所做的工作也可以划分为两部分,高层循环优化负责实现包括芯片和体系结构领域相关从业人员相对熟悉的tiling(循环分块)、fusion(循环合并)等循环变换,而底层循环优化主要在循环内部实现比较成熟的寄存器分配、指令流水等优化。在这篇文章中,我们主要讨论高层循环优化。如何借助编译优化理论和方法,将计算图描述的深度学习算法部署在具体硬件上并让算法高效运行,是学术界和工业界一个重要的研究课题。更多深度芯片编译技术内容在清华大学出版社新书《多面体编译理论与深度学习实践》中,现有5折预售优惠。(5折活动持续到2022年12月20日)在整个过程中,循环优化起到至关重要的作用,因为整个深度学习算法的核心任务都是在循环中完成的。循环优化涉及依赖分析、循环变换、指令调度、存储管理和代码生成等内容,是一个非常复杂的步骤。近些年深度学习算法上编译技术的革新,涌现出了以循环分块为核心[22,23]、以循环合并为优化重点[12,14,25,26]的编译框架,但是高层循环优化所涵盖的内容却不仅仅是只有分块和合并这两种变换。在把一个用计算图描述的算法通过分析和优化转换成目标平台上能够运行的源程序或可执行代码之前,高层循环编译优化至少要经过如下图所示的十个步骤。①