|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
4 ?' T: K" N. e) n, {3 A引言
: ]& t+ K* H, C) F9 y7 X
" a, n1 e! a! N7 V- j4 zIt is quite a three-pipe problem.
$ I9 [' T4 w% G: F/ t6 n, x5 K2 x3 U-- Sir Arthur Conan Doyle
0 X7 \) H# j* P; ]0 Y; S0 i7 H
: E% \( E+ b5 Y1 D% J. M所以就分三部分说吧。/ V2 s- \* o) p- [) V4 F. f$ C
+ v* e; U& u G* G$ w# E& e- s虽然,指令级并行(ILP)的潜能已经开发殆尽(intel已经在2004年宣布,停止高性能单处理器的研发),流水线技术也已经很成熟了,但是了解流水线,是学习和了解计算机体系结构绕不开的内容。本小节就从三个方面说一下流水线。% @+ [6 B( y8 G2 T& H- y
) D' I# _ f9 v
2 z& Y* ^6 e. B, n4 q8 k
5.1 什么是流水线7 t; u* Q9 F( I* A9 k$ U4 m6 M$ H! Y
+ y. r: p! ]' C$ w, Y8 E0 YPipelining 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.
_& [ O( K; d# c; B( A: O7 o
0 ^& @3 o$ }- h$ A1 Z8 L流水线是利用执行指令所需的操作之间的并行性,实现多条指令并行执行的一种技术。 k. D( _9 `$ V1 y0 \( _6 _0 \
2 Z! `; [& l' r' E其实,流水线本身,跟计算机没关系。最早流水线是福特发明的,那时福特汽车公司生产效率很低,正是福特本人引进流水线,是生产效率大增。其原理就是把生产一辆完整的汽车分成若干工序,然后从第一个零件开始,依次流过整个流水线,然后一辆完整的汽车就被生产出来了。如果你在生产工厂呆过的话,理解流水线就很容易了。我想,工厂里的生产线,应该就是所谓的流水线。
4 E7 [) |" r/ ]1 A. j$ A% s* `: s4 n# N: j& P) T
特殊的,对于计算机体系结构来说,原理和汽车流水线一样,将一条指令的完成分成若干部分(流水节拍或流水段),然后指令依次流过这些流水段,就完成了这条指令。对于经典的5级流水线,如下:( I# g9 s3 U" M* l; K1 J
8 A6 j* @: Y; p. E- A
1,IF(指令取得)$ y ]0 j7 S# C% H* I
- e# r9 [1 o5 v& C1 B3 [* |$ P3 X% N需要完成的工作:' j+ L9 A! [' o7 `4 i; g( H7 t
. s t% G+ L' }* W: R8 Y! I( GSend 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.- b) T9 S) f$ o
- D' n9 P* }, V. o根据PC(程序计数器)指示的地址,从存储器中取指令,并装入到IR(指令寄存器),同时PC+4。当然假设每条指令占4个字节。/ \2 h0 d- d9 p; {) S
* F9 U$ N9 {, p0 Y- \7 y
2,ID(指令译码)
6 E2 C( ?* T- s! C* I3 o% E1 b5 Y
需要完成的工作:
% q3 h3 x7 K8 y
4 V8 r2 B( T& Q% DDecode the instruction and read the registers corresponding to register source specifiers from the register file。
; U8 u& b) h) h+ G- M# j0 x a8 R
1 n2 N: h+ L, v2 ?: M对指令进行译码,并且访问寄存器堆读出相应寄存器的内容。* i6 m& \( f6 s% ^9 \6 Y' A
3 p- {# ? }% |7 X/ b) @$ D
3,EX(执行)* H& x5 a& r3 K* _# v' e
4 C/ o* w- O% H
需要完成的工作:9 K# b Z- r; b
) C- q) J6 M) X- Z0 sThe ALU operates on the operands prepared in the prior cycle, peRForming one of three functions depending on the instruction type.+ B4 ~- {8 v) t
; I( l. F# Q A) f) s: h$ j' sMemory reference8 q$ s- n, O* W5 P3 N
4 L8 Y9 A4 p: D$ ]# G+ `Register-Register ALU instruction
7 K0 R# K5 ]# }6 b( q; ]2 }' a7 i9 r4 w; S* k) g8 H
Register-Immediate ALU instruction* V# C9 z t3 B, ^2 g1 z0 r
: t6 q/ s; S, M$ l5 U1 R9 g8 U0 tALU对上一个周期准备好的操作数进行运算,根据指令类型执行下面三种操作之一。
) G) d& C! @" P- m9 b
' l3 ^0 ^! B# T, ]访问存储器
8 v& D; b9 {' g
5 P1 X ?* ^8 t6 s# t2 y# w寄存器-寄存器ALU指令
9 \+ V9 j) m- b- M5 N$ u6 M N W' N2 n- m# i: v
寄存器-立即数ALU指令- m, G, K9 a- s7 I
4 A! E, U7 n% @# x# I3 \
4,MEM(访问存储器)0 _& G4 y V0 B
0 S" k( l( H* o. c: _; W( v需要完成的工作:
8 n f3 S, i9 ?% u e1 z$ {, H* \
2 O# N6 Y8 z( a6 |1 hIf 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.
# _( Z7 ^1 e8 g8 \% J6 w6 Q7 m) ^# L/ P4 W$ x% ]8 D' c
LOAD:从存储器中读取数据。STOR:把寄存器内容写到存储器。2 [) h" l% x2 [5 m
; h1 T2 O* i$ B5,WB(写回)+ D2 @7 X2 ]+ N' X
$ L2 Z. D4 S3 o }
需要完成的工作:
* s5 ~. G Z3 F) s i A4 J% [, l8 E3 o+ i s
寄存器-寄存器ALU指令,LOAD指令会经过这个流水段。
( \% D5 h3 Y( |- e2 p, y7 h- ]" i" w6 V1 a- M& f
Write the result into the register file, whether it comes from the memory system (for a load) or from the ALU (for an ALU instruction).- Y0 r( J C$ b4 _ |
! ?6 L3 ^9 X) `& i& J3 C! M, @将结果(来自LOAD指令或来自ALU)写入寄存器堆。
7 ~, |- D7 { e, g5 H8 D9 M
2 B$ G: C$ n8 D" B
, `0 `+ l8 Q; k; s3 {! B. P1 c( V
2 e7 d1 b% b2 t d) M% A/ S
0 E) c0 }8 j! n l' \4 e
8 |; i. B7 Y" j3 X* J; L- d
+ @! q3 _4 o+ a5.2流水线带来的影响! B& ] [' n, |" Q: L9 |3 m
. ]4 a& g: ]1 S+ v$ x引进流水线,肯定是有好处的,会提高效率,这个先不说,天下没有完美的事,有好处就有坏处,就是会引进一些问题。哪些问题呢?如下:
: T+ W, T/ W: P$ C; W
6 ^% F% l/ C. f2 O& }1,Pipeline Hazards(流水线遇险)
+ i" u/ G0 M( }7 t0 @1 {2 c f
/ ^. x8 E; ~( o1》Structural hazards(结构遇险)就是硬件资源不够用或者硬件资源使用冲突。
& j" C9 ?9 J x9 t! E0 p' P; P! g- m. n3 ^9 K8 M
2》Data hazards(数据遇险)就是指令间有数据依赖关系造成的问题。
6 q. u+ ?$ h& J+ D# i, I; L4 r d! \* [3 p* m/ `' A" W+ I% [
3》Control hazards(控制遇险)转移指令或修改PC造成的遇险。 F9 g, Y- h/ j) W% S) m7 i: P
" u3 V6 }( |7 O G
2,Dealing with Exceptions(处理异常)% |5 J) O# J8 f" U
. W3 B4 N9 w+ ]% T$ ~$ d8 n3 X
1》I/O中断0 W8 |8 v. _& W4 B! {0 ^" Z1 r
- N' `. M& j2 o8 Q
2》系统调用
; D) [, P6 T: G! r; n+ N0 _& P
0 f( G) ^# i' g' F2 ~) e3》执行跟踪指令$ G& Z. T* b, J" b) P
5 T) l4 k2 @, i1 K* \& k) f
4》断点
5 W. T9 a$ v3 b; |- A- f" r! @8 V( F
5》定点运算溢出; p4 G, R% @1 Y! e2 z9 a
; L3 t! G" { h% g; v6 ~/ e9 O6》浮点运算异常: W |5 S2 Q/ x" U, ^9 Y
1 { q9 u* t Z% V7 f; B
7》页面异常
4 K& Y6 y' E! T1 O7 ^& e
1 F! Z$ ^# V/ h8》访问存储器时使用错误地址
( V) m1 m( {6 a) A1 w! E1 t
) S3 k* E* D% B5 B& ~9》存储保护违例
! F2 K ~+ ~6 e+ J n9 J& t( @3 c* g0 {& j2 r0 J
10》硬件故障
- {* N* } k D9 N( D/ l
* |) k0 M. n3 ^' V11》断电
2 i# A: L9 ?5 G3 e0 p& Z4 M5 p3 X- Z$ r4 t, w, ]0 e
3,Instruction Set Complications(指令集本身的复杂性), A) P2 |# C. Z7 @7 p2 @. D) L1 L
/ j! _$ H+ {# S3 q9 m有些体系结构的指令集用流水线实现起来就比较复杂。
7 a! ], }' C( A K3 G7 m# i2 m* j6 ~' t
9 X! j3 |# W6 k: J
这些问题,可以仔细看一下上面的两张图,好好想一下就能推断会出现这些问题,这一点很重要。
/ |8 x' |& I1 p7 s" @2 A0 t+ T; B! E/ r/ m }
7 A* T( }1 S* c8 V! x8 A( d* Y4 G
5.3 解决技术, j2 I; h4 | [7 R+ I" D' l, P
- q2 h, Z7 C8 u4 m
先说一个式子:. p0 ~3 q) [& M" ^
1 T# y4 @3 r9 h+ A7 ^5 ^1 z2 P% mPipeline CPI = Ideal pipeline CPI + Structural stalls + Data hazard stalls + Control stalls, m/ w( l5 J) |" [8 B* ]( w
# H. n9 N( X2 K* _+ P Y这些技术无外乎就是想方设法减小右边的4项内容其中的一项或几项。; k5 J; c9 d5 ?7 M. l4 @; b3 v l# ^& ^, Y/ P
6 W6 G; h7 l+ N( J0 C) A& T4 O
7 e+ U" X" n$ W8 {$ F/ h2 F: j
! d, ~2 u4 n% }# i& P+ C6 e$ _, B5 u' F7 J0 Y
5.4小结
9 g+ q; d" G8 v! D7 o1 X0 D5 k6 V' |0 c. U o8 S* r; E. n" M
流水线,在各行各业都有体现,想像一下,大学食堂,如果把卖豆浆,油条,咸菜,粥,米饭,馒头,。。。这些窗口都合成一个窗口,会是什么景象。. _) z( q% ]( r+ t S, V
9 ?+ ~& {9 |( F6 B8 n5 ?7 w! J
这就是流水线的魅力。1 ]) s7 n6 J8 {& i" m) ?" w; x1 m
& {& i+ @7 n2 r, n+ z" Z
|
|