CPU 명령어 파이프라인: 해저드와 실행 최적화의 구조

CPU 명령어 파이프라인의 단계별 실행 구조와 성능 특성, 데이터·제어·구조적 해저드 및 최적화 기법을 정리한다.

2026-08-14 · 최초 발행 2026-01-03

명령어가 단계별로 겹쳐 흐르는 구조

파이프라인은 명령어 실행을 Fetch, Decode, Execute, Memory Access, Write Back 같은 단계로 나누고, 각 단계가 서로 다른 명령어를 동시에 맡도록 구성하는 방식이다. 한 명령어의 전체 처리 시간을 직접 줄이는 것보다 단위 시간당 완료되는 명령어 수, 즉 처리량을 높이는 데 초점이 있다.

공장의 조립 라인처럼 이전 명령어가 실행 단계에 있을 때 다음 명령어는 해석 단계로, 그다음 명령어는 가져오기 단계로 들어갈 수 있다.

순차 실행에서는 명령어 하나가 모든 단계를 마친 뒤 다음 명령어가 시작된다.

Instruction 1: [Fetch][Decode][Execute][Memory][WriteBack]
Instruction 2:                                             [Fetch][Decode][Execute][Memory][WriteBack]
Instruction 3:                                                                                           [Fetch][Decode][Execute][Memory][WriteBack]

파이프라인에서는 같은 시간 동안 여러 명령어가 서로 다른 단계에 위치한다.

Instruction 1: [Fetch][Decode][Execute][Memory][WriteBack]
Instruction 2:        [Fetch][Decode][Execute][Memory][WriteBack]
Instruction 3:               [Fetch][Decode][Execute][Memory][WriteBack]
Instruction 4:                      [Fetch][Decode][Execute][Memory][WriteBack]
Instruction 5:                             [Fetch][Decode][Execute][Memory][WriteBack]

5단계 구조라면 이상적인 성능 향상은 5배다. 다만 해저드가 발생하므로 실제 성능 향상은 3~4배에 머문다.

IF(Fetch)ID(Decode)EX(Execute)MEM(Memory)WB(Write Back)명령어 1명령어 2명령어 3명령어 4명령어 5

RISC와 CISC에서 달라지는 단계 구성

RISC의 전형적인 파이프라인은 IF, ID, EX, MEM, WB로 구성된다.

  • IF(Instruction Fetch): PC(Program Counter) 값을 이용해 메모리에서 명령어를 읽고 명령어 레지스터에 저장한다.
  • ID(Instruction Decode): 명령어와 Opcode를 해석하고 레지스터를 읽으며 제어 신호를 만든다.
  • EX(Execute): ALU 산술·논리 연산, Load/Store 주소 계산, 분기 주소 계산을 수행한다.
  • MEM(Memory Access): 메모리를 읽거나 쓴다. 연산 명령어는 이 단계를 건너뛴다.
  • WB(Write Back): 결과를 레지스터에 기록하고 레지스터 파일을 갱신한다.
Clock CycleCycle 1Cycle 2Cycle 3Cycle 4Cycle 5Inst1: IFInst1: IDInst2: IFInst1: EXInst2: IDInst3: IFInst1: MEMInst2: EXInst3: IDInst4: IFInst1: WBInst2: MEMInst3: EXInst4: IDInst5: IF

CISC 파이프라인은 복잡한 명령어를 처리하고 마이크로 명령어로 변환해야 하므로 더 많은 단계를 둔다. Intel Core는 10~20단계 구조이며, Instruction Fetch, Instruction Length Decode, Instruction Decode, Micro-op Generation, Micro-op Queue, Register Rename, Reservation Station, Execute, Memory Access, Write Back, Retirement 같은 흐름을 사용한다. 구조가 복잡한 대신 높은 클럭 속도를 낼 수 있지만 해저드 처리는 더 까다로워진다.

처리량은 CPI와 해저드 손실로 판단한다

비파이프라인 5단계 구조의 CPI는 5이고, 이상적인 파이프라인은 CPI 1을 목표로 한다.

비파이프라인: CPI = 5 (5단계)
파이프라인: CPI = 1 (이상적)

속도 향상은 단계 수에 대응한다.

Speedup = 단계 수 = 5배

처리량도 다음처럼 달라진다.

비파이프라인: 1 명령어 / 5 사이클
파이프라인: 1 명령어 / 사이클 (이상적)

실제 CPI에는 해저드로 인한 지연이 더해진다.

실제 CPI = 1 + 해저드로 인한 지연
실제 CPI ≈ 1.2 ~ 1.5

따라서 실제 속도 향상은 다음과 같이 계산된다.

Speedup = 5 / 1.3 ≈ 3.8배

파이프라인 깊이도 성능 특성을 좌우한다. 5단계처럼 얕은 구조는 해저드 페널티가 작지만 클럭 속도가 낮고, 20단계처럼 깊은 구조는 높은 클럭 속도를 낼 수 있는 대신 페널티가 커진다. Intel Pentium 4는 31단계 파이프라인의 사례다. 현대 CPU는 클럭 속도와 해저드 페널티의 균형을 위해 10~15단계 구조를 사용한다.

