1. CPU架构中流水线的概念?
CPU流水线(pipelining)是一种将指令分解为多步,并让不同指令的各步操作重叠,从而实现几条指令并行处理,以加速程序运行过程的技术。指令的每步有各自独立的电路来处理,每完成一步,就进到下一步,而前一步则处理后续指令。
采用流水线技术后,并没有加速单条指令的执行,每条指令的操作步骤一个也不能少,只是多条指令的不同操作步骤同时执行,因而从总体上看加快了指令流速度,缩短了程序执行时间。
例如:一条指令的生命周期可以分为五个阶段:读取、解码、执行、访问内存和回写。这允许CPU并行处理多个指令。
2. 什么是流水线冲突(pipeline hazard)?在CPU的pipeline设计中有哪些不同类型的hazard?
Pipeline hazard是指由于某种原因程序中的下一条指令不能执行的情况。在pipeline中发生hazard有3种类型:
- Structural Hazards(结构冲突):这些冲突是由于资源冲突导致无法重叠执行而产生的。例如:如果设计有一个浮点执行单元,如果每次执行需要2个时钟周期,那么程序中背靠背的浮点指令将导致结构冲突。另一种可能发生结构冲突的资源是memory/cache访问。
- Data Hazards(数据冲突):当一条指令以pipeline重叠执行的方式依赖于前一个指令的结果时,就有数据冲突了。有三种类型:
- 写后读(RAW):如果一条指令需要一个由前一条写指令写入的源,则会发生这种情况;
- 写后写(WAW):如果一条指令写入的寄存器也被前一条指令写入,就会发生这种情况;
- 读后写(WAR):如果一条指令写入一个寄存器,该寄存器是前一条读指令的源,则会发还是呢个这种情况;
- Control Hazards(控制冲突):这些冲突是由于分支和跳转指令改变了程序执行的顺序而产生的。
3. 怎么避免pipeline中的三种hazard(结构、数据、控制)呢?
以下是用于避免每种pipeline hazard的一些技术:
- 结构冲突:a) 复制资源以实现并行执行,分离指令和数据cache,为整数和浮点操作提供多个计算单元,分离load和store单元等。
- 数据冲突:a) 乱序执行,当依赖指令被堵塞时,其它不依赖指令可以提前执行;b) 数据转发,对于RAW冲突,一条指令的写入可以提前转发到下一条相关指令,以消除冲突。
- 控制冲突:a) 使用分支预测算法对分支结果进行预测,以便在分支之后获取正确的指令集。
4. 一条指令有哪些类型的寻址模式?
以下是一些最常用的执行寻址模式(尽管某些架构也可能支持其它几种模式):
- 立即数模式:在这种模式下,操作数作为常量是指令本身的一部分,例如,add r0 r1 0x12 (将常量0x12和r1相加,并将结果放到r0)
- 直接寻址模式:在这种模式下,操作数的地址直接在指令中指定。例如,load r0 0x10000 (从地址0x10000处读取数据到r0寄存器)
- 寄存器寻址模式:在这种模式下,操作数被放在寄存器中,寄存器名是指令中直接指定的一部分。例如:mul r0, r1, r2 (r1和r2的内容相乘,并将结果放在r0)
- 基址寻址模式:在这种模式下,将索引寄存器的内容加上偏移量(偏移量是指令的一部分)以获得有效地址。例如,load r0 r1 offset (这里r1包含基址,”r1+偏移量”将给出一个内存位置的地址,从这个内存位置读取数据并将其存储到r0)
5. 程序访问的时间和空间局部性原理是什么?
程序访问的局部性原理包括时间局部性(Temporal Locality)和空间局部性(Spatial Locality)。
- 空间局部性:在最近的未来要用到的信息(指令和数据),很可能与现在正在使用的信息在存储空间上是邻近的;
- 时间局部性:在最近的未来要用到的信息,很可能是现在正在使用的信息;
高速缓冲技术是利用程序访问的局部性原理,把程序中正在使用的部分存放在一个高速的、容量较小的Cache中,使CPU的访存操作大多数针对Cache进行,从而大大提高程序的执行速度
6. 假如1个CPU的pipeline有10级,每一级(stage)都需要需要消耗1ns,且没有任何hazard,每条指令都会经过pipeline的每一级,那么这个CPU处理100条指令所需要的时间是多少?
pipeline的每级需要1ns时间,由于有10级,那么第一条指令需要10*1ns才能从pipeline上出来,这时候pipeline将是满的,剩余的99条指令的每条只占用1ns。因此总耗时为:(10+99)ns = 109ns。