본문 바로가기

Layer7

Pipelining : Hazard

Hazard :

Pipelining으로 명령어를 처리할 때, 명령어 처리 시간이 일정하지 않고, 처리 단계가 균등하지 않아 발생하는 문제

 

< Hazard 종류 >

  • 구조 해저드

 

프로세서의 자원 부족으로 문제가 발생함.

▶ 위 사진과 같이 명령어2에서 EXE가 1클락에 안 끝날 경우, 명령어2가 WB를 수행할 때 명령어3은 멈추게 됨(stall).

▶ 명령어4는 OF 단계가 필요 없는 명령어.  EXE를 수행하려고 할 때, 명령어3에서 EXE가 수행되고 있어 stall 발생.

해결 방법

① 메모리 수를 늘린다 (물리적으로 하드웨어를 추가)

② 해당 기능을 사용할 수 있는 시점까지 지연 시킴.

 


  • 데이터 해저드

필요한 데이터가 만들어지지 않은 경우, 이전 명령어의 결과를 기반으로 다음 명령어가 수행될 때 발생. 

 

해결 방법

① 계산이 끝나자마자 MEM과 WB를 거치지 않고 바로 결과 값을 넘겨줌 (Forwarding or Bypassing)

② 소프트웨어적으로 코드 순서를 재배열 해줌 (code scheduling)

③ Out-of-oder-Excution (비순차적 실행) -Pipeline 내의 빈 공간이 생기는 것 방지, CPU가 최고 성능을 내도록 함.

 

아래 명령어를 처리 한다고 예를 들어보자

A=5

B=3

C=A+B

D=4

 

사진 1
사진 2


  • 제어(컨트롤) 해저드

앞 분기 명령어의 결과를 알지 못해서 지연이 생기는 경우

 

해결 방법

Branch prediction(분기 예측)

dynamic prediction : 프로그램 실행 중 history 기반으로 분기를 예측하는 것

 

a = e + f;
if (a == 0)
	b = 0;
else
	b = 1;

CPU는 독립적으로 실행할 수 있는 명령어들을 찾지만, 2번째 줄에 if문이 있어서 3번을 읽을지 5번을 읽을지 알 수 없음.

▶ 그래서 주어진 분기문이 참이냐 거짓이냐 하는 질문의 답을 예측함. =Branch prediction(분기 예측)

 

예를 들어,

분기 예측기가 a == 0일 확률이 높다고 예측 했다면 → CPU는 그것을 믿고 3번째 줄의 명령어를 가져와 처리함.

이후 2번째 줄 명령이 완료 되어

  • a == 0이 맞다고 판명되면 다음 명령을 수행함.
  • a == 0이 아니라고 판명되면 다시 되돌아가(Undo) 5번째 줄 명령이 수행 되도록 함. 

 

'Layer7' 카테고리의 다른 글

C Pointer  (1) 2021.05.11
embedded(임베디드)  (3) 2021.04.20
CPU, Pipeline (OOOE, Branch prediction)  (2) 2021.04.17
RAM ROM FLASH  (4) 2021.04.11
컴퓨터 부팅과정  (2) 2021.04.10