|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
- G, l1 e$ A& u8 w) z2 e# F引言
; B2 x& W" S+ b
- M: m; W% M/ H) oIt is quite a three-pipe problem.
+ m+ X# N! @& Y: C# }" @ Q4 ]; \-- Sir Arthur Conan Doyle
\& y- m4 F& t3 B: X) ?$ I0 v _# h: |
所以就分三部分说吧。5 V: [& l0 Y- i" l/ x7 k3 |
8 R3 G3 O" ?* L+ C- Q/ y0 _# r虽然,指令级并行(ILP)的潜能已经开发殆尽(intel已经在2004年宣布,停止高性能单处理器的研发),流水线技术也已经很成熟了,但是了解流水线,是学习和了解计算机体系结构绕不开的内容。本小节就从三个方面说一下流水线。
( G3 l2 G9 }5 x; S0 d% ?
8 E. w, y" ]# s2 b1 J5 T& g6 j7 D8 Z/ K/ D2 h o- a* E" a1 B
5.1 什么是流水线
# b4 D+ o) j! m5 B+ f
$ r" U& e1 \8 c+ r4 L6 pPipelining is an implementation technique whereby multiple instructions are overlapped in execution; it takes advantage of parallelism that exists among the actions needed to execute an instruction.. a3 r& x/ \ j7 Z
+ ~6 T: `! A G" H" A& \$ ^流水线是利用执行指令所需的操作之间的并行性,实现多条指令并行执行的一种技术。# x' N. \6 Z; @6 O; F' l* u9 m2 @
) X) v# O" F2 T4 T7 N) n0 Y5 b
其实,流水线本身,跟计算机没关系。最早流水线是福特发明的,那时福特汽车公司生产效率很低,正是福特本人引进流水线,是生产效率大增。其原理就是把生产一辆完整的汽车分成若干工序,然后从第一个零件开始,依次流过整个流水线,然后一辆完整的汽车就被生产出来了。如果你在生产工厂呆过的话,理解流水线就很容易了。我想,工厂里的生产线,应该就是所谓的流水线。/ S d9 \6 k# D+ j! L* ^0 I
/ k1 S# k( V. d特殊的,对于计算机体系结构来说,原理和汽车流水线一样,将一条指令的完成分成若干部分(流水节拍或流水段),然后指令依次流过这些流水段,就完成了这条指令。对于经典的5级流水线,如下:
& W2 X) f {/ O# t6 V# ~
5 ^& J& Y( q) |+ U1 P3 F# n; g1,IF(指令取得)
$ X9 K6 r6 B3 n$ L; f- }
g3 A/ _( m6 a. h1 ~2 e, T) F需要完成的工作:7 a" E3 N7 I/ L" t2 M8 B4 W8 ?
. W7 s6 J5 @1 ^& xSend the program counter (PC) to memory and fetch the current instruction from memory. Update the PC to the next sequential PC by adding 4 (since each instruction is 4 bytes) to the PC.
6 q: s3 z, t+ R- B# T. @1 h) o, n
) W2 s, p' W. V) k根据PC(程序计数器)指示的地址,从存储器中取指令,并装入到IR(指令寄存器),同时PC+4。当然假设每条指令占4个字节。
' t) W; C: w4 u. u+ Z r* l# h0 U! f3 V# B0 s
2,ID(指令译码)
( B4 g. `+ E+ J6 F5 \4 G0 `
9 ?; h/ T9 M# E z" _0 L/ |# g# U需要完成的工作:
* y& b U0 C5 v/ T6 E3 L) F; f* n9 m, V/ ?; J5 U& `+ s$ n
Decode the instruction and read the registers corresponding to register source specifiers from the register file。
0 z% ~: s R4 X/ y: d7 L [/ P/ k0 {4 c4 ]8 a, v2 l
对指令进行译码,并且访问寄存器堆读出相应寄存器的内容。. N) g6 ^9 H3 |# x8 n' e
7 z+ ~1 {/ x6 R% l. v( S
3,EX(执行)8 u; {! @3 y3 l: c1 x2 P) D) ^ v
: B! b3 g; m( R: n
需要完成的工作:8 _4 B3 O Q$ W
. z2 C5 R1 q6 C) U
The ALU operates on the operands prepared in the prior cycle, peRForming one of three functions depending on the instruction type.
0 _3 y% s1 f% `# @3 W/ z3 Q( I
& a4 ^+ I' P: ?- M: jMemory reference
/ y0 z$ ?. l+ H& W1 Q# \
; z/ K, ?% G$ u- MRegister-Register ALU instruction7 D' K+ ]7 X, k8 r, \
+ I9 v, p X" l, CRegister-Immediate ALU instruction
' S. ^8 B2 ]9 |$ \8 I
8 v- ]7 L( P6 {( i0 f$ _ALU对上一个周期准备好的操作数进行运算,根据指令类型执行下面三种操作之一。
" ] L) N0 W( G- T2 V, S2 N6 j# {8 y3 t! z; @- z9 S# x7 ^. K$ h9 I. B: Q
访问存储器
( ]0 p7 z0 Q6 g7 R( O+ S) {( s
: ~! o' J# U2 ]% }. Y寄存器-寄存器ALU指令 ~/ j; {3 @5 _0 n
+ \9 r1 Z) u) _* Q
寄存器-立即数ALU指令! I. e4 Z4 X( I+ N$ ?
6 H, {5 T6 x0 {4,MEM(访问存储器)
- m, @) o8 |' C; Z+ q
; p/ D9 |+ Z0 |0 n6 M需要完成的工作:
: r8 @! K2 t" H. }0 C0 j$ j& ?/ r2 E6 f% \3 a
If the instruction is a load, memory does a read using the effective address computed in the previous cycle. If it is a store, then the memory writes the data from the second register read from the register file using the effective address.9 L5 r6 Z- ^6 V; W
0 b" U, ]$ M/ W' hLOAD:从存储器中读取数据。STOR:把寄存器内容写到存储器。
* a* V* C/ @3 i5 n' _. S2 D
/ x$ V0 B$ Q! t5,WB(写回)' H- g5 l. F, W4 E% b! m) C& T; b
+ a% e% i& U( Y! S5 L/ D
需要完成的工作:
2 Z& k' c. j1 q# c h4 O
H3 N6 P! ~' J寄存器-寄存器ALU指令,LOAD指令会经过这个流水段。
! v/ g. Y! K+ I' l3 |. I9 w' Y
# Y4 S8 Z0 ?9 xWrite the result into the register file, whether it comes from the memory system (for a load) or from the ALU (for an ALU instruction).* u: @" m9 ~. s4 g" U+ x
, x- T! C' c5 t, L将结果(来自LOAD指令或来自ALU)写入寄存器堆。2 _7 S# y) w5 g M; l, h
+ a$ X1 x& b# H' _* B7 U% B6 ]% X
* m! A/ T' L" H4 A0 c; o3 o H! q9 R
6 |6 m. y; |9 R
9 O7 k7 B+ H z6 c& M
) O" d0 H) K, R+ N5.2流水线带来的影响
m2 Y9 d. H! H" I; p! j
+ G8 z$ t1 g; B9 ]$ |3 N3 G* F2 r引进流水线,肯定是有好处的,会提高效率,这个先不说,天下没有完美的事,有好处就有坏处,就是会引进一些问题。哪些问题呢?如下:" Q5 t/ l, j. x
1 k1 e) t1 m* j' W d1,Pipeline Hazards(流水线遇险)" h. B3 h" c$ V7 P8 X# k8 p
2 t/ _. y; A4 A+ w6 R( Q& K1 O1》Structural hazards(结构遇险)就是硬件资源不够用或者硬件资源使用冲突。1 W* B) j' w% x2 \# [2 ?! ]
9 `# @3 w W- U! l5 r9 s$ J5 _
2》Data hazards(数据遇险)就是指令间有数据依赖关系造成的问题。( C0 ?8 t2 k, V. [, o+ ~
# y' ?" W: x8 p. k2 u3》Control hazards(控制遇险)转移指令或修改PC造成的遇险。
' v; L. Y# m* E, y* U2 Q9 _/ }! T Y
* n g& o2 R J9 Y( H1 Q2,Dealing with Exceptions(处理异常)' U! }( u* O. }0 k8 U0 `" s0 R& E9 e
7 i, g! T; i1 |% u: z1》I/O中断
$ n% A+ r1 _9 i5 W; P+ s# U i
- X3 e1 Z( Q! m2》系统调用
8 s/ q& M% \+ t
. J/ v* E- V ~ G7 _+ e3》执行跟踪指令
: G4 C4 u1 `7 y6 e8 l
9 q$ C6 F( P ^% S4 L# A4》断点
0 s3 v- R8 k M7 `+ `. y% u8 y+ N; U" }8 U
5》定点运算溢出
$ r1 ]* f# I! K* U4 C* d2 b' `6 V/ t! J' s
6》浮点运算异常
+ n: A, N/ \/ Q A. D9 f9 e
6 i* Q5 [, G, B+ ?1 W& J* r7》页面异常: K6 }: k2 ]" k( j6 A
0 ~! e! ]# c6 L/ o# D8》访问存储器时使用错误地址
# w( @5 Q% M4 H2 X7 j" Q" `/ j$ m# h: ~5 d8 J' ?0 r. y5 b; F7 Q
9》存储保护违例4 b0 P# s& m" v. e D& `8 E
9 h4 v: s/ T) e F6 C10》硬件故障7 P; f6 Z" D5 m! W9 Q
8 Q" g7 G. z; t! _8 c. X$ L# e
11》断电
7 K; W6 z2 E7 p4 g; S, E( u( M3 Y. R6 x" \+ l$ y2 h2 [
3,Instruction Set Complications(指令集本身的复杂性)
2 _7 U. a, t, U6 D z) [ g& E+ a( ?# `2 A
有些体系结构的指令集用流水线实现起来就比较复杂。
- k8 f* r0 q+ D' E# B
7 D% p" `3 J: V* k. U. `- a" O
+ U4 P& Y3 ]* ^/ }) [这些问题,可以仔细看一下上面的两张图,好好想一下就能推断会出现这些问题,这一点很重要。
- x j3 G+ m% j8 L) m) u
# Y: A2 q8 D( I! n# P& I, e M- ^4 G3 O6 j# P
5.3 解决技术7 D. ~& |, S7 J2 x
. k/ q. e. ~) p* }先说一个式子:
6 H% t/ Z/ w, Q( `$ O9 @0 {" J* c5 M3 m8 j" d( P9 J. l: @
Pipeline CPI = Ideal pipeline CPI + Structural stalls + Data hazard stalls + Control stalls1 @0 _) i( @( \; @5 S7 {# t$ s/ t
0 o* _, Z6 J! y+ U+ {这些技术无外乎就是想方设法减小右边的4项内容其中的一项或几项。
% x. X( R, E P% @; Y& G/ L0 c& B4 O( A/ e& u
6 T2 S" F5 O! E) R3 ^% a8 f4 U- c
) f0 R9 J" `6 n1 F. F7 c7 W/ ^# p( M1 _6 N/ o- T3 p
5.4小结
" j2 [9 k+ y& S& P9 U0 e% S, M# p
4 I! i2 } \' ]流水线,在各行各业都有体现,想像一下,大学食堂,如果把卖豆浆,油条,咸菜,粥,米饭,馒头,。。。这些窗口都合成一个窗口,会是什么景象。+ x2 @+ _! K- i. l; X/ s, t; y
4 m4 Y0 W" X( m3 g: @9 w) ?这就是流水线的魅力。) n& g+ v; Z$ ]8 P( H( _ ]6 \
) W8 O0 t5 F' y" g" I
|
|