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


- 제어(컨트롤) 해저드

앞 분기 명령어의 결과를 알지 못해서 지연이 생기는 경우
해결 방법
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 |