0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

领域编译器发展的前世今生

sakobpqhz 来源:StarryHeavensAbove 2023-02-03 10:37 次阅读

本文分为两个部分,第一部分为综述,第二部分重点讨论AI编译技术。

近年来,随着GPU和DSA架构在不同领域的广泛应用,特别是AI系统相关技术的飞速发展,对于编译器的需求越来越强烈。编译器已经从一个相对小众的研究领域,变为学界和业界都高度关注并大量投入的方向。与此同时,编译器的开发人员也从芯片研发团队开始延伸到更上层的软件层面。在很多领域的软件系统中,都开始引入编译技术来实现提升开发效率或运行效率等目标。本文从领域编译器的角色着眼,来讨论领域编译器发展的前世今生。

通用编译器 vs. 领域编译器

编译器作为芯片配套的重要基础软件,它向上封装高级语言从而提高应用软件的开发效率和兼容性,向下适应体系结构而生成高效的可执行代码,是沟通软硬件之间的桥梁。一方面,通用编译器负责将某种编程语言映射到某种特定的芯片,例如Intel平台的C语言编译器负责将C语言的程序映射为Intel的X86指令集。通用编译器在设计编译优化时,会将通用性作为最重要的出发点之一。为了更便捷高效的支持更多语言(前端)以及更多目标芯片(后端),GCC、LLVM等框架逐渐成为重要的编译基础设施,它们都集成了非常多的通用编译优化组件,如循环优化、指令级优化、存储层次优化等。另一方面,领域编译器面向某些特定的领域应用程序而设计,旨在大幅提升该领域研发人员的编程效率或程序的运行性能。因此领域编译器在设计编译优化时,会将该领域的应用特征进行一定的总结抽象,形成领域特定的一些计算模式,并根据这些模式来设计针对性的优化,例如面向Stencil计算特征的优化等。

结合领域编程语言的领域编译器

早期的领域编译技术伴随领域编程语言(DSL)开始发展,作为解决通用编译技术难以在特定领域生成高性能代码的解决方案出现。DSL会针对领域的特征设计易于描述领域问题的编程语言(创建新语言或从现有语言扩展),通常使用专用的IR中间表示(一层或多层)来对领域知识进行表示,这些领域知识的引入可以极大的方便编译器的分析和优化。领域编程语言的提出有两个目标:一是为了大大的简化领域开发用户的编程复杂性,这方面的代表性语言是数据库查询语言SQL[1],它通过对数据库常用操作进行抽象为用户提供了非常便捷的编程接口,然后利用编译器将其映射到底层数据库引擎所提供的操作接口;二是为了大幅提升领域应用的运行性能,这方面的代表性语言是Halide[2],它为图像处理领域提供了一种抽象层面的编程语言,基于这一语言编译器以调度的形式来抽象底层优化,从而避免了传统编译器中为了通用程序的正确性而引入的复杂的分析机制,使其可以非常便捷的在调度空间中通过搜索从而得到一个性能很高的目标代码。

领域编译器相比较于通用编译器,它仍然是一个解析高级语言,生成中间表示并优化,最后代码生成的系统。它在设计上会有更多的选择理念,除去领域无关的通用优化外,它还需要增加领域知识的专用表示,面向领域特定特征的专门优化等等。在系统实现上,有的是将领域编译实现在通用编译器中,有的是在通用编译器的前端增加一个高层次的领域编译器。前者以LLDB[3]为例,LLDB是clang/llvm架构的调试器,使用类似GDB的调试语句来调试程序运行,调试的需求主要在动态调控程序运行,获得调试信息,而这些都是通用clang/llvm架构中包含的,因而LLDB的实现上套用了clang/llvm的基础设施。像LLDB这样能够紧密结合在通用编译器基础设施的领域编译器还是比较少的,更多的DSL编译器的做法则是采用了将高层次的领域编译器作为前端插在通用编译器,如LLVM之前。DSL程序通过领域编译器的前端将DSL做词法语法解析生成高层次IR(一层或多层),该IR包含领域知识的数据结构,在高层IR上可以做专用的领域知识优化,也可以做通用的编译优化,然后生成通用编程语言的输出,如C/CUDA/OpenCL/ LLVM IR等。之后交由通用编译器完成汇编生成,链接最终生成可执行程序。这一设计不需要关注编译的后端部分,因而可以把重点放在利用领域专有知识对程序的优化上,通用优化则可以交给通用编译器来完成。

在过去几十年中,很多领域都提出了代表性的领域编程语言及编译器,这里我们对几个代表性的工作进行简单的介绍。

01面向图像处理领域的Halide

