分类: LINUX
2010-11-11 10:02:30
一.流水线
1. 概念:
处理器按照一系列步骤来执行每一条指令.典型的步骤如下:
1) 从存储器读取指令(fetch).
2) 译码以鉴别它是那一类指令(dec).
3) 从寄存器堆取得所需的操作数(reg).
4) 将操作数进行组合以得到结果或存储器地址(ALU).
5) 如果需要,则访问存储器以存取数据(mem).
6) 将结果写回到寄存器堆(res).
并不是所有的指令都需要每一个步骤,但是,多数指令需要其中的多数步骤.这些步骤往往使用不同的硬件功能,例如,ALU可能只在第四步中用到.因此,如果一条指令不是在前一条结束之前就开始,那么在每一个步骤内处理器只有少部分的硬体被使用.
有一个明显的方法可以改善硬件资源的使用率和处理器的吞吐量,这就是在当前指令结束之前就开始执行下一条指令.该技术被称为流水线,是在通用处理器中采用并行算法且非常有效的途径.
2. 流水线中的冒险
要点:后一条指令要用到前一条指令。
在典型的计算机程序中经常会遇到这样的情形,即一条指令的结果被用做下一条指令的操作数.当这种情形发生时,图1.13所示的流水线操作就中断了,因为第一条指令的结果在第二条指令取操作数时还没有产生.第二条指令必须停止,直到结果产生为止.这是流水线的行为如图1.14所示.这是流水线的”写后读”冒险(hazard).
但是要注意,由于条件转移与前一条指令的条件码结果有关,在这个流水线中还会有条件转移的冒险.
一些RISC体系结构(尽管不是ARM)规定,不管是否进行了转移,转移之后的指令都要执行.这个技术称为延迟转移.
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、RISC的优点.
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
...