CPU 병렬처리 기법: 파이프라이닝부터 EPIC까지
CPU 명령어 병렬처리의 실행 단계와 파이프라이닝, 슈퍼스칼라, VLIW, EPIC의 구조·트레이드오프를 정리한다.
2026-08-14 · 최초 발행 2025-12-28
명령어 실행을 겹치기 위해 알아야 할 기본 흐름
CPU는 명령어를 인출하고, 해석하고, 실행한 뒤 결과를 기록한다. 병렬처리 기법은 이 흐름 자체를 없애는 것이 아니라, 서로 다른 명령어가 각 단계를 겹쳐 쓰도록 만들어 유휴 시간을 줄인다.
FI(Fetch Instruction)는 PC(Program Counter)가 가리키는 주소에서 다음 명령어를 읽어 IR(Instruction Register)에 넣고, PC를 다음 주소로 증가시키는 단계다. 프로그램 카운터, 명령어 레지스터, 메모리 버스가 관여하며 일반적으로 1 클럭 사이클이 걸린다.
DI(Decode Instruction)에서는 제어 유닛이 IR의 명령어를 분석한다. ADD, SUB, LOAD, STORE 등의 연산 타입을 식별하고 피연산자 주소를 계산해 제어 신호를 생성한다. 제어 유닛과 디코더가 중심이며, 일반적으로 1 클럭 사이클이 소요된다.
EI(Execute Instruction)는 피연산자를 레지스터나 메모리에서 가져와 ALU(Arithmetic Logic Unit)에서 연산하고, 결과를 임시 레지스터에 저장하는 구간이다. ALU, 범용 레지스터, 메모리 접근 장치가 사용되며 연산 복잡도에 따라 1~수십 클럭 사이클이 걸린다.
WB(Write Back)는 실행 결과를 레지스터 또는 메모리에 반영하고 Zero, Carry, Overflow 등의 상태 플래그를 갱신하는 단계다. 레지스터 파일과 메모리 쓰기 버퍼가 관련되며 일반적으로 1 클럭 사이클이 필요하다.
명령어 하나가 네 단계를 모두 끝낸 뒤 다음 명령어를 시작하면, 실행 중인 단계 외의 하드웨어는 대기한다.
이 방식에서는 4단계 가운데 3단계(75%)가 놀게 된다. 병렬처리 기법은 이 공백을 줄이는 데서 출발한다.
파이프라인은 각 단계를 다른 명령어에 배정한다
파이프라이닝은 명령어 실행 단계를 겹쳐 여러 명령어를 동시에 처리하는 방식이다. 조립 라인처럼 각 단계가 서로 다른 명령어를 맡으며, 목표는 매 클럭 사이클마다 하나의 명령어를 완료하는 것이다.
이상적으로는 스테이지 수만큼 처리량이 높아지고 모든 하드웨어 유닛이 계속 작업한다. 개별 명령어의 응답 시간은 같지만, 전체 처리량은 개선된다.
다만 명령어 간 충돌은 파이프라인의 진행을 멈추거나 되돌릴 수 있다.
- 구조적 위험(Structural Hazard)은 필요한 하드웨어 자원이 부족할 때 생긴다. 명령어와 데이터가 같은 메모리를 쓰는 경우가 예이며, 명령어 캐시와 데이터 캐시를 분리하는 방식으로 대응할 수 있다.
- 데이터 위험(Data Hazard)은 앞선 명령어의 결과가 준비되기 전에 다음 명령어가 그것을 요구할 때 발생한다.
ADD R1, R2, R3 // R1 = R2 + R3
SUB R4, R1, R5 // R4 = R1 - R5 (R1이 아직 준비 안 됨)
포워딩(Forwarding)으로 결과를 바로 전달하거나, 스톨(Stall)로 파이프라인을 멈추거나, 컴파일러가 명령어를 재배치하는 방법을 사용할 수 있다.
- 제어 위험(Control Hazard)은 분기(Branch) 명령어 때문에 다음 명령어 예측이 빗나갈 때 발생한다. 분기 예측(Branch Prediction), 지연 슬롯(Delay Slot), 추측 실행(Speculative Execution)이 대응 수단이다.
더 짧은 단계와 다중 발행
슈퍼 파이프라이닝은 파이프라인 스테이지를 더 잘게 나눠 클럭 주기를 줄이는 방식이다. 예를 들어 4단계를 8단계 또는 그 이상으로 분할해 같은 시간에 더 많은 명령어 단계를 처리한다.
클럭 속도와 처리량은 높일 수 있지만, 파이프라인 레지스터가 늘어 하드웨어 복잡도가 커진다. 제어 위험의 패널티와 전력 소모도 증가한다.
슈퍼스칼라는 한 클럭 사이클에 여러 명령어를 발행(issue)하고 실행 유닛을 병렬 운용한다. 2-way Super Scalar는 사이클당 최대 2개 명령어를 실행한다.
하드웨어는 의존성을 분석해 동시에 실행할 수 있는 명령어를 판별한다. 의존성이 없는 명령어는 순서를 바꿔 먼저 실행할 수 있고, Reorder Buffer는 결과를 프로그램 순서대로 재정렬한다. 높은 병렬성과 동적 스케줄링의 유연성이 장점이지만, 의존성 검사와 스케줄링 로직이 복잡하고 전력 소모와 설계 검증 부담이 커진다.
슈퍼 파이프라이닝과 슈퍼스칼라를 함께 적용하면 깊은 파이프라인(8단계 이상)과 여러 명령어의 동시 발행(2-way, 4-way 등)을 결합한다. Intel Pentium Pro, AMD K6 등이 대표 프로세서다.
슈퍼스칼라의 병렬성과 슈퍼 파이프라이닝의 속도 향상을 함께 얻는 대신 설계 복잡도는 매우 높아진다.
컴파일러가 병렬성을 드러내는 VLIW와 EPIC
VLIW(Very Long Instruction Word)는 동시에 실행할 수 있는 여러 명령어를 하나의 긴 명령어로 묶는다. 컴파일러가 컴파일 시점에 병렬성을 분석하고 스케줄링하며, 하나의 VLIW 명령어가 여러 실행 유닛을 동시에 제어한다. 명령어는 128비트, 256비트 또는 그 이상의 길이를 가질 수 있다.
원본 코드는 다음과 같다.
a = b + c;
d = e * f;
g = h - i;
컴파일러는 이를 다음 VLIW 명령어로 만들 수 있다.
[ADD R1,R2,R3 | MUL R4,R5,R6 | SUB R7,R8,R9 | NOP]
이 하나의 VLIW 명령어는 3개의 연산을 동시에 수행한다. 하드웨어가 수행할 의존성 검사를 컴파일러가 맡으므로 회로는 단순하고, Super Scalar보다 저전력이며 컴파일 시점에 성능을 결정할 수 있다. 반대로 뛰어난 컴파일러가 필요하고, NOP으로 채워진 슬롯이 많으면 코드 크기가 증가한다. 다른 VLIW 프로세서와의 바이너리 호환성도 어렵다.
대표적인 VLIW 프로세서로는 EPIC 아키텍처(VLIW 기반)의 Intel Itanium, DSP 프로세서인 Texas Instruments C6000, x86 에뮬레이션 프로세서인 Transmeta Crusoe가 있다.
EPIC(Explicitly Parallel Instruction Computing)은 VLIW를 발전시킨 명시적 병렬 명령어 컴퓨팅 방식이다. 컴파일러가 병렬성을 명시적으로 지정하며, Intel과 HP가 공동 개발한 IA-64 아키텍처(Itanium)가 대표적이다. VLIW보다 유연한 명령어 번들링과 추측 실행을 지원한다.
Instruction Bundling은 3개의 명령어를 하나의 128비트 번들로 구성하고, 명령어 타입 조합은 5비트 템플릿으로 지정한다.
[Template=0 | Inst1 (41 bits) | Inst2 (41 bits) | Inst3 (41 bits)]
Predication(서술화)은 조건부 실행에 술어(predicate) 레지스터를 사용한다. 분기 없이 조건을 처리해 파이프라인 스톨을 줄인다.
(p1) ADD R1, R2, R3 // p1이 참일 때만 실행
(p2) SUB R4, R5, R6 // p2가 참일 때만 실행
Speculation(추측 실행)은 분기 결과를 예측해 명령어를 미리 실행하고, 예측이 실패하면 결과를 무효화한 뒤 재실행한다. Control Speculation은 분기 예측을, Data Speculation은 메모리 의존성 예측을 다룬다. 소프트웨어 파이프라이닝은 루프를 겹쳐 실행하는 방식이며 Loop Unrolling + Pipelining으로 루프 안의 병렬성을 높인다.
| 특징 | VLIW | EPIC |
|---|---|---|
| 명령어 형식 | 고정 길이 | 가변 번들 |
| 병렬성 표현 | 고정 슬롯 | 유연한 템플릿 |
| 조건 실행 | 제한적 | Predication 지원 |
| 추측 실행 | 없음 | 하드웨어 지원 |
| 코드 밀도 | 낮음 | 상대적으로 높음 |
EPIC은 매우 높은 ILP(Instruction Level Parallelism), Super Scalar 대비 우수한 전력 효율, 명시적 병렬성에 따른 최적화 용이성을 제시한다. 하지만 Intel Itanium은 상업적으로 실패했고, 최적화 컴파일러 개발의 난이도, x86 호환성 부족, 특정 워크로드에서만 성능 우위를 보이는 범용성 문제가 한계로 남았다.
기법별 성능 가정과 적용 범위
| 기법 | CPI (Cycles Per Instruction) | 상대 성능 |
|---|---|---|
| 순차 실행 | 4.0 | 1× |
| Pipelining (4-stage) | 1.0 | 4× |
| Super Pipelining (8-stage) | 0.5 | 8× |
| Super Scalar (4-way) | 0.25 | 16× |
| VLIW (4-way) | 0.25 | 16× |
| EPIC (4-way + 최적화) | 0.2 | 20× |
실제 성능은 워크로드, 의존성, 분기 예측 등에 따라 크게 달라진다.
파이프라이닝은 모든 현대 프로세서의 기본 기법이다. Super Scalar는 Intel Core, AMD Ryzen 같은 범용 CPU에서 사용되며, VLIW는 DSP와 임베디드 프로세서에 적용된다. EPIC은 과학 계산과 서버를 대상으로 했고, Itanium은 현재 단종됐다.
클럭 이후의 병렬성
클럭 속도를 높이면 전력 소모가 급증한다(P ∝ f³). 이 전력 장벽(Power Wall)은 여러 코어를 낮은 클럭으로 운영하는 멀티코어 전환의 배경이 됐다.
병렬성은 명령어 수준을 넘어 Thread-Level Parallelism으로 확장된다. GPU는 수천 개의 간단한 코어로 대량 병렬 처리를 수행하고, Heterogeneous Computing은 CPU + GPU + 전용 가속기를 함께 사용한다.
소프트웨어 쪽에서는 멀티스레드, 동기화, 데드락이 복잡도를 높인다. Amdahl의 법칙은 순차 부분이 성능 향상을 제한한다는 점을 보여주며, VLIW와 EPIC에서는 컴파일러 최적화가 성패를 좌우한다. CPU 병렬처리는 하드웨어 복잡도, 전력 소모, 소프트웨어 의존성 사이의 트레이드오프를 다루는 문제다.