오래 못 할 짓 하지 않기

[ 컴퓨터 구조 ] 13. Data Hazard 본문

2학년 2학기/컴퓨터 구조

[ 컴퓨터 구조 ] 13. Data Hazard

쫑알bot 2023. 7. 7. 14:47
728x90

Data Hazard

 

  • 발생 조건 : 이전 명령어와 현재 명령어의 Dependency가 있을 때

     →  이전 명령어의 결과가 구해져야 현재 명령어를 실행할 수 있기 때문에 Hazard

 

 

  • 해결법 : 뒤에 따라오는 명령어의 실행을 늦춘다. = Stall

 

Stall 구현법 :

  1. Freezing the pipeline
  2. (Internal) Forwarding
  3. 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중심대학