必考的

流水线

  • 流水线无法减少每个任务的延迟。
  • 流水线中多个任务同时执行,可以提高整个工作的吞吐率。
  • 流水线的速率受限于速度最慢的一级。木桶效应,小子

加速比

流水线的加速比:采用流水线方式执行之后,吞吐量提高的比例。

流水线的最大加速比:最大加速比=流水线级数(最好情况下)

  • 流水线各级延时不均衡会降低加速比。
  • 进/出流水线的延时降低了加速比。任务数足够多时,可以忽略进/出流水线延时对加速比的影响。

ARM7的三级流水线

ARM使用三级流水线

  • 取指:从存储器中获取指令代码到指令流水线。

  • 译码:指令译码,通过控制信号操作数据通路准备执行。

  • 执行:指令获得数据通路“使用权”:读寄存器, 移位操作, ALU运算和写回。

每一级的结果存储在寄存器中。

练习1

答案
  1. D
  2. B
  3. C

流水线停顿

流水线停顿有两种:

  • 数据停顿(Data stall)
  • 控制停顿(Control stall)

数据停顿

  • 如果流水线的某一级无法在一个时钟周期内完成,将会导致流水线停顿
  • 例如:多寄存加载指令(LDMIA)在指令执行过程中引入数据停顿(Data stall)
LDMIA导致流水线停顿,因为r2和r3没有完全load完毕

控制停顿

  • 分支指令在流水线中产生控制停顿(Control stall),带来的延时通常被称为分支损失(Branch penalty)
  • 例如:分支指令BNE是否执行,要在第三个时钟周期才能确定,因此浪费了两个时钟周期。
bne指令需要等待比较才能执行

不同循环的性能差别

Do-Until

; loop initiation code
MOV r0, #0 ; use r0 for i, set to 0
MOV r8, #0 ; use a separate index for arrays
ADR r2, N ; get address for N
LDR r1, [r2]; get value of N for loop termination test
MOV r2, #0 ; use r2 for f, set to 0
ADR r3, c ; load r3 with address of base of c array
ADR r5, x ; load r5 with address of base of x array

; loop body
loop
LDR r4, [r3, r8] ; get value of c[i]
LDR r6, [r5, r8] ; get value of x[i]
MUL r7, r4, r6 ; compute c[i]*x[i]
ADD r2, r2, r7 ; add into running sum

; update loop counter and array index
ADD r8, r8, #4 ; add one to array index
ADD r0, r0, #1 ; add 1 to i

; test for exit
CMP r0, r1
BLT loop

; if i < N, continue loop
loopend ...
FIR滤波器在Do-Until下的性能

While-Do

; loop initiation code
MOV r0, #0 ; use r0 for i, set to 0
MOV r8, #0 ; use a separate index for arrays
ADR r2, N; get address for N
LDR r1, [r2] ; get value of N for loop termination test
MOV r2, #0 ; use r2 for f, set to 0
ADR r3, c ; load r3 with address of base of c array
ADR r5, x ; load r5 with address of base of x array

; test for exit
loop
CMP r0, r1
BGE loopend ; if i >= N, exit loop

; loop body
LDR r4, [r3, r8] ; get value of c[i]
LDR r6, [r5, r8] ; get value of x[i]
MUL r7, r4, r6 ; compute c[i]*x[i]
ADD r2, r2, r7 ; add into running sum

; update loop counter and array index
ADD r8, r8, #4 ; add one to array index
ADD r0, r0, #1 ; add 1 to i
B loop

loopend ...
FIR滤波器在While-Do下的性能

对于Do-Until来说,继续循环是最坏情况,退出循环是最好情况,但While-Do正好相反:继续循环是最好情况,退出循环是最坏情况。

这是因为Do-Until的test放在最后执行,而While-Do的test放在上一个周期的下一次(即新周期的第一次)执行。

下一篇会讲高速缓存,最烦的一部分