컴퓨터 구조

파이프라인과 해저드

파이프라인은 명령어 처리를 다섯 단계로 나누고, 앞 명령어가 다음 단계로 넘어가면 바로 다음 명령어를 들여보내 여러 명령어를 겹쳐 처리합니다. 세탁기가 돌아가는 동안 건조기도 돌리는 것과 같습니다. 다만 앞 명령어의 결과가 필요하거나 분기가 있으면 흐름이 막힙니다.

5단계 파이프라인에서 명령어가 겹쳐 실행되고 해저드로 멈추는 과정을 보여 주는 시뮬레이터

1. 명령어 묶음과 포워딩 여부를 고르세요

포워딩

2. 클럭을 한 번씩 진행하세요

IF 인출ID 해석·레지스터 읽기EX 실행MEM 메모리WB 레지스터 쓰기스톨(대기)버려진 명령어→ 포워딩

각 행이 명령어, 각 열이 클럭입니다. 포워딩을 껐다 켜며 같은 묶음을 실행해 스톨 칸 수와 총 클럭을 비교해 보세요.

이상적인 CPI1
데이터 해저드앞 결과를 기다림
제어 해저드분기 결과를 기다림
구조 해저드자원 충돌

데이터 해저드와 포워딩

add r1, r2, r3 바로 다음에 sub r4, r1, r5가 오면, sub는 r1이 필요한데 add는 아직 WB 단계에 이르지 않았습니다. 포워딩이 없으면 sub는 add가 r1을 레지스터에 쓸 때까지 ID에서 기다립니다. 포워딩은 add의 EX 결과를 레지스터를 거치지 않고 바로 sub의 EX 입력으로 넘겨 대기를 없앱니다.

load-use는 포워딩으로도 한 칸 남습니다

lw는 값을 MEM 단계에서야 메모리에서 가져옵니다. 바로 다음 명령어가 그 값을 EX에서 쓰려면, 포워딩을 해도 한 클럭은 기다려야 합니다. 컴파일러는 이 빈칸에 관계없는 명령어를 끼워 넣어 스톨을 숨깁니다.

분기는 다음에 가져올 명령어를 모르게 만듭니다

분기 명령어의 결과는 EX 단계에서 정해지는데, 그동안 CPU는 이미 다음 명령어 두 개를 가져왔습니다. 분기가 일어나면 그 둘을 버리고 목표 주소에서 다시 가져와야 합니다. 그래서 CPU는 분기 예측으로 결과를 미리 짐작합니다.