指令调度(Instruction Scheduling)

news2024/9/24 21:26:09

指令调度(Instruction Scheduling)

  • 指令调度的约束
  • 基本机器模型
  • 基本块调度
  • 全局调度

指令调度是为了提高指令级并行(ILP),对于超长指令字(VLIW, Very Long Instruction Word)和多发射系统,ILP是可以有效提高硬件利用率。

指令调度的约束

指令调度也是一种程序的优化pass,需要遵循以下约束:

  • 数据依赖约束。调度后代码执行结果需要和调度前相同。
  • 控制依赖约束。所有调度前程序执行的指令都必须在调度后的程序中执行。
  • 资源约束。调度不能超过机器上的资源。

数据依赖包括真依赖、反依赖、输出依赖和输入依赖,相关概念可以参阅 数据依赖和控制依赖 Data Dependence and Contol Dependence。前3种依赖约束了指令的执行顺序,但其中只有真依赖的依赖关系是不可解除的,而反依赖和输出依赖都可以通过使用不同的变量来解除依赖关系。

一个基本块(BB)内指令只要满足数据依赖就可以进行任意重新排序,但基本块内的程序通常都很少,重排提升并行性非常有限。提高基本块之间的并行性就至关重要了。基本块间指令的调度需要遵循控制依赖的约束,如果指令a的结果决定了指令b是否执行,则称指令b控制依赖于指令a。控制依赖相关概念可以参阅 数据依赖和控制依赖 Data Dependence and Contol Dependence。

资源约束是显而易见的,调度肯定不能超过机器物理资源的限制。

基本机器模型

在介绍指令调度前,先假设下我们的基本机器模型:

对于一个基本数学运算:

  • 需要一个ALU单元的物理资源
  • 需要一个时钟(clock)的时间

对于Loads (LD) 和 Stores (ST):

  • 需要一个MEM(Memory buffer)单元的物理资源
  • ST需要一个时钟时间。LD需要两个时钟时间才能完成,但是我们可以在下一个时钟ST到相同的内存位置,并且每个LD可以在任意时钟发射。

基本块调度

先从最简单的基本块调度说起,这里介绍列表调度(list scheduling)的方法。基本块内的指令顺序其实就是一种拓扑排序,基本块调度的目的是找到一种性能最佳(并行度最高)的拓扑排序。

一个基本块内的指令构建一个数据依赖图(data-dependece graph):

  • 节点就是基本块内的每条指令
  • 边代表两条指令间的数据依赖, i → j i\rightarrow j ij 表示指令 j j j 数据依赖于指令 i i i
  • 边上有一个表示延迟的标号。代表目的指令必须在源指令发射后至少多少个时钟之后发射

例如:

LD r1, a          // MEM
LD r2, b          // MEM
ADD r3, r1, r2    // ALU
ST a r2           // MEM
ST b r1           // MEM
ST c r3           // MEM

数据依赖图为:

列表调度是一种简单的启发式的方法,在遵从数据依赖的基础上,选择一个带有优先级的拓扑排序来访问数据依赖图中的每个节点,比如启发式地先选择具有最长路径的节点。

指令选择的优先级:

  • 最长路径(或关键路径)。从该节点开始的最长路径长度
  • 满足资源限制
  • 源指令的顺序

列表调度算法为:

使用列表调度算法对上述指令调度如下:

1)首先将 LD r1, aLD r2, b加入到READY中,此时 READY={LD r1, a; LD r1, a}。则先调度第一条指令 LD r1, a,此时MEM资源限制,LD r2, b延迟到第二个时钟调度:

LD r1, a // clock 1  
LD r2, b // clock 2

此时更新READYREADY={ADD r3, r1, r2; ST a r2; ST b r1 }

2)接着ADD r3, r1, r2有最高优先权(最长执行路径),并且ALU资源可用,最早可以在第四个时钟调度:

LD r1, a    // clock 1      
LD r2, b    // clock 2

