파이프라이닝
Pipelining Instruction 하나 하나의 실행속도를 빠르게 하는 것이 아니라 단위시간동안에 처리하는 Instruction의 수 (instruction throughput)를 증가시키는 것이 Pipelining의 효과이다. 프로그램 실행 순서 2 4 6 8 1 1 2 1 4 1 6 1 8 T i m e ( i n i n s t r u c t i o n s ) l w $ 1 , 1 ( $ ) I n s t r u c t i o n D a t a R e g A L U R e g f e t c h a c c e s s l w $ 2 , 2 ( $ ) I n s t r u c t i o n D a t a 8 n s R e g A L U R e g f e t c h a c c e s s l w $ 3 , 3 ( $ ) I n s t r u c t i o n 8 n s f e t c h . . . 8 n s 프로그램 실행 순서 2 4 6 8 1 1 2 1 4 T i m e ( i n i n s t r u c t i o n s ) I n s t r u c t i o n D a t a l w $ 1 , 1 ( $ ) R e g A L U R e g f e t c h a c c e s s I n s t r u c t i o n D a t a l w $ 2 , 2 ( $ ) 2 n s R e g A L U R e g f e t c h a c c e s s l w $ 3 , 3 ( $ ) I n s t r u c t i o n D a t a 2 n s R e g A L U R e g f e t c h a c c e s s 2 n s 2 n s 2 n s 2 n s 2 n s
Pipelining – 고려할 점 파이프라이닝 구현할 때 도움이 되는 것: all instructions are the same length just a few instruction formats memory operands appear only in loads and stores 파이프라이닝 구현할 때 괴로움을 주는 것: structural hazards (구조적 해저드): suppose we had only one memory control hazards(제어 해저드): need to worry about branch instructions data hazards(데이터 꼬임): an instruction depends on a previous instruction 간단한 파이프라인을 구현해 보면서 위의 사항들을 살펴 본다. We will talk about modern processors and what really makes it hard: exception handling trying to improve performance with out-of-order execution, etc.
Basic Idea : MIPS는 다음 5개의 단계로 이루어짐 g i s t r 1 R a d 2 6 S n x W A D m o y L U u l M Z I F : c f h / E X What do we need to add to actually split the datapath into stages? x e c u t e / M E M : M e m o r y a c c e s s W B : W r i t e b a c k a d d r e s s c a l c u l a t i o n I n s t r u c i o m e y A d 4 3 2 l S h f M x 1 P C W a R g
Graphically Representing Pipelines Can help with answering questions like: how many cycles does it take to execute this code? what is the ALU doing during cycle 4? use this representation to help understand datapaths I M R e g D C 1 2 3 4 5 6 T i m ( n c l o k y s ) w $ , P r a x u t d b A L U A L U
Dependencies : Data Hazard Instruction 수행 결과값이 필요한데 아직 나오지 않았을 경우 dependencies that go backward in time are data hazards I M R e g C 1 2 3 4 5 6 T i m ( n c l o k y s ) u b $ , P r a x t d D 7 8 9 / ? w V f :
Forwarding : 지름길로 빨리 결과값을 준다 Use temporary results, don’t wait for them to be written register file forwarding to handle read/write to same register ALU forwarding what if this $2 was $13?
Branch/Control Hazards : beq 같은 경우 조건을 test 한 후에야만 프로그램 실행순서를 결정할 수 있다. 2 4 6 8 1 I n s t r u c i o f e h R g A L U D a T m l w $ , ( ) beq 3 P x d $2, 40
Branch/Control Hazards 그래서, 일단 분기가 되지 않을 것이라 가정하고 그냥 순서대로 진행… 그러다가, 정말 분기가 되어야 할 경우 파이프라인에서 실행되고 있는 의미없는 프로그램들은 비워야 한다. R e g C 1 T i m ( n c l o k y s ) 4 b q $ , 3 7 P r a x u t d I M R e g D 4 a n d $ 1 2 , 5 8 o r 3 6 7 l w ( ) C 9 R e g