눈팅하는 게임개발자 블로그
Pipeline Hazard 본문
Hazard
명령어 파이프라인이 정상적인 동작에서 벗어나게 되는 요인
Structual Hazard
자원 충돌이 원인이 되어 발생하는 Hazard.
두 세그먼트(파이프라인 공정)가 동시에 하나의 메모리에 접근할 때 발생.
위의 예시에서는 MEM Step과 IF Step이 같은 메모리를 공유하는 경우
i + 3에서 IF가 해당 메모리에 액세스하려 했으나 이전의 MEM이 사용하고 있었으므로 한 Clock이 밀리게 된다.
해결 방법
- 하드웨어 자원의 복제/분리.
- 명령어 메모리와 데이터 메모리를 분리.
- 메모리나 레지스터의 입출력 버스를 분리.
Data Hazard
데이터 의존성이 원인이 되어 발생하는 Hazard.
특정 명령어가 이전 명령어의 결과에 의존하여 수행되는데, 그 값이 아직 준비되지 않았을 경우 발생
Data Hazard의 종류
RAW(Read After Write) : 처리중인 리소스를 write하기 전에 다른 세그먼트에서 리소스를 읽으려 함.
Write가 이루어진 후의 값이 필요하나 Write가 이루어지기 전의 잘못된 값을 얻게 됨.
WAR(Write After Read) : 리소스를 Read하기 전에 다른 세그먼트에서 Write를 하려 함.
Write가 이루어지기 전의 값이 필요하나 Write가 이루어진 후의 리소스를 읽어 잘못된 값을 얻게 됨.
WAW(Write After Write) : 잘못된 순서로 Write가 이루어지는 경우.
먼저 수행해야 할 Write가 뒤늦게 수행되어 잘못된 값이 저장됨.
Read After Read는 문제될 일이 없다.
위의 예시에서 ID는 유효 주소 값을 Read하는 세그먼트이며
WB는 결과 값을 Write하는 세그먼트.
ADD 명령어의 Write가 끝나기 전에 SUB 명령어의 Read가 실행되려 할 때.
Data Hazard가 발생.
해결 방법
- 타이밍을 맞추기 위해 파이프라인을 멈춘다.
- Hardware Interlock : 특정 명령어의 피연산자가 파이프라인에서 앞서간 명령어의 목적지와 일치하는지 검사하는 회로.
위 상황이 감지되면 피연산자가 준비되지 않은 명령어는 충돌을 피할 수 있을 만큼의 클럭 사이클을 지연시킨다.(Stall)
- Operand Forwarding : 특별한 하드웨어를 사용하여 충돌을 감지하고, 별도의 통로를 통해 데이터를
파이프라인 세그먼트에 연결함으로써 충돌을 피한다.
Control Hazard
PC 레지스터 값의 변화(Branch, Jump, Call/Retrun 등)가 원인이 되어 발생하는 Hazard.
조건문, 분기 등과 같은 코드로 인해 발생한다.
해결 방법
- Find out branch taken or not early
조건문이 어떤 식으로 실행될 지를 미리 알아내서 명령어 수행경로를 최적화 (현실적으로 미리 알아내는 것은 불가능)
- Branch Prediction
조건문의 수행 경로(true or false)를 예측하여 명령어를 설정.
true라고 예상하고 true가 나온 경우 그대로 진행.
true라고 예상하고 false가 나온 경우 명령어를 reset.
reset하게 되는 경우 그만큼 비용 손실이 발생하지만
대부분의 조건문이 true or false 중 한 쪽으로 쏠리기 때문에 현실적으로 효율적인 방법이다.
- Delayed Branch
조건문의 결과에 영향을 받는 Instruction의 순서를 뒤로 미루어 실행.
조건문의 결과가 나올 때까지 기다리지 않고 다른 Instruction을 미리 수행하고 조건문을 실행하는 방법.
'공부한거 > 컴퓨터구조' 카테고리의 다른 글
Cache Memory (0) | 2020.09.22 |
---|---|
Instruction (0) | 2020.09.22 |
Register (0) | 2020.09.22 |