ADD r3, r1, r2  // clock 4

此时更新READYREADY={ST a r2; ST b r1; ST c r3 }

3)接着ST a r2有最高调度优先权,最早在时钟4就绪,并且MEM资源可用,因而可以调度到时钟4的位置:

LD r1, a    // clock 1      
LD r2, b    // clock 2

ADD r3, r1, r2      ST a r2   // clock 4

此时更新READYREADY={ST b r1; ST c r3 }

4)此时ST b r1有最高调度优先权,最早在时钟3就绪,并且MEM资源可用,因而可以调度到时钟3的位置:

LD r1, a    // clock 1      
LD r2, b    // clock 2
ST b r1     // clock 3
ADD r3, r1, r2      ST a r2   // clock 4

此时更新READYREADY={ST c r3 }

5)最后调度ST c r3,结果如下:

LD r1, a     // clock 1      
LD r2, b     // clock 2
ST b r1      // clock 3
ADD r3, r1, r2      ST a r2   // clock 4
ST c r3      // clock 5

全局调度

基本块可以调度的空间非常有限,因而跨基本块的全局调度至关重要。在介绍全局调度前,这里先介绍一个概念:控制等价的(control equivalent)。

如果基本块B支配基本块B’,并且基本块B’反向支配基本块,则称B和B‘是控制等价的。

假设每个时钟可以执行任意两条指令,除了加载指令需要两个时钟周期的延迟外,其余每条指令执行延迟为一个时钟周期。下面的例子,假设abcde地址各不相同,并且它们的地址分别存放在R1~R5中。

通过观察,有以下几个优化点:

  • 不管分支如何跳转,B3中的指令都会被执行,一次B3可以和B1并行执行。
  • B2B1存在控制依赖关系,可以投机性地执行B2中的加载指令,如果B2被执行则可以节省两个时钟周期。但保存指令不能投机性地执行,它会覆盖某个内存位置上的值,却可以延迟执行一个保存指令。

移动后的代码可以在4个时钟周期内完成。

指令移动的目的是在遵从数据依赖的同时增加指令的并行性。包括向上代码移动和向下代码移动。

向上代码移动:将指令从基本块src向上移动到基本块dst

  • 如果srcdst是控制等价的,如果这样的移动没有破坏数据依赖关系,并且可以让的代码运行的更快,这样的移动没有任何问题。
  • 如果src不反向支配dst,则意味着存在一条经过dst但不经过src的路径,在这条路径上会多执行一条被移动过去的指令。首先这条被移动的指令必须是没有副作用的,否则这样的移动就是非法移动。如果这条指令在dst中是”免费“执行的(利用的是闲置的物理资源),则这样的移动不会产生开销。当控制流达到src时,这次移动就是有收益的。
  • 如果dst不支配src,则存在一条不经过dst就到达src的路径,那我们需要在这条路径上插入被移动指令的拷贝(补偿代码)。补偿代码会让某些执行路径变慢,因此需要对这种移动的收益作出评估才行。

向下代码移动:将指令从基本块src向下移动到基本块dst。根据支配情况也同样有以上类似问题。

这里介绍一个基本的全局调度算法——区域调度,它优先调度最内层循环,并且仅向上移动代码。

程序可以被看作是一个 区域(Region) 的层次结构。区域是流图中只有单个入口节点的部分,正式地讲,一个区域是满足如下条件的节点N和边E的集合:

  • N中有一个支配N中所有节点的头节点h。
  • 如果某个节点m可以不经过h可以到达N中的n,那么m也在N中。
  • E是N中任意两个节点n1和n2之间的控制流边的集合。有些进入h的边(可能)不在其中。

    B1和B2以及边B1->B2形成一个区域。B1、B2和B3以及边B1->B2、B2->B3和B1->B3也形成一个区域。但是B2、B3以及边B2->B3组成的子图不是一个区域。

最后给出区域调度算法如下:

参考:

  • https://suif.stanford.edu/~courses/cs243/lectures/L7.pdf
  • http://infolab.stanford.edu/~ullman/dragon/w06/lectures/inst-sched.pdf
  • 龙书

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/806288.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jvm的一些技巧

反编译字节码文件 找到对应的class文件所在的目录,使用javap -v -p 命令 查询运行中某个Java进程的Jvm参数 【案例】查询 MethodAreaDemo 这个类运行过程中,初始的元空间大小 MetaspaceSize jps 查询 Java 进程的进程ID ![在这里插入图片描述](https…

GRACE数据反演的新理解

一、问题提出 “重力恢复与气候实验”(GRACE)为监测地球系统内全球大尺度质量变化提供了一种新途径。自2002年3月发射以来,GRACE一直在生成时间变化的重力场模型,这些模型可用于量化与全球气候变化相关的地球系统不同组成部分内的…

【C++11】——类的新功能

目录 1. 默认成员函数 2. 类成员变量初始化 3. 强制生成默认函数的关键字default 4. 禁止生成默认函数的关键字delect 5. 继承和多态的final与override关键字 6. 测试案例 1. 默认成员函数 原来C类中(C11之前),有6个默认成员函数&…

管理类联考——写作——素材篇——论证有效性分析——常见逻辑谬误

批判性思维常见逻辑谬误 有些错误出现在我们澄清或定义某个观点的时候,有些错误出现在我们收集证据或者用证据和理由支撑某个观点的时候,有些错误出现在我们尝试从证据得出结论的时候,有些错误甚至出现在我们评估他人的观点或者理由的时候。…

Drools用户手册翻译——第四章 Drools规则引擎(八)drools中的事实传播模式和议程评估过滤器

甩锅声明:本人英语一般,翻译只是为了做个笔记,所以有翻译错误的地方,错就错了,如果你想给我纠正,就给我留言,我会改过来,如果懒得理我,就直接划过即可。 drools中的事实…

微信小程序开发每日一写--5

按钮的使用和底层逻辑的实现&#xff08;暂未成功&#xff09; WXML&#xff1a; <button class"bth1"type"primary" >按钮</button>JS&#xff1a; // index.js // 获取应用实例 //const app getApp() Page({/*bthTapHandler(e){//按钮的…

C动态内存分配

&#x1f388;对比一般内存分配和动态内存分配 &#x1f308;一般内存分配 int val 20; char arr[10] {0};特点&#xff1a; ①大小是固定的&#xff0c;一旦分配好就无法改变&#xff08;数组必须指定大小后编译器才能分配空间&#xff09; ②分配的空间具体放置什么类型的…

ffmpeg批量分割视频解决视频前几秒黑屏的问题解决

echo 请输入视频地址&#xff1a; set /p fp echo 请输入开始时间&#xff1a; set /p st echo 请输入结束时间&#xff1a; set /p et echo 请输入分片时间&#xff1a; set /p sgt echo 注意&#xff1a;循环范围参数要空格。 for /l %%i in (%st%, %sgt%, %et%) do call :aa…

【Spring AOP学习】AOP的组成 SpringAOP的实现和实现原理

目录 一、认识SpringAOP 1、AOP是什么&#xff1f; 2、AOP的功能 3、AOP的组成&#xff08;重要&#xff09; 二、SpringAOP的实现 &#x1f337;1、添加Spring AOP框架支持 &#x1f337;2、定义切面和切点 &#x1f337; 3、定义通知 3.1 完成代码实现 3.2 具体通知…

目前可以实现用手机操作水质自动采样器吗

利用自动采样器进行水样采集可以说节省很大的人力物力&#xff0c;但是有时为了采到更具代表性的水样&#xff0c;我们需要对沟渠、深井、排污口等特殊场景进行采样。像这些狭小的空间领域采样就有点困难&#xff0c;对现场工作人员就带来了一些难题。所以也需要一款可以在井下…

HCIP——OSPF的防环机制

OSPF的防环机制 一、域间防环二、域内防环有向图转化1、有向图的画法2、示例&#xff1a; 三、SPF算法 OSPF将整个OSPF域划分为多个区域&#xff0c;区域内部通过拓扑信息计算路由&#xff0c;区域间传递路由信息&#xff0c;实现全网可达。OSPF防环机制主要是体现在域内防环和…

python3GUI--我的二维码生成工具By:PyQt5(附UI源码)

文章目录 一&#xff0e;前言二&#xff0e;展示1.主界面2.主界面-选择颜色&#xff08;动图&#xff09;3.主界面-选择样式&#xff08;动图&#xff09; 三&#xff0e;思路1.UI设计2.核心3.其他1.为什么调整了样式左侧二维码就跟着变化2.首次启动软件生成的文件哪里来的3.作…

华为8月8日将推出系统云翻新功能:P40/Mate 30系列首发

7月28日消息&#xff0c;7月28日消息&#xff0c;华为终端公司近日在微博上发布重要公告&#xff0c;宣布将于8月8日推出全新的系统云翻新功能。据悉&#xff0c;该功能将首次应用于华为 P40 系列手机和 Mate30 系列手机&#xff0c;为用户提供更便捷的手机数据备份和恢复体验。…

如何降低机场人员定位系统成本?哪种方案简单又好用?

一、方案简介 机场是一个室内空间巨大的人员聚集地差旅人员找不到出入口、卫生间、商铺为找检票口而误车等是很常见的现状。面对这些问题&#xff0c;机场信息数字化建设成为一种最为有效的解决方式&#xff01; 华安联大通过多技术融合实现室内外位置健全&#xff0c;推出一…

【机密计算-大厂有话说】微软 Azure

什么是机密计算&#xff1f; 机密计算是由机密计算联盟 (CCC) 定义的一个行业术语&#xff0c;CCC 是专注于定义并加速机密计算落地的基金会。 CCC 给机密计算的定义是&#xff1a;通过在基于硬件的可信执行环境 (TEE) 中执行计算来保护使用中的数据。 TEE 是是一个只能执行授权…

Jetbrains idea 代码关闭 注释自动渲染 导致换行不生效

方法1 关闭注释自动渲染 取消勾选 方法2 结尾使用 <br> 强制换行

【Python】logging模块笔记

目录 日志级别 四个组件 记录器 处理器 处理器 格式化器 格式 用法1&#xff1a;小项目可以采用编程的方法 用法2&#xff1a;建议采用配置文件的方式 用法3&#xff1a; 字典配置 日志级别 #默认的日志输出为warning # 使用baseConfig() 来指定日志输出级别 # 同时&#x…

每日一题——找到消失的数字

找到消失的数字 题目链接 思路 一个长度为n的数组中所有数据的范围在[1,n]内&#xff0c;题目要求我们找出在[1,n]范围内&#xff0c;但数组中没有出现的数字 如果可以使用额外空间&#xff0c;那这题就好办了。我们直接创建一个相同大小的数组&#xff0c;数组的每个位置代…

三. 多传感器标定方案(空间同步)--2

前面的内容&#xff1a; 一. 器件选型心得&#xff08;系统设计&#xff09;--1_goldqiu的博客-CSDN博客 一. 器件选型心得&#xff08;系统设计&#xff09;--2_goldqiu的博客-CSDN博客 二. 多传感器时间同步方案&#xff08;时序闭环&#xff09;--1 三. 多传感器标定方案…

AI聊天GPT三步上篮!

1、是什么&#xff1f; CHATGPT是OpenAI开发的基于GPT&#xff08;Generative Pre-trained Transformer&#xff09;架构的聊天型人工智能模型。也就是你问它答&#xff0c;根据网络抓去训练 2、怎么用&#xff1f; 清晰表达自己诉求&#xff0c;因为它就是一个AI助手&#…