Halide是MIT计算机科学和人工智能实验室的研究人员开发的一门新的编程语言,旨在改变图像处理领域编程的现状。Halide语言将算法描述与算法中数据存储与计算执行等调度方面的内容解耦合。从而算法的描述和性能的优化可以分开进行,可以在不改动算法的情况下对算法进行调优。它将代码分为Algorithm和Schedule两个部分,Algorithm部分仅仅描述算法的功能,不进行实际的实现;Schedule部分指定算法在何时何处进行计算。使得比起用传统语言编写的代码,用Halide编写的程序不仅更容易阅读、编写和修改,而且 Halide能够自动优化代码,而人工对代码进行优化加速,这个过程需要花费数小时来完成。针对几种常用的图像处理算法,将Halide的版本与人工优化的版本进行比较,在不同平台上的运行结果如图所示。可见,在前3个算法中Halide版本的算法不仅简化了代码量,同时性能有着极大的提升。

02面向Stencil计算的领域编程语言

Stencil计算是数值模拟程序中常见的循环运算模式,其特点是遍历计算区域,每个位置均执行相同的计算操作指令模板(stencil),所以将这种计算称作stencil计算。stencil计算大量出现在科学计算领域,并且通常负载延时敏感应用。因而使用者通常希望将其卸载到高性能设备如GPU上,以提升端到端性能,但在GPU上,片外内存访问和GPU计算单元的调度是不同于CPU的,这是编译stencil计算程序到GPU执行不可忽略的问题。俄亥俄州大的团队设计了一款面向stencil计算的DSL[5],用户只需要简单的高层stencil操作描述,通过DSL编译器分析stencil操作类型,访存模式,根据GPU编程模型,自动生成tile size,shared memory优化,block间同步等优化。这些优化减少了访存带宽瓶颈,增加了处理单元utility,最终生成了在GPU上运行性能更高的stencil程序。

d4c10332-a356-11ed-bfe3-dac502259ad0.jpg

Stencil计算常见模板[6]

03面向矩阵计算的领域编程语言HTA

Tiling算法是挖掘并行性,优化数据局部性重要的方法。HTA(HierarchicallyTiled Arrays)[7]是一个在现代OOP语言上扩展的面向数组tiling描述的数据结构。通过HTA,许多科学计算算法,如LU分解,分块矩阵计算,stencil计算等,都容易通过tile来表示,而HTA的数据布局,tile管理都可以自动进行,而无需涉及到最底层每个元素的计算,从而大大减少了下标计算的描述,简化了函数接口,极大地降低了描述并行程序的复杂性,同时仍然达到了库级别的高性能。HTA还引入了dynamic partitioning和overlapped tiling的语言特性,进一步增强了tiling描述的灵活性和普适性。

d4d83642-a356-11ed-bfe3-dac502259ad0.png

HTA的tiling描述[8]

04面向图计算的领域编程语言GraphIt

GraphIt [9]是一种用于图计算的新 DSL,它可以为在具有不同大小和结构的图上运行的具有不同性能特征的算法生成快速实现。GraphIt 将计算的内容(算法)与计算的方式(调度)分开。程序员使用算法语言指定算法,而性能优化使用单独的调度语言指定。调度语言使程序员能够通过将大量边遍历和顶点数据布局优化组合在一起,轻松地搜索这个复杂的权衡空间。GraphIt 的性能比当时最先进的共享内存框架(包括Ligra、Green-Marl、GraphMat、Galois、Gemini 和 Grazelle)快最多4.8 倍,同时代码行数最多减少了一个数量级。

d4e40530-a356-11ed-bfe3-dac502259ad0.png

Graphlt与多种框架的图计算性能比较[10]

05面向张量的领域编译器TACO

张量代数编译器 (Tensor Algebra COmpiler:TACO)[11] 是一个用于计算稀疏和密集张量上的张量代数表达式的代码生成工具,特别针对稀疏张量做了大量优化。TACO通过简单的format描述做稀疏张量存储的自动生成,通过迭代图中间表示描述复合张量表达式中稀疏操作数的多级索引数据结构,通过用户指定循环生成的代码可以直接做并行化,并且支持自动算子融合。TACO在广泛使用的稀疏张量代数和稀疏线性代数库中获得与手动优化内核相当的性能。

d4f298f2-a356-11ed-bfe3-dac502259ad0.png

TACO的张量向量乘法示例与生成的C代码[12]

06面向AI领域的编译技术

随着人工智能时代的来临,AI领域应用的大量出现也促进着领域编译的发展,最突出的表现就是多种AI编译器的普及和应用。AI领域有几个重要的特征使得AI编译器面临很多新的机遇和挑战:一是AI领域中编程框架对计算图与算子分离的设计机制为编译优化提供了更多的机会和更广阔的空间;二是AI领域中对张量的抽象为编译优化提供了具有鲜明领域特征的语义信息;三是以Python为主的动态解释器语言前端为其与AI编译器的衔接带了挑战;四是面向AI的领域专用架构为应用的可移植性带来了挑战。在这些因素的驱动下,近年来学术界和工业界在AI编译方面提出了一系列创新性的方法,也为编译这一基础学科的发展注入了新的活力。

