오래 못 할 짓 하지 않기
[ 컴퓨터 구조 ] 13. Data Hazard 본문
Data Hazard
- 발생 조건 : 이전 명령어와 현재 명령어의 Dependency가 있을 때
→ 이전 명령어의 결과가 구해져야 현재 명령어를 실행할 수 있기 때문에 Hazard
- 해결법 : 뒤에 따라오는 명령어의 실행을 늦춘다. = Stall
Stall 구현법 :
- Freezing the pipeline
- (Internal) Forwarding
- Compiler scheduling
▣ Freezing The Pipeline
ADD 와 SUB을 먼저 보면
ADD $( Rd = 저장될 곳 ) , $( Rs = Operand 1 ) , $ ( Rt = Operand 2 ) 이다.
결괏값을 $1에 저장한다.
SUB 에서는 $1 과 $5 의 연산의 결괏값을 $4에 저장한다.
근데 SUB가 Register file에서 데이터를 받을 때, $1에는 아직 값이 저장이 안 되어있다.
ADD의 결과로 $1에 저장이 될 때까지는 2CLK은 기다려야 한다.
그러기 위해서 SUB을 2 CLK동안 stall 한다.
(아래도 마찬가지)
이렇게 되면 CPI가 늘어남.
▣ (Internal) Forwarding
ADD의 결과로 $1에 들어갈 값은 EX단에서 이미 결정된다 ( 그때 연산을 다 했으니까 )
그래서 뒤에 오는 명령어가 그걸 가로채서 작업을 하면 Stall 없이 작업가능
( 뒤에 오는 명령어가 Register를 읽는 시점이랑 앞 명령어가 연산이 끝난 시점이랑 잘 맞아야 하지 않을까? )
그러려면 DataPath 수정을 좀 해야 함
위에 같은 경우엔 앞 명령어의 ALUOut을 ALUIn에 같이 넣어줄 수 있게 path를 만든다!
그러나 LW 은 EX단에서 결괏값이 나오는 게 아니라 MEM작업이 끝나야 결괏값이 나오므로 Stall이 하나는 있어야 한다.
ADD같은 경우에는 앞의 결과가 나오는 것과 뒤에 애가 쓰는 게 1단계 차이였는데
LW는 2단계 차이가 나기 때문에 1단계는 기다려줘야 타이밍이 맞다.
▣ Compiler Scheduling
Software(명령어)를 사용하여 (Hardware 수정 X) 처음부터 Data Hazard가 발생하지 않게 하는 방법
→ Data Hazard 발생할 Instruction 끼리 붙어있을 상황을 만들지 않는다.
(Dependency 가 있는 Instruction 끼리)
1) Instruction 간에 NOP를 추가한다.
NOP는 그냥 자리 차지하고 있는 NULL 명령어라고 생각하면 된다.
2) Instruction을 재배열한다.
Data Dependecy가 없는 것들을 그 사이에 재배열해서 NOP 대신 다른 작업을 하도록 한다.
출처 : 한동대 SW중심대학
'2학년 2학기 > 컴퓨터 구조' 카테고리의 다른 글
[ 컴퓨터 구조 ] 15. (Hazard) Data Forwarding logic (0) | 2023.07.10 |
---|---|
[ 컴퓨터 구조 ] 14. Control Hazard solutions (0) | 2023.07.09 |
[ 컴퓨터 구조 ] 12. Pipeline 제어부 (Control) (0) | 2023.07.07 |
[ 컴퓨터 구조 ] 11. Pipeline DataPath (0) | 2023.07.06 |
[ 컴퓨터 구조 ] 10. Pipeline 적용 (0) | 2023.07.06 |