深度学习AI编译器-LLVM简介

这篇具有很好参考价值的文章主要介绍了深度学习AI编译器-LLVM简介。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、什么是LLVM

LLVM的命名最早来源于底层语言虚拟机(Low Level Virtual Machine)的缩写。它是一个用于建立编译器的基础框架,以C++编写。创建此工程的目的是对于任意的编程语言,利用该基础框架,构建一个包括编译时、链接时、执行时等的语言执行器。目前官方的LLVM只支持处理C/C++,Objective-C三种语言,当然也有一些非官方的扩展,使其支持ActionScript、Ada、D语言、Fortran、GLSL、Haskell、Java bytecode、Objective-C、Python、Ruby、Rust、Scala以及C#。

LLVM是一个编译器框架。LLVM作为编译器框架,是需要各种功能模块支撑起来的,你可以将clang和lld都看做是LLVM的组成部分,框架的意思是,你可以基于LLVM提供的功能开发自己的模块,并集成在LLVM系统上,增加它的功能,或者就单纯自己开发软件工具,而利用LLVM来支撑底层实现。LLVM由一些库和工具组成,正因为它的这种设计思想,使它可以很容易和IDE集成(因为IDE软件可以直接调用库来实现一些如静态检查这些功能),也很容易构建生成各种功能的工具(因为新的工具只需要调用需要的库就行)。深度学习AI编译器-LLVM简介
常见的结构如下图
深度学习AI编译器-LLVM简介

主要由三个部分组成。

前端:将高级语言例如C或者其他语言转换成LLVM定义的中间表达方式 LLVM IR。例如非常有名的clang, 就是一个转换C/C++的前端。

中端:中端主要是对LLVM IR本身进行一下优化,输入是LLVM, 输出还是LLVM, 主要是消除无用代码等工作,一般来讲这个部分是不需要动的,可以不管他。

后端:后端输入是LLVM IR, 输出是我们的机器码。我们通常说的编译器应该主要是指这个部分。大部分优化都从这个地方实现。

至此,LLVM架构的模块化应该说的比较清楚了。很大的一个特点是隔离了前后端。

如果你想支持一个新语言,就重新实现一个前端,例如华为“仓颉”就有自己的前端来替换clang。

如果你想支持一个新硬件,那你就重行实现一个后端,让它可以正确的把LLVM IR映射到自己的芯片。

前端

深度学习AI编译器-LLVM简介

经过词法分析、语法分析、语义分析、LLVM IR生产,最终将C++转化成后端认可的LLVM IR。

词法分析:将编程语言取出一个个词,遇到不认识的字符就报错。例如将a=b+c 拆成a,= ,b ,+, c

语法分析:将语法提取出来,例如你写了个a+b=c, 明显不符合语法,直接报错

语义分析:分析一下你写的代码实际含义是不是对,例如a=b+c, a,b,c有没有定义,类型是不是对的

LLVM IR生产:经过上述三步,将你写的代码转化成树状描述(抽象语法树),然后再转化成IR定义的IR即可。

举个直观的栗子,你写的C++

// add.cpp
int add(int a, int b) {
return a + b;
}

生产的LLVM IR

(这个地方你不需要看懂每个细节,知道大概想类汇编的语言就行了, 专业的形式叫SSA, Static Single Assignment (SSA)

; ModuleID = 'add.cpp'
source_filename = "add.cpp"
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.15.0"


; Function Attrs: noinline nounwind optnone ssp uwtable
define i32 @_Z3addii(i32, i32) #0 {
%3 = alloca i32, align 4
%4 = alloca i32, align 4
store i32 %0, i32* %3, align 4
store i32 %1, i32* %4, align 4
%5 = load i32, i32* %3, align 4
%6 = load i32, i32* %4, align 4
%7 = add nsw i32 %5, %6
ret i32 %7
}

后端

后端把你的LLVM转换成真正的汇编(或者机器码)。主要的流程如下。这个我们要重点讲讲,因为后续我们就是要实现一个这个东西支持一个新的芯片。
深度学习AI编译器-LLVM简介

DAG Lowering

这个主要负责将你的LLVM IR转换为有向无环图,便于后续利用图算法优化。

例如将下面的LLVM IR 转换成图,每个节点是一个指令。

深度学习AI编译器-LLVM简介
深度学习AI编译器-LLVM简介

DAG Legalization

DAG图合法化,3.1中的DAG图都是LLVM IR指令,但实际上LLVM IR指令不可能被芯片全部支持,这个步骤就是替换这些不合法的指令。

Instruction Selection

这个步骤其实和3.2算是一起的功能,都是为了将LLVM IR转换成机器支持的Machine DAG.
深度学习AI编译器-LLVM简介

如上图,将store换成机器仍可的st, 将16位的寄存器转向32位。一切向机器指令靠拢。

Scheduling

这个步骤主要是调整指令顺序的,从有向无环图再展开成顺序的指令。

例如把下面的指令调成这样的。

深度学习AI编译器-LLVM简介

把%C的store提前一些,因为下一条ld要用C啦。

SSA-based Machine Code Optimization

这一步骤主要是做一些公共表达式合并啊去除的操作。

Register Allocation

这一步就要分配寄存器了。在3.5之前我们认为寄存器其实是可以无限用的,但实际硬件的寄存器有限的。所以我们得考虑寄存器数量与寄存器值的生命周期,将虚拟的寄存器替换成实际的寄存器。这个一般会用到图着色等等算法,贼复杂,好在LLVM都实现好了,不用在重复造轮子。