本文下一篇将重点介绍面向AI领域的编译技术。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • gpu
    gpu
    +关注

    关注

    27

    文章

    4418

    浏览量

    126705
  • 计算机
    +关注

    关注

    19

    文章

    6651

    浏览量

    84534
  • AI
    AI
    +关注

    关注

    87

    文章

    26450

    浏览量

    264063
  • 编程语言
    +关注

    关注

    9

    文章

    1878

    浏览量

    33129
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48617

原文标题:领域编译器发展的前世今生 • 综述

文章出处:【微信号:算力基建,微信公众号:算力基建】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    蓝牙技术的前世今生

    蓝牙是一种支持设备短距离通信的低功耗、低成本无线电技术。它利用短程无线链路取代专用电缆,便于人们在室内或户外流动操作。那么这种技术为什么叫蓝牙?又历经了怎样的发展?本文将带你了解蓝牙技术的前世今生
    的头像 发表于 05-09 09:46 1721次阅读
    蓝牙技术的<b class='flag-5'>前世</b><b class='flag-5'>今生</b>

    关于芯片行业的前世今生

    `1、芯片行业的前世今生芯片是一种微型电子器件或部件。采用一定的工艺,把一个电路中所需的晶体管、电阻、电容和电感等元件及布线互连,制作在一小块或几小块半导体晶片或介质基片上,然后封装在一个管壳内
    发表于 04-30 16:20

    芯片开源架构RISC-V的前世今生

    芯片春秋 开源架构RISC-V前世今生
    发表于 05-21 10:04

    芯片春秋——ARM前世今生

    芯片春秋 ARM前世今生
    发表于 05-25 15:05

    嵌入式ARM开发的前世今生,看完你就懂了

    嵌入式ARM的开发方向是什么?嵌入式ARM开发的前世今生
    发表于 04-20 06:39

    关于汽车操作系统的前世今生看完你就懂了

    关于汽车操作系统的前世今生看完你就懂了
    发表于 09-26 06:40

    汽车总线前世今生

    汽车总线前世今生
    发表于 01-24 15:41 24次下载

    编译器是如何工作的_编译器的工作过程详解

    随着计算机的发展编译器已经发挥着十分重要的作用。本文主要介绍了编译器的种类、编译器的工作原理以及编译器工作的具体操作过程及步骤详解。
    发表于 12-19 12:54 1.5w次阅读

    聊聊MSP和CMP的前世今生

    聊聊MSP和CMP的前世今生 伴随着云的普及,云的生态角色变得越来越细分,比如MSP和CMP,受到了越来越多企业客户的青睐,玩家也不断增加,越来越多的公司致力于在这些领域创新发展。 在
    发表于 12-30 20:45 1210次阅读

    既然C编译器是C语言写,那么第一个C编译器是怎样来的?

    既然C编译器是C语言写的,那第一个C编译器是怎样来的?
    的头像 发表于 02-25 15:47 2802次阅读

    高压电源创新:前世今生

    高压电源创新:前世今生
    发表于 11-03 08:04 1次下载
    高压电源创新:<b class='flag-5'>前世</b><b class='flag-5'>今生</b>

    电池管理技术的前世今生

    电池管理技术的前世今生
    发表于 11-04 09:51 5次下载
    电池管理技术的<b class='flag-5'>前世</b><b class='flag-5'>今生</b>

    NLP入门之Bert的前世今生

    对于每个词只能有一个固定的向量表示,今天我们来介绍一个给NLP领域带来革新的预训练语言大模型Bert,对比word2vec和Glove词向量模型,Bert是一个动态的词向量语言模型,接下来将带领大家一起来聊聊Bert的前世今生
    发表于 02-22 10:29 656次阅读
    NLP入门之Bert的<b class='flag-5'>前世</b><b class='flag-5'>今生</b>

    带你探索吹风筒的前世今生【其利天下高速风筒方案开发】 

    电吹风作为如今生活中不可或缺的小家电之一,这个看似简单的设备,已经走过了漫长的发展历程,从它的前世今生,经历了许多变革和创新,本文将带您穿越时间,探索其
    的头像 发表于 11-02 16:15 914次阅读
    带你探索吹风筒的<b class='flag-5'>前世</b><b class='flag-5'>今生</b>【其利天下高速风筒方案开发】 

    二极管的前世今生

    二极管的前世今生
    的头像 发表于 12-14 18:35 582次阅读
    二极管的<b class='flag-5'>前世</b><b class='flag-5'>今生</b>