1 / 147

4.1 指令级并行的概念 4.2 指令的动态调度 4.3 控制相关的动态解决技术 4.4 多指令流出技术

4.1 指令级并行的概念 4.2 指令的动态调度 4.3 控制相关的动态解决技术 4.4 多指令流出技术. 4.1 指令级并行的概念. 当指令之间不存在相关时,它们在流水线中是可以重叠起来并行执行的。这种指令序列中存在的潜在并行性称为 指令级并行 。 ( Instruction-Level Parallelism ,简记为 ILP ) 本章研究: 如何通过各种可能的技术,获得更多的指令级并行性。 (硬件技术和软件技术) 必须要硬件技术和软件技术互相配合,才能够最大限度地挖掘出程序中存在的指令级并行。. 1. 流水线处理器的实际 CPI.

libby
Télécharger la présentation

4.1 指令级并行的概念 4.2 指令的动态调度 4.3 控制相关的动态解决技术 4.4 多指令流出技术

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 4.1 指令级并行的概念 4.2 指令的动态调度 4.3 控制相关的动态解决技术 4.4 多指令流出技术

  2. 4.1 指令级并行的概念 • 当指令之间不存在相关时,它们在流水线中是可以重叠起来并行执行的。这种指令序列中存在的潜在并行性称为指令级并行。 (Instruction-Level Parallelism,简记为ILP) • 本章研究:如何通过各种可能的技术,获得更多的指令级并行性。 (硬件技术和软件技术) • 必须要硬件技术和软件技术互相配合,才能够最大限度地挖掘出程序中存在的指令级并行。

  3. 1.流水线处理器的实际CPI • CPI流水线 = CPI理想 + 各类停顿周期数的总和 流水线的理想CPI是流水线的最大流量。 各类停顿包括: • 结构相关停顿:是由于两条指令使用同一个功能部件而导致的停顿。 • 控制相关停顿:是由于指令流的改变(如分支指令)而导致的停顿。 • RAW、WAR和WAW停顿:由数据相关造成的。 • 减少其中的任何一种停顿,都可以有效地减少CPI,从而提高流水线的性能。

  4. 2. 本章要研究的技术以及它们所克服的停顿

  5. 3.几个概念 • 基本程序块 • 一段除了入口和出口以外不包含其它分支的线性代码段。 • 程序平均每6~7条指令就会有一个分支。 • 循环体中指令之间的并行性称为循环级并行性。 • 开发循环体中存在的并行性。 • 最常见、最基本 • 是指令级并行研究的重点之一。

  6. 最基本的开发循环级并行的技术 • 指令调度(scheduling)技术 • 循环展开(loop unrolling)技术 • 换名(renaming)技术

  7. 4.1.1 循环展开调度的基本方法 1. 指令调度 通过改变指令在程序中的位置,将相关指 令之间的距离加大到不小于指令执行延迟,将 相关指令转化为无关指令。 指令调度是循环展开的技术基础。 2. 编译器在完成这种指令调度时,受限于以下两 个特性: • 程序固有的指令级并行性 • 流水线功能部件的执行延迟

  8. 3. 本章使用的浮点流水线的延迟

  9. 例4.1 对于下面的源代码,转换成DLX汇编语言,在不进行指令调度和进行指令调度两种情况下,分析代码一次循环的执行时间。 for (i=1; i<=1000; i++) x[i] = x[i] + s;

  10. 解:(1)变量分配寄存器 整数寄存器R1:循环计数器,初值为向量 中最高端地址元素的地址。 浮点寄存器F2:保存常数S。 假定最低端元素的地址为8。 (2)DLX汇编语言后的程序 Loop: LD F0,0(R1) ADDD F4,F0,F2 SD 0(R1),F4 SUBI R1,R1,#8 BNEZ R1,Loop

  11. (3)程序执行的实际时钟 • 根据表4-2中给出的的延迟,实际时钟如下: 指令流出时钟 Loop: LD F0 , 0(R1) 1 (空转) 2 ADDD F4 , F0 , F2 3 (空转) 4 (空转) 5 SD 0(R1) , F4 6 SUBI R1 , R1 , #8 7 (空转) 8 BNEZ R1 , Loop 9 (空转) 10 • 每个元素的操作需要10个时钟周期,其中5个是空转周期。

  12. (4)指令调度以后,程序的执行情况 • SD放在分支指令的分支延迟槽中 • 对存储器地址偏移量进行调整 指令流出时钟 Loop: LD F0 , 0(R1) 1 SUBI R1 , R1 , #8 2 ADDD F4 , F0 , F2 3 (空转) 4 BNEZ R1 , Loop 5 SD 8(R1) , F4 6 • 一个元素的操作时间从10个时钟周期减少到6个 5个周期是有指令执行的,1个空转周期。

  13. (5)例子中的问题及解决方案 • 只有LD、ADDD和SD这3条指令是有效操作. • 占用3个时钟周期 • 而SUBI、空转和BENZ这3个时钟周期都是附加的循环控制开销。 • 循环展开技术 • 多次复制循环体并相应调整展开后的指令和循环结束条件,增加有效操作时间与控制操作时间的比率。 • 也给编译器进行指令调度带来了更大的空间。

  14. 例4.2 体现循环展开技术的特点 将例4.1中的循环展开成3次得到4个循环体,再对展开后的指令序列在不调度和调度两种情况下,分析代码的性能。 假定R1的初值为32的倍数,即循环 次数为4的倍数。

  15. 解: • 补偿代码问题 • 寄存器分配 展开后的循环体内不重复使用寄存器。 F0、F4:用于展开后的第1个循环体 F2:保存常数 F6和F8:用于展开后的第2个循环体 F10和F12:用于第3个循环体 F14和F16:用于第4个循环体

  16. (1)展开后没有调度的代码 流出时钟 ADDD F12,F10,F2 15 (空转) 16 (空转) 17 SD -16(R1),F12 18 LD F14,-24(R1) 19 (空转) 20 ADDD F16,F14,F2 21 (空转) 22 (空转) 23 SD -24(R1),F16 24 SUBI R1,R1,#32 25 (空转) 26 BNEZ R1,Loop 27 (空转) 28 流出时钟 Loop: LD F0,0(R1) 1 (空转) 2 ADDD F4,F0,F2 3 (空转) 4 (空转) 5 SD 0(R1),F4 6 LD F6,-8(R1) 7 (空转) 8 ADDD F8,F6,F2 9 (空转) 10 (空转) 11 SD -8(R1),F8 12 LD F10,-16(R1) 13 (空转) 14

  17. 结果分析: • 这个循环每遍共使用了28个时钟周期 • 有4个循环体,完成4个元素的操作 平均每个元素使用28/4=7个时钟周期 • 原始循环的每个元素需要10个时钟周期 节省的时间:从减少循环控制的开销中获得的 • 在整个展开后的循环中,实际指令只有14条,其它13个周期都是空转。 效率并不高

  18. (2)对指令序列进行优化调度 指令流出时钟 Loop: LD F0,0(R1) 1 LD F6,-8(R1) 2 LD F10,-16(R1) 3 LD F14,-24(R1) 4 ADDD F4,F0,F2 5 ADDD F8,F6,F2 6 ADDD F12,F10,F2 7 ADDD F16,F14,F2 8 SD 0(R1),F4 9 SD -8(R1),F8 10 SUBI R1,R1,#32 12 SD 16(R1),F12 11 BNEZ R1,Loop 13 SD 8(R1),F16 14

  19. 结果分析: • 没有数据相关引起的空转等待 • 整个循环仅仅使用了14个时钟周期 • 平均每个元素的操作使用14/4=3.5个时钟周期 • 循环展开和指令调度可以有效地提高循环级并行性。 • 这种循环级并行性的提高实际是通过实现指令级并行来达到的。 • 可以使用编译器来完成,也可以通过硬件来完成。

  20. 4. 循环展开和指令调度时要注意的问题 (1) 保证正确性 (2) 注意有效性 (3) 使用不同的寄存器 (4) 尽可能减少循环控制中的测试指令和分支指令 (5) 注意对存储器数据的相关性分析 (6) 注意新的相关性 5. 实现循环展开的关键 分析清楚代码中指令的相关性,然后通过 指令调度来消除相关.

  21. 4.1.2 相关性 • 开发指令级并行的关键 • 存在相关的两条指令,不能改变它们的顺序。 • 相关是否导致流水线的空转,还与流水线的组织与结构有关。 • 程序中的相关主要有以下三种 • 数据相关 • 名相关 • 控制相关

  22. 1. 数据相关(data dependence) • 对于指令i和指令j,如果 (1) 指令j使用指令i产生的结果,或者 (2) 指令j与指令k数据相关,指令k与指令i数据相 关,则指令j与指令i数据相关。 数据相关具有传递性。 • 数据相关是两条指令之间存在一个先写后读相关链。 • 相关链贯穿整个程序,是程序的内在特征。 • 这种相关链是导致流水线停顿的原因之一。

  23. 指令的相关距离(distance) 两条指令之间的指令条数。 • 分析数据相关的主要工作: (1) 确定指令的相关性,找到所有可能产生停 顿的地方。 (2) 确定必须严格遵守的数据的计算顺序。 (3) 确定指令的最大相关距离,确定程序中可 能的最大并行性。

  24. 2. 名相关(name dependence) • 指令使用的寄存器或存储器称为名。 • 如果两条指令使用相同的名,但是它们之间并没有数据流,则称之为名相关。 • 指令j与指令i之间名相关有以下两种: (1) 反相关(anti-dependence) (2) 输出相关(output dependence)

  25. 消除名相关 • 名相关的指令之间没有数据交换。 • 如果一条指令中的名改变了,并不影响另外一条指令的执行。 • 通过改变指令中操作数的名来消除名相关,这就是换名(renaming)技术。 • 对于寄存器操作数进行换名称为寄存器换名。 (register renaming) • 可以用编译器静态完成或硬件动态完成。

  26. 例:我们对例4.2编译过程进行分析,来仔细考察 换名的过程。(1) 首先,仅仅去除4遍循环体中的分支指令, 得到以下由17条指令构成的指令序列:

  27. Loop: LD F0 , 0(R1) ADDD F4 , F0 , F2 SD 0(R1) , F4 SUBI R1 , R1 , #8 LD F0 , 0(R1) ADDD F4 , F0 , F2 SD 0(R1) , F4 SUBI R1 , R1 , #8 LD F0 , 0(R1) ADDD F4 , F0 , F2 SD 0(R1) , F4 SUBI R1 , R1 , #8 LD F0 , 0(R1) ADDD F4 , F0 , F2 SD 0(R1) , F4 SUBI R1 , R1 , #8 BNEZ R1 , Loop

  28. (2) 编译器可以通过对相关链上存储器访问偏移 量的直接调整,将前3条SUBI指令消除掉,从而得到下面一个14条指令构成的指令序列:

  29. Loop: LD F0 , 0(R1) ADDD F4 , F0 , F2 SD 0(R1) , F4 LD F0 , -8(R1) ADDD F4 , F0 , F2 SD -8(R1) , F4 LD F0 , -16(R1) ADDD F4 , F0 , F2 SD -16(R1) , F4 LD F0 , -24(R1) ADDD F4 , F0 , F2 SD -24(R1) , F4 SUBI R1 , R1 , #32 BNEZ R1 , Loop

  30. (3) 通过寄存器换名,消除名相关。 得到右边的指令序列: Loop: LD F0 , 0(R1) ADDD F4 , F0 , F2 SD 0(R1) , F4 LD F6 , -8(R1) ADDD F8 , F6 , F2 SD -8(R1) , F8 LD F10 , -16(R1) ADDD F12 , F10 , F2 SD -16(R1) , F12 LD F14 , -24(R1) ADDD F16 , F14 , F2 SD -24(R1) , F16 SUBI R1 , R1 , #32 BNEZ R1 , Loop 换名操作需要较大的寄存器开销。

  31. 3.控制相关(control dependence) • 控制相关是指由分支指令引起的相关。 • 典型的程序结构是“if-then”结构。 • 看下面一个示例: if p1{ S1; }; S; if p2{ S2; };

  32. 处理控制相关的两个原则: (1) 与控制相关的指令不能移到分支指令之 前,即控制有关的指令不能调度到分支 指令控制范围以外; (2) 与控制无关的指令不能移到分支指令之 后,即控制无关的指令不能调度到分支 指令控制范围以内。

  33. 再考察例4.2: 假设循环展开时,循环控制分支指令没有去除, 则指令序列如下:

  34. Loop: LD F0 , 0(R1) ADDD F4 , F0 , F2 SD 0(R1) , F4 SUBI R1 , R1 , #8 BEQZ R1 , Exit LD F0 , 0(R1) ADDD F4 , F0 , F2 SD 0(R1) , F4 SUBI R1 , R1 , #8 BEQZ R1 , Exit LD F0 , 0(R1) ADDD F4 , F0 , F2 SD 0(R1) , F4 SUBI R1 , R1 , #8 BEQZ R1 , Exit LD F0 , 0(R1) ADDD F4 , F0 , F2 SD 0(R1) , F4 SUBI R1 , R1 , #8 BNEZ R1 , Loop Exit:

  35. 4.2 指令的动态调度 • 静态调度:在出现数据相关时,为了消除或 者减少流水线空转,编译器确定并分离出程 序中存在相关的指令,然后进行指令调度, 并对代码进行优化。 • 动态调度:通过硬件重新安排指令的执行顺序, 来调整相关指令实际执行时的关系,减少处理 器空转。 以硬件复杂性的显著增加为代价。

  36. 4.2.1 动态调度的原理 到目前为止我们所使用流水线的最大的局限性: 指令必须顺序流出 看下面一段代码: DIVD F0 , F2 , F4 ; S1 ADDD F10 , F0 , F8 ; S2:S2对S1数据相关, S2被阻塞 SUBD F12 , F8 ,F14 ;S3:S3与S1、S2都没 有相关,但也被阻塞

  37. 为了允许乱序执行,我们将基本流水线的译码阶段为了允许乱序执行,我们将基本流水线的译码阶段 再分为两个阶段: (1)流出(Issue,IS):指令译码,检查是否存 在结构阻塞。 (2)读操作数(Read Operands,RO):当没有数 据相关引发的阻塞时就读操作数。 • 指令乱序结束带来的最大问题: 异常处理比较复杂 (精确异常处理、不精确异常处理)

  38. 4.2.2 动态调度算法之一:记分牌 例:数据先读后写(WAR)相关引起的阻塞 代码序列: DIVD F0 , F2 , F4 ADDD F10 , F0 , F8 SUBD F8 , F8 , F14 指令乱序执行时就会出现先读后写相关。 • 记分牌技术的目标:在资源充足时,尽可能早地执行没有数据阻 塞的指令,达到每个时钟周期执行一条指令。

  39. 要发挥指令乱序执行的好处,必须有多条指令 同时处于执行阶段,这就要求有多个功能部件 或功能部件流水化或者两者兼有。 • 假设:处理器采用多个功能部件。 CDC 6600具有16个功能部件: 4个浮点部件, 5个存储器访问部件 7个整数操作部件 在DLX中,假设有2个乘法器、1个加法器、1 个除法部件和1个整数部件。

  40. 1.采用记分牌技术的DLX处理器的基本结构。 图4.1 具有记分牌的DLX处理器基本结构

  41. 记分牌电路负责记录资源的使用,并负责相关检测,控制指令的流出和执行。记分牌电路负责记录资源的使用,并负责相关检测,控制指令的流出和执行。 2.每条指令在流水线中的执行过程分为四段: (1) 流出(Issue,记为IS) 如果本指令所需的功能部件有空闲,并 且其它正在执行的指令使用的目的寄存器与 本指令的不同,记分牌就向功能部件流出本 指令,并修改记分牌内部的数据记录。 解决了指令间存在的结构相关或写后写相关。

  42. (2) 读操作数(Read Operand,记为RO)。 记分牌需要监测源操作数寄存器中数据的 有效性,如果前面已流出的还在运行的指令不 对本指令的源操作数寄存器进行写操作,或者 一个正在工作的功能部件已经完成了对这个寄 存器的写操作,那么此操作数有效。当操作数 有效后,记分牌将启动本指令的功能部件读操 作数并开始执行。 解决了数据的先写后读(RAW)相关。 通过以上步骤,记分牌动态解决了结构相 和数据相关引发的阻塞,指令可能乱序流出。

  43. (3) 执行(Execution,记为EX)。 (4) 写结果(Write Result,记为WR)。 记分牌知道指令执行完毕后,如果目标 寄存器空闲,就将结果写入到目标寄存器中, 然后释放本指令使用的所有资源。 • 检测先读后写(WAR)相关 • 在出现以下的情况时,就不允许指令写结果: • 前面的某条指令(按顺序流出)还没有读取操作数; • 其中某个源操作数寄存器与本指令的目的寄存器相同。

  44. 存在一个问题:就是功能部件到寄存器文件的数据总线宽度是有限的,当流水线中进入读操作数段(RO)和写结果段(WB)的功能部件总数超过可用总线的数目,这会导致结构阻塞。存在一个问题:就是功能部件到寄存器文件的数据总线宽度是有限的,当流水线中进入读操作数段(RO)和写结果段(WB)的功能部件总数超过可用总线的数目,这会导致结构阻塞。 3. 记分牌需要纪录的信息分为三部分: (1) 指令状态表 记录正在执行的各条指令已经进入记 分牌DLX流水线四段中的哪一段。

  45. (2)功能部件状态表 纪录各个功能部件的状态。每个功能部件 在状态表中都由以下九个域来纪录: Busy: 指示功能部件是否在工作 Op: 功能部件当前执行的操作 Fi: 目的寄存器编号 Fj,fk:源寄存器编号 Qj,Qk:向Rj,Rk中写结果的功能部件 Rj,Rk:表示Fj,Fk是否就绪, 是否已经被使用

  46. (3) 结果寄存器状态表 每个寄存器在表中有一个域,用于纪录写 入本寄存器的功能部件(编号)。如果当前正 在运行的功能部件没有需要写入本寄存器的, 则相应域置为空。 4. DLX记分牌所要维护的数据结构 给出下列代码运行过程中记分牌保存的信息.

  47. LD F6 , 34(R2) LD F2 , 45(R3) MULTD F0 , F2 , F4 SUBD F8 , F6 , F2 DIVD F10 , F0 , F6 ADDD F6 , F8 , F2

  48. 图4.2 DLX记分牌信息组成和记录的信息 指令状态表 IS RO EX WR 指令 LD F6 , 34(R2) √ √ √ √ LD F2 , 45(R3) √ √ √ MULTD F0 , F2 , F4 √ SUBD F8 , F6 , F2 √ DIVD F10 , F0 , F6 √ ADDD F6 , F8 , F2

  49. 结果寄存器状态表 F0 F2 F4 F6 F8 F10 … F30 部件名称 乘法1 整数加法 除法 功能部件状态表 Busy Op Fi Fj Fk Qj Qk Rj Rk 部件名称 整数 yes LD F2 R3 no 乘法1 yes MULTD F0 F2 F4 整数 no yes 乘法2 no 加法 yes SUBD F8 F6 F2整数 yes no 除法 yes DIVD F10 F0 F6 乘法1 no yes

More Related