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

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

3天内不再提示

Machine Outliner简介

冬至子 来源:毕昇编译 作者:王婉郦 2023-06-06 15:41 次阅读

嵌入式领域,代码体积(code size)优化能够减少内存的使用,对产品的竞争力至关重要。对当代产品而言, code size优化可以为产品放入更多特性,增强竞争力;对下一代产品而言,code size优化能够带来产品功耗和成本的竞争力提升。LLVM Machine Outliner是一种编译器优化技术,可以识别重复代码片段,将其提取出来并转换成一个独立的函数,从而降低程序code size。

示例

通过以下代码示例,描述是否开启Machine Outliner优化的效果:

int div(int x) {
    int a = x / 2;
    int b = x;
    return b / a;
}

int sub(int x) {
    int a = x / 2;
    int b = x;
    return b - a;
}

以上代码片段由div和sub两个函数组成,通过函数参数x,对变量a和b赋值,然后分别返回b和a相除,以及b和a相减的结果。其中,关于变量a、b赋值部分为重复代码片段。

是否开启Machine Outliner优化,在汇编层面的区别如下表所示:

image.png

如果不开启Machine Outliner优化,则会分别在标签div和sub下生成相关的重复汇编指令。开启Machine Outliner优化,则会将重复指令提取为单独的函数,并且在重复指令初始位置添加函数调用,从而降低程序code size。在编译阶段,可以通过使用 -mllvm -enable-machine-outliner=always 选项开启Machine Outliner优化,提取出的函数统一以“OUTLINED_FUNCTION_n”的形式命名。

后缀树

Machine Outliner优化依靠后缀树(Suffix Tree)的形式进行重复指令序列的识别,后缀树的构造和重复字符串查询操作均可在线性时间复杂度内完成,从而实现了Machine Outliner优化的效率提升。

后缀树是一种将字符串所有后缀存储在一棵树中的数据结构,目的是用来支持快速搜索和大量字符串匹配和查询,能高效解决很多关于字符串的问题[2]。字符串S对应的后缀树,也就是由该字符串所有后缀所共同构成的压缩字典树。

字典树(Trie)是一种树形数据结构,其中每条边用来表示一个字符,且每个节点出边对应的字符都不相同,将根节点到某一节点路径上所经过的字符拼接起来,即为该节点所表示的字符串。压缩字典树(Compressed Trie)由字典树演变而来,将字典树中的单节点链条压缩为一个节点,即将相邻的具有相同前缀的节点合并,可得到对应的压缩字典树。字符串“ABD$0”对应的字典树和压缩字典树如下所示:

image.png

后缀树的构建需要经过字符串后缀生成和压缩字典树构建两步:

  1. 生成字符串S的所有后缀,以“ABCAB$0”(“$0”是结束字符)为例,该字符串的所有后缀为:
    ABCAB$0
    BCAB$0
    CAB$0
    AB$0
    B$0
    $0
    
  2. 为以上所有后缀生成字典树,并且合并节点生成相应的压缩字典树:

image.png

令字符串S的长度为n,通过构建字符串S所对应的后缀树,即可在O(n)时间复杂度内,完成字符串重复次数,以及重复字符串长度的检索[3]。

重复次数搜索: 假设字符串T在字符串S中重复次数为m,则字符串S应有m个后缀以字符串T为前缀,即字符串T所对应节点的叶节点数量为其重复次数。

重复字符串长度搜索: 由于重复字符串出现次数大于1,所以字符串T在后缀树中一定以非叶节点的形式表示,字符串T的长度为该非叶节点到根节点所经过的字符总数。

编译器实现

LLVM对于Machine Outliner的实现在寄存器分配之后,主要集中在MachineOutliner.cpp中,基于机器指令表示(MIR)进行函数的分析和提取,以实现程序code size优化。

编译器侧的实现过程可划分为指令映射、后缀树构建和函数提取三个阶段:

  1. 将指令映射成特定的无符号数,并以指令-无符号数对的形式存储在Map中;
  2. 以无符号数组为输入构建指令序列对应的后缀树,并且找出所有长度大于2的重复指令序列;
  3. 遍历后缀树并进行收益计算,从而得到包含正收益序列的候选列表,对于具备收益的候选项进行函数外提。

指令映射

首先需要遍历源文件对应的所有指令,将所有合法指令映射为无符号数(InstrNumber),并以指令-无符号数对的形式存储在Map中,如果两条指令的操作码和操作数均相同,则认为两条指令相同。对于所访问的每条指令,首先应该在Map中查询是否已经存储了相同的指令,如果是,则返回对应的InstrNumber;否则,将该指令插入到Map中,InstrNumber自加。

至此,所有指令均以无符号数的形式进行唯一标识,以作为构建后缀树的输入。而对于读写栈指针、PC相关,以及其他与call、ret指令有数据依赖的指令,将被判定为非法指令,为保证程序运行的正确性,这些指令不参与上述映射过程。

image.png

后缀树构建

假定将无符号数以字符形式表示,以指令映射输出的无符号数组为输入,通过添加终结符和构建后缀树,即可在线性时间复杂度内,完成字符串S的所有重复子字符串长度、重复次数和起始下标的计算,这些重复字符串将以候选列表的形式输出。

  1. 以第2节所示汇编指令为例,经过指令映射和添加终结符后可得到字符串S: ABCDEFG$0ABCDEH$1,其中添加终结符可避免跨函数指令序列提取。

image.png

  1. 以字符串S为输入,构建后缀树:

image.png

