|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
. M! M. m9 C% @# v b: E- E5 |# S5 Y' b6 J引言" S `/ {2 w( s+ o6 M, {, Q0 |
7 Z* c6 @7 B: c/ z+ l* e# d" r
It is quite a three-pipe problem.
8 C& q' |+ H" `2 i# C) b-- Sir Arthur Conan Doyle
1 \+ H, s: t/ H( @7 D3 g2 y
1 T2 `1 n4 E) }2 Y所以就分三部分说吧。+ l8 V! d& G5 M, _
5 v. s' i1 O5 Y7 Q7 V% \
虽然,指令级并行(ILP)的潜能已经开发殆尽(intel已经在2004年宣布,停止高性能单处理器的研发),流水线技术也已经很成熟了,但是了解流水线,是学习和了解计算机体系结构绕不开的内容。本小节就从三个方面说一下流水线。8 p' q% R: P/ n6 {6 n
+ y; |- w8 y( t4 u7 i
# `2 W) C J3 L: g
5.1 什么是流水线$ o+ w$ ^7 J" G- O0 }0 z
( |( [; e8 W1 n* D0 F; r4 Y
Pipelining 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.
) k4 |. a0 Y( S. v- e/ t
4 I+ y, D5 v+ W& s+ Z2 o流水线是利用执行指令所需的操作之间的并行性,实现多条指令并行执行的一种技术。
# m. C' C& I# V+ D" y4 T9 S# @" a# I3 u* ^# N" H' k& E
其实,流水线本身,跟计算机没关系。最早流水线是福特发明的,那时福特汽车公司生产效率很低,正是福特本人引进流水线,是生产效率大增。其原理就是把生产一辆完整的汽车分成若干工序,然后从第一个零件开始,依次流过整个流水线,然后一辆完整的汽车就被生产出来了。如果你在生产工厂呆过的话,理解流水线就很容易了。我想,工厂里的生产线,应该就是所谓的流水线。
) q6 ?. z0 Y% `4 z3 k; M$ i6 T1 F/ s; E
特殊的,对于计算机体系结构来说,原理和汽车流水线一样,将一条指令的完成分成若干部分(流水节拍或流水段),然后指令依次流过这些流水段,就完成了这条指令。对于经典的5级流水线,如下:
6 B& T x$ t9 v6 [, b& V9 I
6 T( X* R; o/ I, ^! Y) c& t( C1,IF(指令取得)+ L$ P L- T: V" H
: q8 ^1 b. O: Z; r6 z% B% e& t
需要完成的工作:
. K0 c6 U2 g- v: r4 u, @6 {8 b' c) s" r C3 X% d5 i0 X
Send 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.
8 ]$ c6 I2 E' C- i) ]% P( e
$ F& C; j+ S% n3 k根据PC(程序计数器)指示的地址,从存储器中取指令,并装入到IR(指令寄存器),同时PC+4。当然假设每条指令占4个字节。
) n4 V/ V n% c( T5 k1 R; c
+ V1 c' T) `; Y' \5 J" e# w2,ID(指令译码): |5 F" O$ h! d) V* j
9 h8 o2 l: W; t1 k
需要完成的工作:
# U R+ U+ ^7 k5 g L, O8 U; V6 D# O. W* T. l" E# ]) I5 b+ s
Decode the instruction and read the registers corresponding to register source specifiers from the register file。$ j+ W* ^) q7 I1 g+ y3 b
F M0 Y& h+ ]1 v% m, S+ R" Y
对指令进行译码,并且访问寄存器堆读出相应寄存器的内容。
2 N/ M% k+ P. P2 G' u g, }$ d# _* Y$ H0 l0 a J
3,EX(执行)2 N) h2 x7 F) b, w+ f
6 t1 F: @7 ] X- C3 E需要完成的工作:
; J7 B# x+ P ?. F4 \. H# j; @5 {" c5 f$ b
The ALU operates on the operands prepared in the prior cycle, peRForming one of three functions depending on the instruction type." m; a* k" G5 I' C8 Y5 z' v
. U" Z/ u' f) \7 ^' d% ]% U% R. o. zMemory reference
}1 w: y, _! n! B1 \
! q; X4 I: o9 x% b# kRegister-Register ALU instruction. N" }& I9 F$ ~) ~
4 ~. M5 i8 }; q& ?Register-Immediate ALU instruction
2 T7 c# f1 ^0 K. Q! o* x& n1 e: i( l- g5 u
ALU对上一个周期准备好的操作数进行运算,根据指令类型执行下面三种操作之一。5 r5 l6 z3 D& c$ u
# U, l% B% B' ]; |
访问存储器
* N) C) Y- Q4 a, h" i; j& h) M* @, N7 G$ a1 g# j
寄存器-寄存器ALU指令
) [% T6 Q2 ~& H/ n
' @ k9 a# |2 _% K3 f+ c寄存器-立即数ALU指令
7 H& ~% P( M+ m/ ^, h$ I3 i8 X& m1 m9 h5 q3 G
4,MEM(访问存储器)+ ^0 F/ M7 J2 h* H' e
" W- P/ y# @' J8 [5 ]: N需要完成的工作:
/ ]- B' k9 ?- {+ Y% J* o( c! ~ x" v6 F* C% q! V4 {
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.
' Y: s( l; j; f+ h* v# x% B+ Y7 l6 G+ g3 V' W4 a4 o& e' d
LOAD:从存储器中读取数据。STOR:把寄存器内容写到存储器。3 ~- ]+ P8 w }: ~
( p: u6 j% q5 ], Q5 J5,WB(写回)
0 G. q) @8 I* |, j! V: V& |: T! p$ I
0 T! }9 O/ u6 h1 Q需要完成的工作:# N* d& k' F! N7 e/ k' O. w
3 h9 Y2 B8 y( J+ k. Z0 }
寄存器-寄存器ALU指令,LOAD指令会经过这个流水段。; Y& B6 P# H/ ]. S4 P
; `+ E$ e; {# u( t
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).
8 v( f |! `5 o$ l4 i. [- c! T8 H
% R% H' s- y |2 r将结果(来自LOAD指令或来自ALU)写入寄存器堆。$ v% `. M$ n: R" c) p
" `/ {4 i5 r# b% D( N) A
9 X; a) i, f" K5 k6 s3 a* _+ [( }- W* A( Z
- n7 w/ p4 b, b
- O$ V( ^% K6 b. W# O
( {& B" K L- w& y5.2流水线带来的影响! }+ P7 B$ [2 ^6 s# X0 `7 Y
6 P, N+ w9 n2 v; Z9 i7 K1 b# _$ Z% q- A引进流水线,肯定是有好处的,会提高效率,这个先不说,天下没有完美的事,有好处就有坏处,就是会引进一些问题。哪些问题呢?如下:$ F @# R I3 Z0 {6 o/ F, j
5 p) F- r/ H! C$ D- |
1,Pipeline Hazards(流水线遇险)! Y* M4 p& R$ T7 O+ f
- _; n9 X8 U9 ^4 }+ z' b7 P
1》Structural hazards(结构遇险)就是硬件资源不够用或者硬件资源使用冲突。
3 H& |4 c$ U1 B% L( T1 b
( p, o) C8 H1 E( R" A1 a! o4 L4 |2》Data hazards(数据遇险)就是指令间有数据依赖关系造成的问题。 [" P- Z* ~3 S5 y5 m' Y. h& b- D& M
; V9 l q7 g3 C1 h3》Control hazards(控制遇险)转移指令或修改PC造成的遇险。* p0 F* U; ?6 J3 \4 r+ q
4 S% i3 \# s p5 w9 [2,Dealing with Exceptions(处理异常)6 `; x# B; ?' H# E# ?9 J* Z
0 m* R# Y& Y# F5 ~8 `
1》I/O中断
' g# r% ~: h) @$ l1 e7 q$ Q& B! J+ S+ B5 z& k Y3 J! l
2》系统调用6 B6 r' R) I+ I* `) d# _
; R- a( f7 D( G7 n: I: }/ }
3》执行跟踪指令$ j; w7 e) R1 C( @# ^& ^
+ v/ d; s$ J) ]* z% o0 D6 b4》断点
3 h- S3 l Z" f. H5 K5 C' j6 C+ t6 W N l# V% Q; \2 n r0 a
5》定点运算溢出
3 F( U. Q1 S* y2 `9 ]% I( o+ a( l; U+ H
6》浮点运算异常0 h2 `0 c# a1 j! f4 l) U( }
$ i8 a$ \6 ]7 n( z5 A9 u
7》页面异常
6 J& n( @% ~8 H% `
( ?* \( y- X1 k9 B# Y8》访问存储器时使用错误地址
9 D/ V& I8 _2 ^3 A
6 g2 |* o- V+ X- x9》存储保护违例# e' f5 x J1 \" } Z" j- s
3 ~6 U: l- D( E" H) X" F) K
10》硬件故障
, u5 @) G6 M8 r5 C+ k! x+ L
! \5 \ M1 y: l/ e8 x1 @11》断电
' S* }# ]' ^/ f6 W
% q# `1 n8 l& T! @+ @6 \+ a3,Instruction Set Complications(指令集本身的复杂性)
1 k7 G" p) l+ ?+ U2 z: L3 [- R7 X: \0 l j6 N) C
有些体系结构的指令集用流水线实现起来就比较复杂。1 _/ P6 z# N( N$ \# s2 K' }8 |
, Z. O0 |# o, X H4 |5 _3 D2 i- L6 u: M B( H
这些问题,可以仔细看一下上面的两张图,好好想一下就能推断会出现这些问题,这一点很重要。, f r0 Y3 \4 _) q
' [" z5 k$ l- p9 P! _% _$ X9 K6 Z( `: ^% e9 `- Q8 _
5.3 解决技术+ F; @# j7 O6 m' k, v
( b2 [) m) u& N7 s" S
先说一个式子:, J9 m" _2 _/ l; L, [+ ]
* M! w3 C( ? N7 n0 s
Pipeline CPI = Ideal pipeline CPI + Structural stalls + Data hazard stalls + Control stalls" L/ b1 i! `. t( s" q
1 ~: L3 H# N) q1 g: V
这些技术无外乎就是想方设法减小右边的4项内容其中的一项或几项。" u6 J* `* z* n
; H. m7 \6 i- r
$ n, j5 H3 A: S' L
- r$ b. D2 ~' w- U/ q7 x4 |* i
% ^1 q1 Y1 G: y, g7 a5.4小结& ~0 W. m8 `$ I* C& U: H* `; f2 w
7 Y# Y9 P. u" P( u$ b2 E7 v流水线,在各行各业都有体现,想像一下,大学食堂,如果把卖豆浆,油条,咸菜,粥,米饭,馒头,。。。这些窗口都合成一个窗口,会是什么景象。
4 z) d4 s* c1 l- W8 y% w# ~; j4 f# m) _3 B% x
这就是流水线的魅力。& V7 j' a# U) E# N
. h7 p8 }& M m
|
|