流水线指令及RISC
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一.流水线
1. 概念:
处理器按照一系列步骤来执行每一条指令.典型的步骤如下:
1) 从存储器读取指令(fetch).
2) 译码以鉴别它是那一类指令(dec).
3) 从寄存器堆取得所需的操作数(reg).
4) 将操作数进行组合以得到结果或存储器地址(ALU).
5) 如果需要,则访问存储器以存取数据(mem).
6) 将结果写回到寄存器堆(res).
并不是所有的指令都需要每一个步骤,但是,多数指令需要其中的多数步骤.这些步
骤往往使用不同的硬件功能,例如,ALU 可能只在第四步中用到.因此,如果一条指令不是在前一条结束之前就开始,那么在每一个步骤内处理器只有少部分的硬体被使用. 有一个明显的方法可以改善硬件资源的使用率和处理器的吞吐量,这就是在当前指
令结束之前就开始执行下一条指令.该技术被称为流水线,是在通用处理器中采用并行算法且非常有效的途径.
采用上述操作顺序,处理器可以这样来组织:当一条指令刚刚执行完步骤1并转向步
骤2时,下一条指令就开始执行步骤1.图1.13说明了这个过程.从原理上来说,这样的流水线应该比没有重叠的指令执行快6倍,但实际上事情并没有这么好,下面我们将会看到原因.
1
2
3 指令
时间
图1.13 流水线的指令执行
2. 流水线中的冒险
要点:后一条指令要用到前一条指令。
在典型的计算机程序中经常会遇到这样的情形,即一条指令的结果被用做下一条指令的操作数.当这种情形发生时,图1.13所示的流水线操作就中断了,因为第一条指令的结果在第二条指令取操作数时还没有产生.第二条指令必须停止,直到结果产生为止.这是流水线的行为如图1.14所示.这是流水线的”写后读”冒险(hazard).
1.
2.
图 1.14 先写后读的流水线冒险
转移指令更会破坏流水线的行为,因为后续指令的取指步骤受到转移目标计算的影响,因而必须推迟.不幸的是,当转移指令正在被译码时,在它被确认为是转移指令
之前,后续的取指操作就发生了.这样一来,读取到的指令就不得不丢弃.如果转移目标计算是在图1.13中流水线的ALU阶段完成的,那么,在得到转移目标之前已经有3条指令按照原有的指令流读取(见图 1.15).如果有可能,最好早一些计算转移目标,尽管这可能需要专门的硬件.如果转移指令具有固定的格式,那么可以(也就是说在确认该指令是转移指令之前)在dec阶段预测计算转移目标,从而将转移的执行时间减少到单个周期.
但是要注意,由于条件转移与前一条指令的条件码结果有关,在这个流水线中还会有条件转移的冒险.
一些RISC体系结构(尽管不是ARM)规定,不管是否进行了转移,转移之后的指令都要执行.这个技术称为延迟转移.
1 (转移)
2
3
4
5(转移目标)
指令时间
图1.15 流水线的转移行为
3.流水线效率
尽管有些技术可以减少这些流水线问题的影响,但是,不能完全消除这些困难.流水线越深(就是流水线的级数越多),问题就说严重.对于相对简单的处理器,使用3~5
即流水线效果会更好.但是,超过了这个级数,收益递减的法则开始生效,增加的成本
和复杂度将超过收益.
例:ARM7 3级流水线ARM9 是5级ARM10是6-7级StrongArm是5级显然,只有当所有指令都依相似的步骤执行时,流水线才能带来好处.如果处理器的指令非常复杂,每一条指令的行为都与下一条指令不同,那么就很难用流水线实
现.1980年,因为有限的硅资源,有限的设计资源,以及设计一个复杂指令集的流水线
的高度复杂性,当时的复杂指令集微处理器没有采用流水线.
二.精简指令计算机
1.RISC体系结构
1)固定的(32位)指令长度,指令类型很少.而CISC处理器指令集的长度一般可变,
指令类型也很多.
2)Load-Store结构,数据处理指令访问寄存器,与访问存储器的指令是分开的.而
CISC处理器一般允许将存储器中的数据作为数据处理指令的操作数.
3)由32个32位寄存器构成大的寄存器堆(register bank),其中所有的寄存器都可以
用于任何用途,以使Load-Store结构有效的工作.虽然CISC寄存器集也加大了,
但是没有那么大,而且大都是不同的寄存器用于不同的用途(例如,Motorola公司
MC68000的数据寄存器和地址寄存器).
这些差别极大的简化了处理器的设计,使设计者在实现体系结构时可以采用以下这些对提高原型机性能由很大作用的,组织方面的特点.
2、RISC的组织
@流水线执行.而CISC处理器即使有,也只允许在连续指令间有极少的重叠(尽管它
们现在允许).
@单周期执行.而CISC处理执行1条指令一般需要多个时钟周期.
3、R ISC的优点.
4)管芯面积小.
简单的处理器需要的晶体管少,需要的硅片面积也小.因此,整个CPU在工艺技
术发展的较早阶段即可在一个芯片内.一旦技术发展超过这一阶段,RISC CPU
就能剩下更多的面积用于实现可以提高性能的功能部件,例如高速缓存,存储器
管理和浮点硬件等等.
5)开发时间短
简单的处理器会占用较少的设计力量,因而设计费用低.它还会更好地投放市场
时的工艺技术相适应(因为开发周期越短,越容易在开发时预测工艺技术的发
展).
6)性能高.
这个优点比较微妙.前面两条优点容易接受,但看看我们周围,高性能总要通过不
断增加复杂度来实现,说RISC有高性能的优点有些使人难以接受.
可以来这样看这个问题:较小的东西具有较高的自然频率(昆虫煽动翅膀的频率
高于小鸟,小鸟山东翅膀的频率高于大鸟等等),所以,简单的处理器应该容许较
高的时钟频率.让我们来设计一个复杂的处理器,但开始时先设计一个简单的,然
后每次增加一条复杂的指令,都会使某些高级的功能更有效率,但是,它也会降低
所有指令所用的时钟频率.我们可以度量对于典型程序总的得失.当我们这样做
的时候,会发现所有复杂的指令都使程序执行变慢了.因此,我们坚持最初的简单
处理器.
使用 3 阶段流水线的例子。
第一阶段持有从内存中取回的指令。第二阶段开始解码,而第三阶段实际执行它。故此,程序计数器总是超出当前执行的指令两个指令。(在为分支指令计算偏移量时必须计算在内)。
因为有这个流水线,在分支时丢失 2 个指令周期(因为要重新添满流水线)。所以最好利用条件执行指令来避免浪费周期。例如:
...
CMP R0,#0
BEQ over
MOV R1,#1
MOV R2,#2
over
...
可以写为更有效的:
...
CMP R0,#0
MOVNE R1,#1
MOVNE R2,#2
...