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

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

3天内不再提示

什么是指令调度(下)

jf_78858299 来源:姜海波 毕昇编译 作者:姜海波 毕昇编译 2023-02-02 09:36 次阅读

指令调度的问题与约束

指令调度受到多方面的约束,如数据依赖约束、功能部件约束、寄存器约束等^[3]^,在这些约束下,寻找到最优解,降低指令流水间的stall,就是指令调度的终极目标。

指令流水间的stall主要由数据型冒险、结构性冒险、控制型冒险导致。

  • 数据型冒险:当前指令的执行依赖与上一条指令执行的结果。数据型冒险共有三种:写后读(RAW)、读后写(WAR)、写后写(WAW)。数据冒险可能产生数据流依赖。
  • 结构型冒险:多条指令同时访问一个硬件单元的时候,由于缺少相应的资源,导致结构型冒险。
  • 控制型冒险:存在分支跳转,无法预测下一条要执行的指令,导致其产生的控制型冒险。

编译器解决上述冒险的方法就是通过插入 NOP 指令,增加流水间的stall来化解冒险。

下面简单介绍一下三种数据型冒险(即数据依赖):

  1. 写后读(RAW):一条指令读取前一条指令的写入结果。写后读是最常见的一种数据依赖类型,这种依赖被称为真数据依赖(true dependence)。
    x = 1;
    y = x;
    
  2. 读后写(WAR):一条指令写入数据到前一条指令的操作数。这种依赖被称为反依赖或反相关(anti dependence)。
    y = x;
    x = 1;
    
  3. 写后写(WAW):两条指令写入同一个目标。这种依赖被称为输出依赖(output dependence)。
    x = 1;
    x = 2;
    

指令调度算法之表调度(List Scheduling)

表调度是一种贪心+启发式方法,用以调度基本块中的各个指令操作,是基本块中指令调度的最常见方法。基于基本块的指令调度不需要考虑程序的控制流,主要考虑数据依赖、硬件资源等信息

表调度的基本思想:维护一个用来存储已经准备执行的指令的ready列表和一个正在执行指令的active列表,ready列表的构建主要基于数据依赖约束和硬件资源信息;根据调度算法以周期为单位来执行具体的指令调度,包括从列表中选择及调度指令,更新列表信息。

基本的表调度算法大致分为以下三步:

  1. 根据指令间依赖,建立依赖关系图。
  2. 根据当前指令节点到根节点的长度以及指令的latency,计算每个指令的优先级。
  3. 不断选择一个指令,并调度它,
    • 使用两个队列维护ready的指令和正在执行的active的指令;
    • 在每个周期:选择一个满足条件的ready的指令并调度它,更新ready队列;检查active的指令是否执行完毕,更新active列表。

指令调度案例^[4]^

本案例选自卡内基梅隆大学(Carnegie Mellon University)的Compiler Design课程。

假设当前CPU有两个计算单元(即每个周期可以执行两条指令);加法指令的latency为 2 cycles,其他指令为 1 cycle。

  1. 根据数据依赖关系构建出依赖关系图。
    图片
  2. 计算指令节点优先级
    优先级计算公式如下:
    其中,表示当前指令节点,表示的子节点,表示 "true dependency" ,表示 "anti-dependency" 。
    图片
    其中 I10 为叶节点,优先级为其latency,故结果为1;I4 为非叶节点,优先级为当前节点latency(I4 为加法指令,latency为2)+ 子节点的优先级,故结果为3。本例中无反依赖(anti-dependency)情形。
  3. 执行调度
    图片
    在实际执行调度时,对于同等优先级的指令,由于具体调度方案的不同,会出现不同的情况,例如本例中出现的场景,可以通过添加其他度量标准进一步优化优先级计算方案。尽管表调度方法不能保证得到最优调度结果,但它是接近最优解的。

本文只是简单介绍了最基本的表调度方法,在实际应用中,存在各种基于该方法的改进方案。关于LLVM编译器中的表调度算法,可以先自行阅读其源码,更多相关介绍,敬请期待。

结语

本文简单介绍了指令调度的基本概念,指令调度的原因与影响以及基本的指令调度算法。

指令调度作为NP完全问题目前依旧尚未有一个完美的解决方案,对指令调度算法的探索与优化尚有很大的发展空间。

LLVM之父Chris Lattner认为“编译器的黄金时代”已经降临^[5]^。随着计算机架构的复兴,未来的N年里将是每一位编译器工程师大显身手的时代。

参考

  1. Keith D. Cooper, Linda Torczon. Engineering a Compiler (Second Edition).
  2. https://zhuanlan.zhihu.com/p/360364235
  3. Andrew W.Apple, Maia Ginsburg. Modern Compiler Implementation in C.
  4. https://www.cs.cmu.edu/afs/cs/academic/class/15745-s19/www/lectures/L18-Instruction-Scheduling-pre-class.pdf
  5. https://zhuanlan.zhihu.com/p/502730940
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    18219

    浏览量

    221940
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10412

    浏览量

    206467
  • 指令调度器
    +关注

    关注

    0

    文章

    4

    浏览量

    1481
