에듀테크 프로젝트 대시보드
CPU 파이프라이닝 (Pipelining)
명령어 하나를 5단계로 쪼개고 세탁소처럼 겹쳐 실행해 처리량을 끌어올리기 — 그리고 그것을 방해하는 해저드
대부분의 교과서용 RISC 파이프라인은 명령어 실행을 다음 5개의 단계(stage)로 나눈다. 각 단계는 서로 다른 하드웨어 블록이 담당하므로 동시에 다른 명령어를 처리할 수 있다.
| 단계 | 이름 | 하는 일 |
|---|---|---|
IF | Instruction Fetch | PC가 가리키는 메모리에서 명령어를 읽어온다 |
ID | Instruction Decode | 명령어를 해석하고 레지스터 값을 읽는다 |
EX | Execute | ALU가 연산 / 주소 계산 / 분기 판단을 한다 |
MEM | Memory Access | 데이터 메모리에서 load/store를 수행한다 |
WB | Write Back | 결과를 레지스터 파일에 기록한다 |
k + (n − 1) 이다. 비파이프라인은 k × n.
n이 커지면 속도 향상은 최대 k배에 수렴한다.
아래는 짧은 프로그램이 파이프라인을 통과하는 모습이다. 데이터 해저드 토글을 켜면 세 번째 명령어가 앞 명령어의 결과를 필요로 해서 충돌이 생기고, 포워딩이 꺼져 있으면 버블(stall)이 삽입된다.
# 예제 프로그램 (레지스터 의존 관계에 주목) I1 ADD r1, r2, r3 # r1 ← r2 + r3 I2 SUB r4, r5, r6 # 독립적 I3 AND r7, r1, r8 # r1 필요 → I1에 의존 (데이터 해저드) I4 OR r9, r1, r1 I5 ADD r10, r7, r7 # r7 필요 → I3에 의존
EX 결과를 다음 명령어의 EX 입력으로 바로 전달해
대부분의 stall을 없앨 수 있다. (단, load 뒤 바로 사용하는 load-use 해저드는 1버블이 남는다.)
| 종류 | 원인 | 해결책 |
|---|---|---|
| 구조적 해저드 Structural | 같은 사이클에 하나의 하드웨어 자원을 두 명령어가 원함 (예: 명령어·데이터 메모리 공유) | 자원 복제(하버드 구조: I-cache / D-cache 분리) |
| 데이터 해저드 Data | 앞 명령어가 아직 안 쓴 레지스터를 뒤 명령어가 읽으려 함 (RAW 의존) | 포워딩/바이패싱, 안 되면 stall, 컴파일러 명령어 재배치 |
| 제어 해저드 Control | 분기(branch) 결과가 나오기 전에 다음 명령어를 이미 가져옴 | 분기 예측(branch prediction), 지연 슬롯, 예측 실패 시 flush |
제어 해저드에서 예측이 빗나가면 잘못 가져온 명령어들을 버리고(flush) 다시 채워야 한다. 5단계 파이프라인에서 분기 페널티가 약 2~3사이클이라고 할 때, 예측 정확도에 따라 유효 CPI가 어떻게 달라지는지 보자.
가정: 명령어의 20%가 분기, 예측 실패 시 3사이클 페널티, 그 외 CPI = 1. 유효 CPI = 1 + 0.2 × (1 − 정확도) × 3.
k배지만, 해저드·버블·분기 실패가 이를 깎는다.