令ABCDE所指向的节点为P,单个字符所表示的距离为1,则节点P到根节点的距离为5,大于其他非叶节点到根节点的距离,因此ABCDE为字符串S中的最长重复子字符串T。节点P有两个子节点,因此字符串T的重复次数为2,且T在S中的起始下标分别为[0,4],[8,12]。

函数提取

完成后缀树构建和重复字符串解析后,还需要对提取该重复字符串对应的指令序列进行code size收益计算,计算公式如下:

codesize_benefit = codesize_before - codesize_after
codesize_before = 指令序列重复次数 * 指令序列codesize
codesize_after = 插入call指令的codesize + 指令序列codesize + 插入ret指令的codesize

如果收益大于1,则提取同一重复字符串对应的所有指令序列,以构造outline函数,并在函数末尾额外添加ret指令。而对于重复字符串指向的下标位置,需要删除初始指令序列,并且通过call指令增加对outline函数的调用。

image.png

总结

本文对Machine Outliner的基本概念和实现方法进行了简单介绍,通过将所有指令映射成为无符号数,并且以后缀树的形式对重复指令序列进行高效识别,最后提取具有正收益的指令序列作为outline函数,实现程序code size优化,从而提高代码的可读性并且减少程序的内存占用。

在源码中大量使用宏、模板,以及循环展开的场景下,开启Machine Outliner优化将会获得明显的code size收益;而对于程序本身code size很小、结构化设计良好,或者包含大量违反外提约束的情况,Machine Outliner对code size的优化效果不显著。此外,在LLVM14及更高版本上,完成了多次outline的实现,相比于本文所述的单次outline,能够进一步实现code size提升。

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

    关注

    1

    文章

    1577

    浏览量

    48614
  • 嵌入式系统中

    关注

    0

    文章

    2

    浏览量

    5683
  • DIV
    DIV
    +关注

    关注

    0

    文章

    6

    浏览量

    10503
  • sub函数
    +关注

    关注

    0

    文章

    3

    浏览量

    987
收藏 人收藏

    评论

    相关推荐

    Coke Machine State Machine

    `Coke Machine State Machine 源码:、在官方给的例程中加以修改,关于状态机是个很好的学习范例。PDF资料截图如下:`
    发表于 08-06 19:42

    JKI-State-Machine-Objects(SMO)框架讲解

    SMO-------------------------- 主帖---------------------------- 1.JKI-State-Machine-Objects简介
    发表于 06-12 13:23

    Brain Machine脑机器套件解析

    Brain Machine Kit,为您提供一种有趣,简单的冥想方式,同时非常上镜。它们使用灯光和声音,以14分钟长的脑波频率冥想序列脉动。你的大脑与这个冥想序列同步,你冥想。就是这么简单,沿途生动
    发表于 07-26 17:26

    vipm中 jki state machine

    新电脑,安装完labview 2014后 报如下错误,进而导致vipm中没有 jki sate machine安装包原电脑打开vipm的界面如下请问如果解决
    发表于 04-12 17:15

    MCU也能做Machine learning吗

    你知道吗?MCU也能做Machine learning (ML)刚刚过去的2018年被称为“人工智能元年”,2随着单芯片计算力的不断增长,机器学习(ML)不再是云计算和高性能处理器的专利,边缘计算
    发表于 11-03 06:36

    Finite State Machine Datapath

    Finite State Machine Datapath Design, Optimization, and Implementation explores the design space
    发表于 07-22 11:26 0次下载

    Research on Human Machine Inte

    Research on Human Machine Interface of Palm CNC:Huai Yin Institute of Technology ,Mechnical
    发表于 10-15 17:01 23次下载

    Design Safe Verilog State Machine(Synplicity)

    One of the strengths of Synplify is the Finite State Machine compiler. This is a powerfulfeature
    发表于 01-17 11:12 0次下载
    Design Safe Verilog State <b class='flag-5'>Machine</b>(Synplicity)

    State Machine Coding Styles for Synthesis

    本文论述了状态机的verilog编码风格,以及不同编码风格的优缺点, Steve Golsons 1994 paper, State Machine Design Techniques
    发表于 01-17 11:22 0次下载
    State <b class='flag-5'>Machine</b> Coding Styles for Synthesis

    State Machine电路设计

    State Machine电路设计,喜欢的朋友可以下载来学习。
    发表于 01-12 11:21 0次下载

    绘图案例【Circuit Simulation】State_Machine

    绘图案例【Circuit Simulation】State Machine
    发表于 02-16 11:26 0次下载

    解析在CentOS7上安装docker-machine的过程

    docker-machine是为了让docker的安装更加简单,它可以跨越操作系统!
    的头像 发表于 01-27 09:33 7005次阅读
    解析在CentOS7上安装docker-<b class='flag-5'>machine</b>的过程

    EcoStruxure Machine Expert编程指南

    本文档介绍 EcoStruxure Machine Expert 软件的图形用户界面及其提供的功能。 有关其他信息,请参阅 EcoStruxure Machine Expert 在线帮助内的独立文档。
    发表于 09-07 11:47 13次下载

    Machine Outliner简介

    在嵌入式领域,代码体积(code size)优化能够减少内存的使用,对产品的竞争力至关重要。对当代产品而言, code size优化可以为产品放入更多特性
    的头像 发表于 05-20 17:35 957次阅读
    <b class='flag-5'>Machine</b> <b class='flag-5'>Outliner</b><b class='flag-5'>简介</b>

    使用Teachable Machine和Python轻松进行对象检测

    电子发烧友网站提供《使用Teachable Machine和Python轻松进行对象检测.zip》资料免费下载
    发表于 06-27 09:26 0次下载
    使用Teachable <b class='flag-5'>Machine</b>和Python轻松进行对象检测