한양과학기술고등학교

에듀테크 프로젝트 대시보드

CPU 파이프라이닝 (Pipelining)

CPU 파이프라이닝 (Instruction Pipelining)

명령어 하나를 5단계로 쪼개고 세탁소처럼 겹쳐 실행해 처리량을 끌어올리기 — 그리고 그것을 방해하는 해저드

한 줄 요약. 세탁 → 건조 → 개기를 한 벌씩 끝내고 다음 벌을 시작하면 오래 걸린다. 첫 벌을 건조기에 넣는 순간 두 번째 벌의 세탁을 시작하면 전체 시간이 크게 준다. CPU도 명령어를 IF·ID·EX·MEM·WB 5단계로 나눠 매 사이클 새 명령어를 투입한다.

1. 명령어의 5단계

대부분의 교과서용 RISC 파이프라인은 명령어 실행을 다음 5개의 단계(stage)로 나눈다. 각 단계는 서로 다른 하드웨어 블록이 담당하므로 동시에 다른 명령어를 처리할 수 있다.

단계이름하는 일
IFInstruction FetchPC가 가리키는 메모리에서 명령어를 읽어온다
IDInstruction Decode명령어를 해석하고 레지스터 값을 읽는다
EXExecuteALU가 연산 / 주소 계산 / 분기 판단을 한다
MEMMemory Access데이터 메모리에서 load/store를 수행한다
WBWrite Back결과를 레지스터 파일에 기록한다
단계 수가 k, 명령어 수가 n일 때 이상적인 파이프라인의 총 사이클은 k + (n − 1) 이다. 비파이프라인은 k × n. n이 커지면 속도 향상은 최대 k배에 수렴한다.

2. 파이프라인 실행 다이어그램

아래는 짧은 프로그램이 파이프라인을 통과하는 모습이다. 데이터 해저드 토글을 켜면 세 번째 명령어가 앞 명령어의 결과를 필요로 해서 충돌이 생기고, 포워딩이 꺼져 있으면 버블(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에 의존
사이클 0 — 준비 완료. “한 사이클”을 눌러 시작하세요.
경과 사이클
0
완료 명령어
0
삽입된 버블
0
CPI (사이클/명령어)
–
CPI(Cycles Per Instruction)가 이상적으로는 1이지만, 버블이 끼면 1보다 커진다. 포워딩을 켜면 EX 결과를 다음 명령어의 EX 입력으로 바로 전달해 대부분의 stall을 없앨 수 있다. (단, load 뒤 바로 사용하는 load-use 해저드는 1버블이 남는다.)

3. 세 가지 해저드

종류원인해결책
구조적 해저드
Structural
같은 사이클에 하나의 하드웨어 자원을 두 명령어가 원함 (예: 명령어·데이터 메모리 공유)자원 복제(하버드 구조: I-cache / D-cache 분리)
데이터 해저드
Data
앞 명령어가 아직 안 쓴 레지스터를 뒤 명령어가 읽으려 함 (RAW 의존)포워딩/바이패싱, 안 되면 stall, 컴파일러 명령어 재배치
제어 해저드
Control
분기(branch) 결과가 나오기 전에 다음 명령어를 이미 가져옴분기 예측(branch prediction), 지연 슬롯, 예측 실패 시 flush

4. 분기 예측이 중요한 이유

제어 해저드에서 예측이 빗나가면 잘못 가져온 명령어들을 버리고(flush) 다시 채워야 한다. 5단계 파이프라인에서 분기 페널티가 약 2~3사이클이라고 할 때, 예측 정확도에 따라 유효 CPI가 어떻게 달라지는지 보자.

가정: 명령어의 20%가 분기, 예측 실패 시 3사이클 페널티, 그 외 CPI = 1. 유효 CPI = 1 + 0.2 × (1 − 정확도) × 3.

5. 정리