计算机组成与设计——处理器介绍CPU性能测量参数的基本MIPS,实现面向流水线的指令集设计流水线冒险(Hazzard )结构冒险数据冒险控制冒险
处理器介绍CPU性能测量参数主频:主频=时钟频率,指CPU内部晶振频率,常用单位为MHz,反映了CPU的基本工作节奏;时钟周期:时钟周期t=1/f; 主频倒数机器周期:机器周期=m*t; 在一个机器周期中,多个时钟周期指令周期:指令周期=mtn; 执行一个指令所需时间通常是多个机器周期CPI:CPI=m*n; 每条指令的平均时钟周期数http://www.Sina.com/(millioninstructionspersecond ) MIPS=每秒百万指令执行数=1/)/CPI时钟周期)=主频/CPI
表示每秒可执行指令的数量,对于微型计算机,可以用CPU的时钟数和执行各指令所需的时钟周期来测量基本的MIPS的实现
一个MIPS有五个处理步骤。
1 .从命令存储器读取命令(IF )
2 .指令解码(ID )。
3 .执行操作或计算地址(EXE ) )。
4 .从数据存储器访问操作数(MEM )
5 .将结果写回寄存器(WB )
内存访问命令: loadword(lw )和storeword (SW ) )。
算术命令: add,sub,AND,OR and slt
分支指令: brachequal(beq )和jump(j ) j ) )。
MIPS指令集: MIPS指令集是一种RISC降级指令集,具有RISC特征。 首先,因为其中所有的指令位数都是32位,这32位中有6个是编码操作的种类,所以很容易看出最多有2的6次方条指令(0 ~ 63 )的共计64条。 之后的26位根据区分分为I类、r类、j类。 其中所有的寄存器索引都以5为代码。 0 ~ 31中0号很特别,总是0。
IF - ID - EXE - MEM -WB类
IF - ID - EXE - WB类
流水线的概念:流水线是实现多条指令重复执行的技术。 采用流水线技术可以节约大量的时间。 流水线是现代RISC核的重要设计,大大提高了性能。
对一条指令的执行过程,一般分为取指令、译码指令、取操作数、运算、写结果。 前三步由控制器执行,后两步由运算器执行。 传统的做法是,当控制器运行时,控制器休息,而当控制器运行时,控制器休息。 流水线的做法是,控制器完成第一条指令的操作后,立即开始操作第二条指令,同时运算器开始操作第一条指令。 这样就有了流水线系统。 这是二级管线。 流水线是利用空闲的CPU资源,使各个部件在每个时钟周期内工作,在同一个时钟周期内多个指令被激活。 但是,这些指令处于不同的状态,有些是指,有些是解码,有些是执行,但从整体上看,一个或多个指令的完成将大大提高效率。 但是,流水线有两个非常大的问题。 是关联和转移。
面向流水线的指令集设计MIPS的指令集是为了流水线。
对于所有MIPS指令长度相同的MIPS指令格式的MIPS的存储器操作数只出现在访问指令中的Hazzard流水线,下一个指令可能无法在下一个时钟周期中执行,这称为流水线冒险。
有结构风险、数据风险、控制风险三大风险。
结构冒险英语: Structual hazzard
发生原因:
由于缺乏硬件支持,计划命令无法在预期的时钟周期内执行。
解决方法1 :将存储器分为数据存储器(DM )和指令存储器(IM )
解决方法2 :检测到阻塞管线(Stall the pipeline )碰撞时,结果导致了管线泡沫)
数据冒险英语: Data hazzare,又称管道数据冒险。
原因:由于命令未提供所需的数据,命令无法在预期的时钟周期内执行。 一个命令必须等待另一个命令的完成,导致了流水线的暂停。
计算机管线中的数据处于危险状态是因为一条指令依赖于更早的一条仍在管线中的指令。 例如,假设有加法指令,之后减法器就不起作用,在减法指令中使用加法指令之和。
add r1、r2和r3
子R4、r1和r5
在不进行任何干扰的情况下,该数据风险会严重阻碍流水线。 因为减法命令在步骤5之前不能写入其结果。 这意味着在流水线上浪费了三个时钟周期。
MIPS
一种解决数据风险的方法,无需等待命令执行结束才能解决数据风险。 具体来说,是来自内部寄存器而不是操作员的注册
器或存储器中提前去除数据。 转发的图示表示:图中的连接表示从add指令的EX操作输出到sub指令的EX操作输入的转发途径,从而替换掉在sub的第二步从寄存器s0读取的值。只有当目标步骤在时间上晚于源步骤时转发的路径才有效。
图示1:
图示2:
解决办法2:阻塞流水线(Bubble)
转发可以解决的很好,但不是能避免所有流水线阻塞的发生。例如,假设第一条指令不是add而是装载s0 寄存器的内容,由于时间的依赖,所需要的数据只有在前一条指令流水线的第四级完成之后才能生效,这对sub指令的第三级输入太迟了。
所以,当转发失败时,在遇到装载-使用型数据冒险(load-use Data Hazzard)时,流水线不得不阻碍一个步骤,即流水线阻塞来避免载-使用型数据冒险。
装载-使用型数据冒险:一类特殊的数据冒险,指当装载指令要取的数还没取回来时,其他指令就要执行的情况。
英文:Control hazzard,也称为分支冒险(branch hazzard)。
产生原因:因为取到的指令并不是所需要的(或者说指令地址的变化并不是流水线预期的)而导致指令不能在预期的时钟周期内执行的情况。解决办法1:阻塞(Stall)在第一批衣烘干之前按照之按串行的方式操作,并且重复这一过程直到找到正确的洗衣设置为止。
在每一个条件分支上阻塞是避免流水线控制冒险的一种解决办法。
解决办法3:延迟分支:在延迟槽(delay slot)上放一个不影响分支的命令,防止流水线发生阻塞。