例如一个芯片,有32个可用的寄存器,如果函数使用到了64个,多的就只能压如堆栈或者等着了。

具体怎么分配的,知乎有专家研究,见下面的文章。Frank Wang:LLVM寄存器分配(一)

Prologue/Epilogue Code Insertion

这个主要是加上函数调用前的指令和函数结束后的指令。主要是调用前把参数存下来,调用后把结果写到固定的寄存器里。

Peephole optimizations

这个步骤主要是对代码再最后抢救一番。比如把x*2换成x<1

再比如下面这样
深度学习AI编译器-LLVM简介

将两个32bit的存储换成一个64bit的存储

Code Emission

最后一步显然,将上述优化好的中间格式转换成我们真正需要的汇编,由汇编器翻译成机器码,大功告成。文章来源地址https://www.toymoban.com/news/detail-464000.html

到了这里,关于深度学习AI编译器-LLVM简介的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ARM 编译器 Arm Compiler for Embedded 6 相关工具链简介

    目录 1, Introduction to Arm® Compiler 6 1.1 armclang 1.2 armasm 1.3 armlink 1.4 armar 1.5 fromelf 1.6 Arm C++ libraries 1.7 Arm C libraries 1,8 Application development ,ARM程序开发流程 2,ARM 编译器 5和ARM 编译器 6的兼容性 3,ARM编译器相关链接 Arm Compiler 6 是 Arm 中用于 Arm Cortex® 和 Arm Neoverse™ 处理器的最先

    2023年04月12日
    浏览(45)
  • 【JavaScript】JavaScript 简介 ④ ( 解释型语言 和 编译型语言 | 计算机程序本质 | 编译器 和 解释器 )

    计算机 的 程序 是在 CPU 上执行的 , CPU 上执行的只有匹配该 CPU 的机器码指令 , 不同类型的 CPU 执行的 机器码指令 格式不同 , X86 和 ARM 执行的 机器码 指令格式是不同的 ; 机器码指令 是 二进制的 , 所有在 计算机 上执行的程序 , 都是 若干 二进制机器码 的集合 ; 计算机 只能执

    2024年03月22日
    浏览(47)
  • 初学Python,用什么编译器最好呢?

    新手学Python用什么编辑器比较好?工欲善其事必先利其器,选好工具学习更高效。市面上流行的编辑器众多,根据自己的需求选择适合自己。小白选择什么编译器比较好呢?今天主要介绍SublimeText、IDLE、VIM、PyCharm、Emacs编辑器,看它们都有什么功能,挑一个最适合小白学习的

    2024年02月09日
    浏览(48)
  • 即时编译器的去虚化是什么?

    本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和文献引用请见100个问题搞定Java虚拟机 对于需要动态绑定的虚方法调用来说,即时编译器则需要先对虚方法调用进行去虚化(

    2024年02月01日
    浏览(39)
  • AI编译器-图常见优化算法-算子融合

    算子融合(Operator Fusion)是深度学习编译器中的一种优化技术,它可以将多个算子合并为一个更大的算子,以减少计算和内存访问的开销。以下是一些常见的算子融合例子: 卷积和池化融合:将卷积层和池化层融合为一个算子,减少内存访问和计算的开销。 多个全连接层融

    2024年02月10日
    浏览(50)
  • 即时编译器对于字段读取及存储指令的优化是什么?

    本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见100个问题搞定Java虚拟机 即时编译器会优化实例字段以及静态字段访问,以减少总的内存访问数目。 具体来说,

    2023年04月08日
    浏览(73)
  • Microsoft的CL编译器与GCC到底有什么区别?

    gcc -v : gcc version 11.2.0 (MinGW-W64 x86_64-ucrt-posix-seh, built by Brecht Sanders) cl : 用于 x64 的 Microsoft (R) C/C++ 优化编译器 19.29.30136 版 CL作为微软的非开源编译器,听上去似乎比开源的GNU套件GCC编译器更“高级”,但事实真的如此吗? 咱们统一使用普遍的x64架构,看看两个编译器对同一段

    2024年02月05日
    浏览(44)
  • 在makefile中,CC(编译器)和LD(链接器)代表什么?

    这些变量的名称源自相应工具的名称。通常这些缩写的含义如下: CC 代表“ C c ompiler”(在GCC缩写中,它也被视为“ c ompiler c ollection”)。 LD 是一个链接器(来自“ l ink e d itor”或“ l oa d er”)。 CPP 代表 “ C p re p rocessor” CXX 是一个 C++ 编译器

    2024年02月15日
    浏览(51)
  • c编译器学习02:chibicc文档翻译

    先粗略地看一遍作者的书籍。 https://www.sigbus.info/compilerbook# “低レイヤを知りたい人のためのCコンパイラ作成入門” 为想了解底层的人准备的C编译器制作入门 Rui Ueyama ruiu@cs.stanford.edu 2020-03-16 https://www.sigbus.info/ 植山瑠偉 谷歌软件工程师 我的专业知识涵盖从 HTML/JavaScript 到硬

    2024年02月21日
    浏览(99)
  • 微软亚洲研究院推出AI编译器界“工业重金属四部曲”

    编者按:编译器在传统计算科学中一直是一个重要的研究课题。在人工智能技术快速发展和广泛应用的今天,人工智能模型需要部署在多样化的计算机硬件架构上。同时,训练和部署大型人工智能模型时又对硬件性能有着更高的要求,有时还需根据硬件定制化代码。这些都对

    2024年02月16日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包