L.D F6, 0(R2) 12 13 15 16 ADD.D F6, F4, F6 13 17 18 19 S.D F6, 0(R2) 14 20 21 22 DADDIU R1, R1, #8 15 16 17 DADDIU R2, R2, #8 16 17 18 DSUBIU R3,R1,#DONE 17 18 19 BNEZ R3, FOO 18
名称 保留站 Busy Op Vj Vk Qj Qk Dest A Add1 yes ADD.D Regs[F4] Regs[F6 ] Add2 no Add3 no Mult1 yes Mult2 no 项号 ROB Busy 指令 状态 目的 Value 1 yes ADD.D F6, F4, F6 执行 F6 Regs[F4]+Regs[F6] 2 yes S.D F6, 0(R2) 流出 Mem[0+Regs[R2]] #2 字段 浮点寄存器状态 F0 F2 F4 F6 F8 F10 … F30 ROB项编号 1 Busy yes … 5)
整数指令 浮点指令 时钟周期数 L.D F2, 0(R1) 1 L.D F8, 8(R1) 2 L.D F14, 16(R1) MUT.D F4, F2, F0 3 L.D F20, 24(R1) MUT.D F10, F8, F0 4 L.D F6, 0(R2) MUT.D F16, F14, F0 5 L.D F12, 8(R2) MUT.D F22, F20, F0 6 L.D F18, 16(R2) ADD.D F6, F4, F6 7 L.D F24, 24(R2) ADD.D F12, F10, F12 8 DADDIU R1, R1, #32 ADD.D F18, F16, F18 9 S.D F6, 0(R2) ADD.D F24, F22, F24 10 S.D F12, 8(R2) 11 S.D F18,16(R2) 12 S.D F24, 24(R2) 13 DADDIU R2, R2, #32 14 DSUBIU R3, R1, #DONE 15 BNEZ R3, FOO 16 计算一个Y值需要 16/4 = 4 个时钟周期,加速比 = 14/4 = 3.5
21
(
(6)
访存1 L.DF2, 0(R1) L.DF14, 16(R1) L.DF6, 0(R2) L.DF18, 16(R2) 访存2 L.D F8, 8(R1) L.DF20, 24(R1) L.DF12, 8(R2) L.DF24, 24(R2) 浮点指令1 MUT.DF4, F2, F0 MUT.DF16, F14, F0 ADD.DF6, F4, F6 ADD.DF18, F16, F18 MUT.DF22, F20, F0 ADD.DF12, F10, F12 ADD.DF24, F22, F24 DADDIU R2, R2, #32 DSUBIUR3, R1, #DONE BNEZ R3, FOO DADDIU R1, R1, #32 浮点指令2 整数指令 时钟 周期 1 3 MUT.DF10, F8, F0 4 5 S.DF6, -32(R2) S.DF18,-16(R2) 6 7 8 9 10 11 S.DF12, -24(R2) S.DF24, -8(R2)
计算一个Y值需要 11/4 个时钟周期,加速比 = 14/(11/4) = 56/11
4.7 对于两路超标量处理器,从存储器取数据有两拍附加延迟,其它操作均有1拍附加延迟,对于下列代码,请按要求进行指令调度。
LW R4,(R5) LW R7,(R8) DADD R9,R4,R7 LD R10,(R11) DMUL R12,R13,R14 DSUB R2,R3,R1 SW R15,(R2) DMUL R21,R4,R7 SW R23,(R22) SW R21,(R24)
(1) 假设两路功能部件中同时最多只有一路可以是访问存储器的操作,同时也最多只有一路可以是运算操作,指令
顺序不变。
(2) 假设两路功能部件均可以执行任何操作,指令顺序不变。
(3) 假设指令窗口足够大,指令可以乱序(out-of-order)流出,两路功能部件均可以执行任何操作。 解:(1) 第一路 LW LW DADD DMUL DSUB
R9, R4, R7 R12, R13, R14 R2, R3, R1 LD R10, (R11) SW R15, (R2) 22
R4, (R5) R7, (R8) 第二路 DMUL SW R21, R4, R7 SW R23, (R22) R21, (R24) 第一路 第二路 LW R7, (R8) (2) LW DADD DMUL SW SW SW (3)
第一路 LW DSUB SW DADD R4, (R5) R2, R3, R1 R23, (R22) R9, R4, R7 LW DMUL DMUL 第二路 R7, (R8) R12, R13, R14 R21, R4, R7 R9, R4, R7 R12, R13, R14 R15, (R2) R23, (R22) R21, (R24) R4, (R5) LD DSUB DMUL R10, (R11) R2, R3, R1 R21, R4, R7 LD R10, (R11) SW R15, (R2) SW R21, (R24) 4.8 对于例4.5,在相同的条件下,如果展开7遍循环,求: (1) 每遍循环的平均时钟周期; (2) 每个时钟周期流出指令数;
(3) 操作槽(功能部件)的使用效率; (4) 如果展开10遍,会出现哪些问题? 解:展开7遍循环 访存指令1 L.D F0,0(R1) 访存指令2 L.D F6,-8(R1) 浮点指令1 浮点指令2 整数/转移指令 L.D F10,-16(R1) L.D F14,-24(R1) L.D F18,-32(R1) L.D F22,-40(R1) ADD.D F4,F0,F2 L.D F26,-48(R1) ADD.D F8,F6,F2 ADD.D F12,F10,F2 ADD.D F16,F14,F2 ADD.D F20,F18,F2 ADD.D F24,F22,F2 S.D F4,0(R1) S.D F8,-8(R1) ADD.D F28,F26,F2
S.D F12,-16(R1) S.D F16,–24(R1) S.D F20,-32(R1) S.D F24,–40(R1) S.D F28,8(R1) DADDIU R1,R1,# -56 BNE R1,Loop 这段程序的运行时间为9个时钟周期,每遍循环平均约1.28个时钟周期。9个时钟周期内流出了23条指令,每个时钟周期2.55条。9个时钟周期共有操作槽9?5=45个,有效槽的比例为51.1%。
4.9 设指令流水线由取指令、分析指令和执行指令3个部件构成,每个部件经过的时间为△t,连续流入12条指令。分别画出标量流水处理机以及ILP均为4的超标量处理机、超长指令字处理机、超流水处理机的时空图,并分别计算它们相对于标量流水处理机的加速比。
解:标量流水处理机的时空图:
23
执行 分析 取指 14 时间
执行完12条指令需T1=14△t。
超标量流水处理机与超长指令字处理机的时空图:
执行 执行 分析 分析 取指 5 时间 取指 超长指令字处理机时空图 5 时间 超标量处理机时空图
超标量流水处理机中,每一个时钟周期同时启动4条指令。执行完12条指令需T2=5△t,相对于标量流水处理机的加速比为:
T14?tS2?1??2.8
T25?t超长指令字处理机中,每4条指令组成一条长指令,共形成3条长指令。执行完12条指令需T3=5△t,相对于标
量流水处理机的加速比为:
T14?tS3?1??2.8
T35?t超流水处理机的时空图:
执行 分析 取指 4 5 5.75 时间
24
超流水处理机中,每1/4个时钟周期启动一条指令。执行完12条指令需T4=5.75△t,相对于标量流水处理机的加速比为:
T14?tS4?1??2.435
T45.75?t
第5章 存储层次
5.1解释下列术语
多级存储层次:采用不同的技术实现的存储器,处在离CPU不同距离的层次上,各存储器之间一般满足包容关系,即任何一层存储器中的内容都是其下一层(离CPU更远的一层)存储器中内容的子集。目标是达到离CPU最近的存储器的速度,最远的存储器的容量。
全相联映象:主存中的任一块可以被放置到Cache中任意一个地方。
直接映象:主存中的每一块只能被放置到Cache中唯一的一个地方。
组相联映象:主存中的每一块可以放置到Cache中唯一的一组中任何一个地方(Cache分成若干组,每组由若干块构成)。
替换算法:由于主存中的块比Cache中的块多,所以当要从主存中调一个块到Cache中时,会出现该块所映象到的一组(或一个)Cache块已全部被占用的情况。这时,需要被迫腾出其中的某一块,以接纳新调入的块。
LRU:选择最近最少被访问的块作为被替换的块。实际实现都是选择最久没有被访问的块作为被替换的块。
写直达法:在执行写操作时,不仅把信息写入Cache中相应的块,而且也写入下一级存储器中相应的块。
写回法:只把信息写入Cache中相应块,该块只有被替换时,才被写回主存。
按写分配法:写失效时,先把所写单元所在的块调入Cache,然后再进行写入。
不按写分配法:写失效时,直接写入下一级存储器中,而不把相应的块调入Cache。
命中时间:访问Cache命中时所用的时间。
失效率:CPU访存时,在一级存储器中找不到所需信息的概率。
失效开销:CPU向二级存储器发出访问请求到把这个数据调入一级存储器所需的时间。
强制性失效:当第一次访问一个块时,该块不在Cache中,需要从下一级存储器中调入Cache,这就是强制性失效。
容量失效:如果程序在执行时,所需要的块不能全部调入Cache中,则当某些块被替换后又重新被访问,就会产生失效,这种失效就称作容量失效。
冲突失效:在组相联或直接映象Cache中,若太多的块映象到同一组(块)中,则会出现该组中某个块被别的块替换(即使别的组或块有空闲位置),然后又被重新访问的情况。
2:1Cache经验规则:大小为N的直接映象Cache的失效率约等于大小为N /2的两路组相联Cache的实效率。
25