파이프라인 깊이 장점 단점
얕음 (5단계) 해저드 페널티 작음 낮은 클럭 속도
깊음 (20단계) 높은 클럭 속도 해저드 페널티 큼
최적 (10~15) 균형 구현 복잡도
파이프라인깊이얕음(5단계)중간(10~15단계)깊음(20단계)낮은 클럭작은 페널티최적 균형현대 CPU높은 클럭 페널티

실행 흐름을 멈추게 하는 해저드

데이터 해저드는 이전 명령어의 결과를 다음 명령어가 필요로 할 때 발생한다. 대표적인 형태는 RAW(Read After Write) 의존성이다.

ADD R1, R2, R3      ; R1 = R2 + R3
SUB R4, R1, R5      ; R4 = R1 - R5 (R1 필요)

데이터 포워딩, 스톨 삽입, 컴파일러 최적화로 이를 처리한다.

제어 해저드는 분기 명령어가 실행 흐름을 바꾸기 때문에 발생한다. 분기 결과가 정해지기 전에는 다음 명령어가 실행될지 알 수 없다.

BEQ R1, R2, label   ; R1 == R2면 label로 분기
ADD R3, R4, R5      ; 실행될지 모름

분기 예측, 분기 지연 슬롯, 추측 실행이 제어 해저드 대응에 사용된다.

구조적 해저드는 여러 명령어가 동시에 같은 하드웨어 자원을 요구할 때 생긴다. 메모리 접근 충돌이나 ALU 자원 충돌이 해당한다. 자원 복제, 파이프라인 스톨, 명령어 캐시와 데이터 캐시의 분리로 충돌을 완화할 수 있다.

포워딩과 예측으로 빈 파이프라인을 줄인다

데이터 포워딩은 EX 단계에서 나온 결과를 메모리나 레지스터를 거치지 않고 다음 명령어의 EX 단계로 전달한다. 이 방식은 스톨을 줄여 성능을 높인다.

ForwardingADD R1, R2, R3EX 단계결과 생성SUB R4, R1, R5EX 단계R1 사용MEMWB(R1 저장)

분기 예측은 분기 결과를 미리 판단하고 예측 경로의 명령어를 먼저 실행하는 기법이다. 예측이 틀리면 파이프라인을 플러시한다. 정적 예측에는 항상 분기하지 않음(Not Taken), 항상 분기함(Taken), 컴파일 타임 예측이 있으며, 동적 예측에는 분기 히스토리 테이블(BHT)과 2비트 카운터가 사용된다. 예측 정확도는 9095%이며, 깊은 파이프라인에서는 예측 실패로 1020 사이클을 잃을 수 있다.

추측 실행은 분기 예측 결과를 바탕으로 명령어를 미리 실행하고, 예측이 맞으면 결과를 사용하며 틀리면 폐기한다. Reorder Buffer, 명령어 재정렬, 결과 임시 저장이 구현에 포함된다.

슈퍼스칼라는 한 사이클에 여러 명령어를 실행하기 위해 여러 파이프라인을 함께 운영하는 구조다. 동적 명령어 스케줄링을 사용하며, 2-way 슈퍼스칼라는 2개 명령어/사이클, 4-way 슈퍼스칼라는 4개 명령어/사이클을 실행한다. IPC가 증가하므로 CPI < 1도 가능하다.

슈퍼스칼라(4-way)Pipeline 1Pipeline 2Pipeline 3Pipeline 4 사이클에4개 명령어 실행

Out-of-Order 실행은 명령어를 순서대로 발행하되 실행은 비순차적으로 처리하는 방식이다. 의존성이 없는 명령어를 먼저 실행하고 Reorder Buffer에서 순서대로 결과를 커밋한다. 데이터 해저드를 피하고 파이프라인 활용도를 높이는 데 쓰인다.

CPU별 파이프라인 구조

MIPS는 5단계 파이프라인을 사용하며 단순하고 효율적인 구조로 교육용으로 많이 쓰인다. ARM Cortex-A는 8~15단계, Out-of-Order 실행, 슈퍼스칼라 구조를 사용한다.

Intel Core는 세대에 따라 1419단계 파이프라인, Out-of-Order 실행, 46 way 슈퍼스칼라, 복잡한 분기 예측을 사용한다. AMD Zen은 13단계 파이프라인과 Out-of-Order 실행, 4-way 슈퍼스칼라 구조를 사용한다.

CPU 파이프라인 깊이 슈퍼스칼라 Out-of-Order 분기 예측
MIPS R2000 5단계 1-way 순차 정적
ARM Cortex-A9 8단계 2-way Out-of-Order 동적
Intel Core i7 14~19단계 4~6-way Out-of-Order 고급 동적
AMD Zen 3 13단계 4-way Out-of-Order 동적

성능과 설계 복잡도 사이의 균형

파이프라인은 단위 시간당 처리 명령어 수를 늘리고, 깊은 구조에서는 각 단계를 단순하게 만들어 높은 클럭 주파수를 가능하게 한다. 여러 하드웨어 유닛을 동시에 활용할 수 있어 자원 활용도도 높아진다.

반면 데이터·제어·구조적 해저드는 성능을 떨어뜨린다. 이를 탐지하고 해결하려면 포워딩과 분기 예측 같은 구조가 필요해 하드웨어 복잡도가 커진다. 특히 깊은 파이프라인은 분기 예측 실패 페널티가 크며, 추측 실행은 불필요한 연산으로 전력 소비를 늘릴 수 있다.

CPU파이프라인컴퓨터구조해저드명령어 실행