收藏 人收藏

    评论

    相关推荐

    应急通信调度指挥系统的原理

      应急通信调度指挥系统的原理  从技术层面,我们提到的应急通信调度指挥系统原理,如图所示,主要包括四个方面:信息采集、信息传递、信息处理以及指令下达和执行 。其中,虚框内表示急需  1.信息采集
    发表于 12-29 17:21

    编译器优化的静态调度介绍

    量与指令调度相关性更强,下面简单介绍一这两种模式。  流水线  将指令执行过程分成多个阶段,每个阶段使用不同的硬件资源,从而使得多条指令
    发表于 03-17 17:07

    基于整数线性规划的TTA代码优化

    针对传输触发结构代码生成中的指令调度、多寄存器堆分配、全局寄存器分配和软件旁路等优化问题,给出一个整数线性规划形式化模型,并实现了一个软件架构来验证该模型的正
    发表于 04-11 09:57 7次下载

    面向RISC-DSP处理器的代码生成和优化

    摘要:随着嵌入式系统应用的发展,高效和小型化是其主要特点,这对目标代码质量的要求也越来越高。针对自行设计的32位具有RISC-DSP结构的媒体处理器MD-32特有的体系结构特点,提出C编译器支持的,在汇编代码级通过指令调度和转换指令
    发表于 02-24 22:29 24次下载

    基于ARM Cortex-M3的μCOS-II任务调度硬件指令实现

    本文首先多UC/OS-II的任务调度算法做了详细的分析, 然后介绍了基于基于ARM Cortex-M3的COS-II的任务调度硬件指令实现
    发表于 03-25 15:13 270次下载
    基于ARM Cortex-M3的μCOS-II任务<b class='flag-5'>调度</b>硬件<b class='flag-5'>指令</b>实现

    同时多线程处理器的指令调度器设计

    同时多线程处理器的指令调度器设计_李乐
    发表于 01-08 14:55 0次下载

    柔性负荷调度,发电调度的补充

    的负荷,包含具备需求弹性的可调节负荷或可转移负荷,具备双向调节能力的电动汽车、储能、蓄能,以及分布式电源、微网等。传统发电调度中,机组需按照调控指令完全响应,而柔性负荷调度在满足电网调度
    发表于 05-24 14:44 6457次阅读
    柔性负荷<b class='flag-5'>调度</b>,发电<b class='flag-5'>调度</b>的补充

    变电所的倒闸操作基本要求_变电所的倒闸操作的顺序

    调度操作指令要由有权发布指令调度值班员(所属调度单位发文公布)发布;操作人和监护人必须由上级部门批准并公布的合格人员担任。
    的头像 发表于 12-04 10:10 1.5w次阅读

    使用Tomasulo算法实现循环展开和指令调度的示例详细说明

    对体系结构寄存器重命名,提供更大的寄存器集合;缓冲来自寄存器的操作数。Tomasulo方案中组合使用两种不同的技术。源操作数缓冲消除了当操作数在寄存器中可用时出现的WAR冒险。对寄存器重命名,再结合对结果的缓存,直到对寄存器早期数据的引用全部结束,这样也有可能消除WAR冒险。
    发表于 12-10 08:00 4次下载
    使用Tomasulo算法实现循环展开和<b class='flag-5'>指令</b><b class='flag-5'>调度</b>的示例详细说明

    计算机系统结构教程之指令级并行的详细资料说明

    本文档的主要内容详细介绍的是计算机系统结构教程之指令级并行的详细资料说明包括了:1 指令级并行的概念,2 指令的动态调度,3 动态分支预测技术,4 多
    发表于 12-10 08:00 0次下载
    计算机系统结构教程之<b class='flag-5'>指令</b>级并行的详细资料说明

    机场智能调度系统的功能及应用方案

    根据机场地勤运作特点和业务需求,易华录提供了一体化端到端的机场无线地勤调度解决方案,为机场运作提供高效、安全、可靠并且高性价比的特有的机场调度系统,统一承载语音通话、集群语音、工作流指令、信息发布
    发表于 11-16 10:49 2930次阅读

    负载均衡处理器的运算资源分配策略

    现代超标量处理器通常设置有多套计算部件攴持指令并行执行,以提高程序的运行效率。运算资源分配策略在很大程度上决定了处理器能否充分利用计算部件并行加速计算,具有重要作用。就指令调度以及运算资源分配
    发表于 05-13 10:44 15次下载

    什么是调度?如何进行调度

    进程调度是操作系统最重要的内容之一,也是学习操作系统的重点和难点。关于进程调度,我们首先就会问出一些问题,什么是进程调度,为什么要进程调度,如何进行
    发表于 08-05 09:04 8744次阅读

    什么是指令调度(上)

    指令调度是指对程序块或过程中的操作进行排序以有效利用处理器资源的任务^[1]^。指令调度的目的就是通过重排指令,提高
    的头像 发表于 02-02 09:36 2354次阅读
    什么是<b class='flag-5'>指令</b><b class='flag-5'>调度</b>(上)

    北斗定位终端在应急救援场景的高精度定位与通信能力

    ,为救援行动提供了精确的导航和指引。 同时,它强大的通信能力确保了救援队伍与指挥中心之间的信息畅通无阻,无论是短报文通信还是实时语音通话,都能帮助救援人员及时报告现场情况,接收指挥中心的指令调度信息。这种高精度
    的头像 发表于 03-29 11:18 158次阅读