컴퓨터(Computer Science)/컴퓨터구조(Computer Arichitecture)

Data Hazard Forwarding vs Stalling [컴퓨터구조]

게임이 더 좋아 2021. 6. 19. 17:34
반응형
728x170

 

데이터 해저드에 대해서 조금 더 자세히 알아보자

 

 


 

말했다시피 데이터 해저드는 데이터 의존성 때문에 발생한다.

 

 

 

sub의 결과가 뒤의 instruction에 사용된다.

다시 말해서 forwarding 을 하지 않으면 데이터 해저드가 발생한다.

사실 데이터 해저드가 발생해서 포워딩이 되는 것이 맞다.

 

 

 


 

근데 우리야 명령어 목록들을 보면 해저드가 발생할 것이고 forwarding을 언제 하면 되겠다는 걸 알 수 있는데

컴퓨터는 어떻게 detect를 할 수 있을까???

 

다시 말하면 언제 해저드가 일어난다는 것일까??

 

 

일반적으로 

Read After Write 의 경우 쓰기 연산 후의 읽기인데

Write가 끝난 뒤에 Read를 해야한다는 말이다.

그렇지 않으면  Data Hazard가 발생한다.

 


 

데이터 해저드는 저 때 발생한다.

 

그렇다면 우리가 포워딩으로 해결하기 위해서 언제 포워딩을 해야하는가??

 

 

1. 레지스터 번호를 파이프라인에 넘긴다.

ID/EX RegisterRs란 ID/EX 레지스터에 있는 source register라고 보면 된다.

 

2. 그렇다면 ALU가 받는 해당 레지스터 번호들은 위와 같다.

 

3. 데이터 해저드가 발생하는 4가지 경우가 있다.

1a,1b를 보면 destination에 result를 가져다 놓기 위해 Rd 번호를 받았지만

그 해당 값을 넣는 레지스터 번호가 뒤의 ID/EX 가 접근하는 레지스터 번호와 같았을 때

해저드가 발생한다.

 

2a,2b를 보면 마찬가지로  destination에 result를 가져다 놓기 위해 Rd 번호를 받았지만

쓰기 전 단계이다. 그 해당 값을 넣는 레지스터 번호가 뒤의 ID/EX 가 접근하는 레지스터 번호와 같았을 때

해저드가 발생한다.

 

 

즉, EX단계가 끝나거나 MEM 단계가 끝나고 포워딩을 함으로써 해저드를 해결해야 한다.

 

포워딩 하기 위한 조건은

forwarding을 하기 위해서 signal을 보내야하는데

EX/MEM.RegWrite, MEM/WB.RegWrite가 1일 때 쓰여진다는 의미다.

그리고 

Rd가 0번레지스터가 아니어야 한다. 

당연한 얘기지만 0번 레지스터는 Read-only다.

 

즉, 아래와 같이 간다.

 

 

Forwading Unit에 

Rs, Rt, EX/MEM.RegWrite, MEM/WB.RegWrite 4가지가 들어가고

포워딩을 할 지 ID/EX의 MUX에 레지스터 번호를 전달한다.

** 해당 MUX는 입력이 3개다.

 

1. 레지스터에서 받은 원래 값

2. EX 후에 나온 값

3. MEM 후에 나온 값

 

**Forwarding A - Rs, Forwarding B - Rt

 


 

음... 그래서 포워딩이 되는 조건을 알았다.

이제 컴퓨터가 알아먹게 표현하자면??

 

**Forwarding A - Rs, Forwarding B - Rt

 

그냥 위의 내용을 합치면 이렇게 된다.

외울 필요가 없다.

 

외워야 할 것은

10이란 뜻과 01의 뜻만 알면 된다.

10 -> EX stage 의 result를 포워딩하겠다.

01 -> MEM stage의 result를 포워딩하겠다.

 

** 00은 뭐야?? -> 00은 MUX에서 이전의 레지스터에서 받은 결과를 그냥 쓰겠다는 말이다.

 


 

그렇다면 여기서 끝나느냐?

 

아니다 Double Data Hazard라는 것이 있다.

(EX harzard이다)

 

3번째 add instruction을 보자

필요한 레지스터 번호는 1인데

1번 instruction의 1에서 와야할까??

2번 instruction의 1에서 와야할까???

 

조금만 생각하면 당연한 것이

2번째에서 와야 한다.

 

데이터 해저드가 2개 발생한다고 볼 수 있는데

항상 가장 최신 값의 결과를 받아다 써야 한다.

 

그래서 이러한 경우에는 위와 같이 포워딩을 하더라도 해저드가 발생하기 때문에

조건을 추가시켜줘야 한다.

 

3번째 instruction을 보자

포워딩은 2가지로부터 올 수 있다.

첫 번째 instruction의 MEM에서

두 번째 instruction의 EX에서

 

즉, 최신의 것은 당연히 EX이다.

 

그러므로 이러한 조건을 추가시킬 수 있다.

MEM한테 포워딩을 받는 조건은 EX에서 포워딩이 오지 않을 때이다.

 

다시 위의 조건을 수정하면

EX Hazard 조건이 추가된 것이다.

 

 

 

 


 

Datapath로 다시 보자

 

 

Control에서 나와서 Forwarding으로 들어가는 값을 잘 보고 그러자.

 

 


 

이번엔 Load-Use Data Hazard다

 

 

보다시피 lw에서 포워딩은 MEM이 끝난 후에 가능한데

이미 and는 EX단계가 끝나있다.

즉, ID단계에서 알 수 없기 때문에

한 싸이클 stall 해야만한다.

 


 

그렇다. 해저드는 발생하는데 컴퓨터는 또 어떻게 detect하는가?

 

 

 

ID 단계에서 알 수 있다.

 

ID/EX에서 MemRead라는 것을 알고

해당 target 레지스터번호를

다음 instruction의 IF/ID 단계에서의 source나 target 레지스터 번호와 비교하는 것이다.

 

detect하면 1 싸이클 stall을 해야한다.

 


 

이건  Forwarding으로 해결할 수 없는  Hazard구나??

stall을 시켜야한다.

어떻게하지??

 

 

1. ID/EX에 있는 Control  값을 0으로 만들어버림

2. PC가 update되는 것을 막고 IF/ID가 다시 업데이트되는 것을 막아야 한다.

->실행하지 않은 채로 다시 PC가 업데이트가 되면 진짜로 없데이트가 될 수 있다.

 

즉, 같은 명령어를 Decoding 해야하고 

다음 명령어를 Fetch를 한번 더한다.

또한 한싸이클 쉬더라도 MEM 단계에서의 Read data는 수행되어야 한다. -> 그렇게 해야 포워딩이 가능하다.

 

아래의 그림과 같이 한다.

 

ID/EX에서 Control을 0으로 만든다는 것, EX/MEM stage는 작동해야한다는 것에 초점을 두고 이해해보자

 


 

또 Datapath로 봐야한다.

 

 

 


 

결국 해결할 수 없는 Hazard는 stall을 발생시키고 성능을 감소시킨다.

 

 

하지만 컴파일러로 코드를 잘 배열시키면 harzard를 피할 수 있고 stall도 피할 수 있다.

이것이 컴파일러 성능과 직결되고 컴퓨터 성능과 직결된다.

 

 

 

반응형
그리드형