计算机体系结构

您所在的位置:网站首页 动态调度技术的特点有哪些 计算机体系结构

计算机体系结构

2024-07-17 21:44| 来源: 网络整理| 查看: 265

ILP instruction-level parallelism 5.1 指令级并行概念 5.1.1 指令级并行

指令级并行(ILP)指通过通过流水线等技术实现多条指令同时并行执行的并行技术

实现ILP主要的方法有:

依靠硬件动态发现和开发并行依靠软件在编译时静态发现并行 5.1.2 指令间相关性

指令间的相关性限制了指令级的并行度,相关性主要分为(真)数据相关、名称相关和控制相关

(1)数据相关

指令i位于指令j的前面,下面两种情况下称指令j数据相关于指令i:

指令i生成的结果可能会被指令j用到指令j数据相关于指令k,而指令k数据相关于指令j

数据相关在一定程度上限制了ILP,最常用客服相关性的方法是在不改变相关性的条件下通过指令调度消除数据冒险

(2)名称相关

当两条指令使用相同寄存器和存储器位置(称为名称),但与该名称相关的指令之间并没有数据流动,此时存在名称相关

主要分为以下两种情况(指令i位于指令j的前面):

反相关:指令j对指令i读取的寄存器和存储器位置进行写操作时,发生反相关(由此可能引发RAW冲突)输出相关:指令i和指令j对相同寄存器和存储器位置进行写操作时,发生输出相关(由此可能引发WAW冲突)

名称相关并不是真正的数据相关,通过寄存器重命名技术来消除名称相关

(3)数据冒险

数据冒险是指指令间存在相关性并且这两条指令相聚非常接近,足以使执行期间的重叠改变相关操作数的访问顺序,数据冒险分成三类:

RAW写后读:j在i还没写入时就读取同一位置,会读取旧值WAW写后写:j在i还没写入时就写入同一位置,会被i写入覆盖(存在于i指令执行时间较长,如浮点运算或乘法指令)WAR读后写:j在i还没读入时就写入同一位置,i错误读取新值(一般先读后写的指令集不会出现,可能情况是j提前写而i在流水线后期才读的情况)

(4)控制相关

控制相关是指分支指令限定了指令i相对于其的执行顺序,和分支条件相关的指令必须先于分支指令执行,受控于分支指令的指令必须在分支指令后执行,不受控于分支指令的指令必须在分支指令前执行

相关与冲突的区别和联系:

相关包括数据相关,名称相关和控制相关

冲突包括结构冲突,数据冲突,控制冲突

其中: 

结构冲突是由硬件资源冲突造成的

数据冲突是由数据相关和名称相关造成的

控制冲突是由控制相关造成的

 

相关是程序的固有属性,它反映了程序汇中指令之间的相互依赖关系

冲突是流水线的属性,存在相关不一定会引起冲突

 

因此,开发指令级并行可以从两方面考虑:

保持相关但避免冲突的发生(如指令调度)进行代码变换直接消除相关性

 

5.2 软件方法的指令级并行——基本块内的指令级并行

基本块是指一段顺序执行的代码,除了入口处没有其他转入分支,除了出口处没有其他转出分支

考虑一下C语言代码:

for (i = 1; i DADDI R1,R1,#-8 R1作为地址下标 BNEZ R1,Loop # R1 != 0

遵循以下指令延迟规定:

这里写图片描述

那么可以直接分析基本块汇编程序的指令周期延迟(共9个周期):

1Loop: LD F0,0(R1) 2 3 ADDD F4,F0,F2 4 #由上表可知加操作需要两个停顿周期 5 6 SD 0(R1),F4 7 DADDI R1,R1,#-8 8 9 BNEZ R1,Loop 5.2.1 静态调度

静态调度是指通过改变指令顺序而不改变指令间数据相关来改善指令延迟,把上述R1的递减改到前面并利用延迟槽技术(设置延迟槽为1)可以让上述基本快代码压缩到6个周期完成:

1Loop: LD F0,0(R1) 2 DADDI R1,R1,#-8 3 ADDD F4,F0,F2 4 5 BNEZ R1,Loop 6 SD 8(R1),F4

说明:

DADDI让R1递减提前,那么SD中存储位置是R1+8而不是R1延迟槽是无论分支是否成功都要执行的指令 5.2.2 循环展开

静态调度能够大幅提升基本快执行效率(50%),但是还有一个周期的停顿不能消除,那么由此引入另一种块内消除延迟方法——循环展开

循环展开是将循环中多个基本块展开成一个基本块从而填充stall间隙的方法

将上段基本块做4段展开,并做调度:

1Loop: LD F0,0(R1) 2 LD F6,-8(R1) 3 LD F10,-16(R1) 4 LD F14,-24(R1) 5 ADDD F4,F0,F2 6 ADDD F8,F6,F2 7 ADDD F12,F10,F2 8 ADDD F16,F14,F2 9 SD 0(R1),F4 10 SD -8(R1),F8 11 DADDI R1,R1,#-32 12 SD 16(R1),F12 13 BNEZ R1,Loop 14 SD 8(R1),F16

平均每个次循环仅需要14/4=3.5个cycle,性能大幅增加!

5.2.3 编译器角度来看代码调度

上述最优循环展开代码调度是我们手工完成的,能够完成高效的调度是因为我们知道R1代表枚举变量,并知道R1-32前的-16(R1)和16(R1)指向的同一内存区域,但编译器确定对存储器引用却不是那么容易,如其无法确定:

同一次循环中,100(R4)和20(R6)是否相等不同次循环中,100(R4)和100(R4)是否相等 5.2.4 循环间相关

上面举例不同次循环间是不相关的,但如果出现下述情况:

for (i = 1; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3