
.中 央 民 族 大 学
实 验 报 告
学生姓名: 李武第 学 号:21301968
一、实验室名称:计算机学院计算中心
二、实验项目名称:DLX 流水线指令调度
三、实验原理:
指令调度(instruction scheduling)是一种代码优化手段,常见于优化编译器,其主要功能在
于通过加强指令层级的并行运行,使得程序在拥有指令流水线的中央处理器上能够高效运
行。换句话说,此手段力求以不改变程序运算结果的方式,完成以下任务:
通过重组指令的运行顺序,减少或阻止流水线停顿的发生;
阻止非法操作(即未定义行为)的产生,例如涉及流水线时序、非互锁资源的等等操作。
其中流水线停顿主要由结构型冒险(受处理器的资源所限)、数据型冒险以及控制流型冒险
导致。
指令调度一般在某基础块(basic block)上执行。为了确保指令的运行顺序在重组后,其运
算结果依旧不变,编译器的开发者们必须要认识到数据依赖这种概念。数据型冒险总共有三
种,其性质恰恰与数据型冒险相符,这三种数据冒险分别是:
写入后读取(RAW, Read After Write) - I1 的输出值之后会被 I2 使用。
读取后写入(WAR, Write After Read) - I1 的输入位置之后会被 I2 使用并覆盖。
写入后写入(WAW, Write After Write) - I1 以及 I2 皆将结果写入同一个位置上。
其中 I1 以及 I2 是两个在不同时间点上执行的指令。
对于这三种冒险,指令 I1 都必须执行于 I2 被执行前,否则其运算结果是不被定义的(具体
结果视该机器的硬件实现而定)。对于冒险 1,这是因为 I2 依赖着 I1 的数据;对于冒险 2,
则是因为 I1 依赖着即将被 I2 所覆盖的数据;对于冒险 3,则是因为在 I1 和 I2 之间所运行的
指令可能会使用到 I1 的输出结果。为了确保这些数据依赖所需的运行顺序得到保证,编译器
首先需要建立一幅依赖图,即一幅顶点是指令,而边是依赖性的有向图。最终,这幅图的任
何一种拓扑排序都可以是有效的指令调度表。
评论0