Ryotta's Basic

Arch
🏗️ Arch 검증완료

title: CPU 마이크로아키텍처 기초
date: 2025-06-26
category: arch
tags: [microarchitecture, pipeline, ISA, IPC, superscalar, out-of-order]


CPU 마이크로아키텍처 기초

개요

CPU 마이크로아키텍처(Microarchitecture)는 명령어 세트 아키텍처(ISA)가 실제 프로세서 하드웨어에서 어떻게 구현되는지를 나타내는 컴퓨터 공학의 핵심 분야이다. ISA는 프로그래머나 컴파일러가 관찰하는 프로세서의 프로그래밍 모델인 반면, 마이크로아키텍처는 파이프라인 깊이, 캐시 구조, 실행 유닛 배치, 분기 예측 메커니즘 등 프로세서 내부의 구체적인 하드웨어 조직과 동작 방식을 정의한다.

동일한 ISA(예: x86-64, ARMv8)라도 마이크로아키텍처 설계에 따라 성능, 전력 소모, 칩 면적이 크게 달라진다. 인텔의 Alder Lake과 AMD의 Zen 4는 모두 x86-64 ISA를 구현하지만, 파이프라인 깊이, 분기 예측 정확도, 실행 유닛 배치 등에서 근본적인 차이를 보인다. 따라서 마이크로아키텍처를 이해하는 것은 현대 프로세서의 성능 분석과 최적화에 필수적인 기초 지식이다.

핵심 개념

ISA와 마이크로아키텍처의 관계

구분 ISA (명령어 세트 아키텍처) 마이크로아키텍처
정의 프로그래머가 관찰하는 프로세서의 프로그래밍 모델 ISA의 실제 하드웨어 구현 방식
포함 요소 명령어 형식, 레지스터, 주소 지정 방식, 데이터 타입 파이프라인, 캐시, 실행 유닛, 분기 예측, 레지스터 리네이밍
변화 주기 수십 년 유지 (예: x86은 1978년부터) 수 년마다 새로운 마이크로아키텍처 등장
영향 소프트웨어 호환성 보장 성능, 전력, 칩 면적 결정

명령어 사이클 (Instruction Cycle)

모든 CPU는 다음 4단계를 반복하여 프로그램을 실행한다:

  1. Fetch (인출): 메모리에서 다음 명령어를 가져온다
  2. Decode (해독): 명령어의 동작과 피연산자를 해석한다
  3. Execute (실행): ALU, FPU 등에서 연산을 수행한다
  4. Write Back (기록): 결과를 레지스터나 메모리에 기록한다
Instruction Cycle

파이프라인 (Pipeline)

파이프라인은 명령어 처리의 각 단계를 독립적인 하드웨어 유닛으로 분리하여, 여러 명령어가 동시에 처리되도록 하는 기술이다. 자동차 조립 라인과 유사하게, 한 명령어가 Execute 단계에 있을 때 다음 명령어는 Decode 단계를, 그 다음 명령어는 Fetch 단계를 수행할 수 있다.

파이프라인의 이점:
- 클럭 주기가 하나의 명령어를 완전히 처리하는 데 필요한 시간이 아닌, 가장 느린 파이프라인 스테이지의 시간으로 결정된다
- 이상적으로는 매 클럭 주기마다 하나의 명령어가 완료된다 (CPI = 1)
- Throughput이 크게 향상된다

파이프라인 깊이와 성능:

파이프라인 깊이 장점 단점
얕음 (5~7단계) Branch penalty가 적음, 설계 단순 클럭 주기가 길어짐
깊음 (14~20+단계) 높은 클럭 빈도 달성 Branch penalty 증가, hazard 관리 복잡

현대 프로세서는 일반적으로 14~20단계의 파이프라인을 사용하며, 인텔 Pentium 4는 31단계까지 도달한 바 있다.

파이프라인 hazard

파이프라인은 세 가지 유형의 hazard로 인해 stall(지연)이 발생할 수 있다:

1. 구조적 hazard (Structural Hazard)
- 두 명령어가 동일한 하드웨어 리소스를 동시에 필요로 할 때 발생
- 해결: 파이프라인 스테이지별 독립 하드웨어 제공, 리소스 중복

2. 데이터 hazard (Data Hazard)
- 후속 명령어가 앞선 명령어의 결과에 의존할 때 발생
- 세 가지 유형:
- Read After Write (RAW): 가장 일반적
- Write After Read (WAR)
- Write After Write (WAW)
- 해결: Operand Forwarding (Bypassing), 레지스터 리네이밍

3. 제어 hazard (Control Hazard)
- 분기 명령어의 결과가 결정되기 전에 다음 명령어를 인출해야 할 때 발생
- 해결: 분기 예측, speculative execution, 리스크 감지

분기 예측 (Branch Prediction)

분기 예측은 제어 hazard를 완화하기 위한 핵심 기술이다. 프로세서가 분기 명령어의 결과를 알기 전에 어떤 경로를 실행할지 미리 결정한다.

분기 예측 방식:

방식 설명 정확도
Always Not Taken 분기를 항상 취하지 않는 것으로 예측 ~60%
1-bit Predictor 이전 분기 결과를 기억 ~70%
2-bit Saturating Counter 두 번 실패해야 예측 변경 ~80%
Correlating Predictor 이전 분기 패턴과 연관 ~85%
Tournament Predictor 여러 예측기를 조합 ~90%
Neural Predictor (TAGE) 다중 역사 레벨 활용 ~95%+

현대 프로세서는 TAGE(Tagged Geometric History Length)나 perceptron 기반 예측기를 사용하여 95% 이상의 정확도를 달성한다.

슈퍼스칼라 (Superscalar)

슈퍼스칼라 프로세서는 매 클럭 주기마다 여러 명령어를 동시에 인출하고 실행할 수 있는 구조이다. 이를 위해 여러 개의 실행 유닛(ALU, FPU, Load/Store 유닛 등)을 병렬로 배치한다.

슈퍼스칼라의 특징:
- Issue Width: 매 클럭 주기에 인출할 수 있는 최대 명령어 수 (예: 4-way, 6-way, 8-way)
- 실행 유닛 중복 배치로 병렬 처리 능력 향상
- 복잡한 명령어 스케줄링 로직 필요

대표적인 슈퍼스칼라 프로세서:
- Intel Skylake: 6-wide issue, 8 execution ports
- AMD Zen 4: 6-wide issue, 10 execution ports
- Apple M2: 8-wide issue

Out-of-Order 실행 (Out-of-Order Execution)

Out-of-Order 실행은 데이터 의존성으로 인해 stall이 발생할 때, 준비가 된 후속 명령어를 먼저 실행하여 파이프라인 활용도를 높이는 기술이다.

동작 원리:
1. Fetch/Decode: 명령어를 순서대로 인출하고 해독한다
2. Rename/Allocate: 레지스터 리네이밍으로 WAW, WAR hazard 제거
3. Issue/Dispatch: 실행 준비가 된 명령어를 실행 유닛에 배정
4. Execute: 명령어를 실행한다 (순서와 무관하게)
5. Reorder Buffer (ROB)에서 Commit: 원래 순서대로 결과를 반영

ROB(Reorder Buffer)의 역할:
- 명령어 실행 결과를 임시 보관
- 예외(exception) 발생 시 파이프라인을 정확한 지점에서 복원
- 원래 명령어 순서대로 결과를 커밋(commit)

레지스터 리네이밍 (Register Renaming)

레지스터 리네이밍은 물리적 레지스터 파일의 크기가 논리적 레지스터보다 훨씬 큰 것을 활용하여, 이름 의존성(name dependency)으로 인한 불필요한 stall을 제거하는 기술이다.

작동 방식:
- 디코더가 명령어를 디코딩할 때 사용되는 논리적 레지스터 번호를 물리적 레지스터로 매핑
- 동일한 논리적 레지스터를 사용하는 명령어들이라도 실제 다른 물리적 레지스터에 결과를 저장
- WAW(Write After Write)와 WAR(Write After Read) hazard를 완전히 제거

활용 예:

; 원래 코드
ADD R1, R2, R3    ; R1 = R2 + R3
SUB R4, R1, R5    ; R4 = R1 - R5
ADD R1, R6, R7    ; R1 = R6 + R7 (WAW hazard)

; 리네이밍 후
ADD P10, P2, P3   ; P10 = P2 + P3
SUB P11, P10, P5  ; P11 = P10 - P5
ADD P12, P6, P7   ; P12 = P6 + P7 (WAW hazard 제거)

실행 유닛 (Execution Units)

현대 프로세서는 다양한 연산을 수행하기 위해 여러 실행 유닛을 포함한다:

실행 유닛 역할 대표 지연 시간
ALU (Arithmetic Logic Unit) 정수 연산 (덧셈, 뺄셈, 비트 연산) 1클럭
AGU (Address Generation Unit) 주소 계산 1클럭
FPU (Floating Point Unit) 부동소수점 연산 3~5클럭
SIMD/Vector Unit 벡터 연산 (AVX, NEON) 3~5클럭
Load Unit 메모리에서 데이터 로드 4~5클럭 (L1 hit)
Store Unit 데이터를 메모리에 기록 1클럭 (버퍼까지)
Branch Unit 분기 처리 및 예측 1클럭

비교/분석

마이크로아키텍처 설계 전략 비교

전략 특징 장점 단점 대표 사례
In-Order Execution 명령어를 순서대로 실행 설계 단순, 전력 소모 적음 파이프라인 활용도 낮음 ARM Cortex-A5, Intel Atom
Out-of-Order Execution 의존성이 없는 명령어를 먼저 실행 높은 성능, 파이프라인 활용도 향상 복잡도 높음, 전력 소모 증가 Intel Core, AMD Zen, Apple M
Superscalar 매 클럭 여러 명령어 실행 높은 IPC 복잡한 스케줄링 로직 대부분의 현대 프로세서
VLIW 컴파일러가 명령어 병렬성 결정 하드웨어 단순 컴파일러 복잡도 높음 Intel Itanium, TI DSP
RISC 단순한 명령어, 빠른 디코딩 높은 클럭 빈도, 파이프라인 용이 코드 밀도 낮음 ARM, MIPS, RISC-V
CISC 복잡한 명령어, 가변 길이 높은 코드 밀도 디코딩 복잡 x86, x86-64

현대 프로세서 마이크로아키텍처 비교

프로세서 Issue Width 파이프라인 깊이 L1 Cache 분기 예측 정확도 특징
Intel Raptor Cove 6-wide ~20 stages 32KB I + 48KB D ~95% Large ROB (512 entry)
AMD Zen 4 6-wide ~19 stages 32KB I + 32KB D ~93% 클럭 빈도 우선
Apple M2 (Avalanche) 8-wide ~12 stages 192KB I + 128KB D ~96% 넓은 파이프라인, 얕은 깊이
ARM Cortex-X3 6-wide ~11 stages 64KB I + 64KB D ~90% 모바일 최적화

동작 원리

파이프라인 동작 상세

5단계 클래식 RISC 파이프라인을 기준으로 동작 원리를 설명한다:

Pipeline Execution

Cycle 1: Fetch 단계에서 명령어 I1을 인출
Cycle 2: I1은 Decode로 이동, I2를 Fetch
Cycle 3: I1은 Execute로, I2는 Decode로, I3을 Fetch
Cycle 4: I1은 Memory Access로, I2는 Execute로, I3은 Decode로, I4를 Fetch
Cycle 5: I1은 Write Back으로, I2는 Memory Access로, I3은 Execute로, I4는 Decode로, I5를 Fetch
Cycle 6: I1 완료, I2는 Write Back으로, I3은 Memory Access로, I4는 Execute로, I5는 Decode로

이렇게 매 클럭마다 새로운 명령어가 파이프라인에 진입하고, 5클럭 후부터 매 클럭 하나의 명령어가 완료된다.

Out-of-Order 실행 흐름

  1. Fetch Stage: 분기 예측기를 기반으로 명령어를 인출
  2. Decode Stage: 명령어를 해석하고 마이크로오퍼레이션으로 변환
  3. Rename Stage: 논리적 레지스터를 물리적 레지스터로 매핑
  4. Allocate Stage: ROB, Reservation Station에 자원 할당
  5. Issue Stage: 준비가 된 명령어를 실행 유닛에 배정 (순서 무관)
  6. Execute Stage: 실제 연산 수행
  7. Write Back Stage: 결과를 물리적 레지스터에 기록
  8. Commit Stage: ROB에서 원래 순서대로 결과를 커밋

장단점

장점

  • 높은 성능: 파이프라인, 슈퍼스칼라, Out-of-Order 실행을 통해 높은 IPC 달성
  • 유연성: 동일한 ISA로 다양한 성능/전력 포지션의 프로세서 설계 가능
  • 소프트웨어 호환성: ISA를 유지하면서 마이크로아키텍처만 업그레이드 가능
  • 자동 최적화: Out-of-Order 실행과 분기 예측이 하드웨어 수준에서 자동으로 성능 최적화

단점

  • 설계 복잡도: 현대 마이크로아키텍처는 수십억 개의 트랜지스터를 포함
  • 전력 소모: 복잡한 제어 로직과 레지스터 리네이밍이 전력 소모를 증가시킴
  • 제조 비용: 복잡한 설계로 인한 높은 다이 면적과 낮은 수율
  • 보안 취약점: Spectre, Meltdown과 같은 사이드 채널 공격에 취약

관련 기술

참고 문헌

  • Hennessy, J. L., & Patterson, D. A. (2017). Computer Architecture: A Quantitative Approach (6th ed.). Morgan Kaufmann.
  • Patterson, D. A., & Hennessy, J. L. (2020). Computer Organization and Design: The Hardware/Software Interface (RISC-V Edition). Morgan Kaufmann.
  • Shimizu, T. (2020). "CPU 마이크로아키텍처 입문". 한빛아카데미.
  • Intel 64 and IA-32 Architectures Optimization Reference Manual.
  • AMD64 Architecture Programmer's Manual.

관련 기술 문서

핵심 정리

  1. CPU 마이크로아키텍처는 ISA의 실제 하드웨어 구현 방식으로, 파이프라인 깊이, 캐시 구조, 실행 유닛 배치 등을 정의한다.
  2. 파이프라인은 명령어 처리 단계를 분리하여 throughput을 향상시키며, 현대 프로세서는 14~20단계의 깊은 파이프라인을 사용한다.
  3. 슈퍼스칼라와 Out-of-Order 실행은 명령어 수준 병렬성(ILP)을 극대화하여 매 클럭 여러 명령어를 처리할 수 있게 한다.
  4. 분기 예측과 레지스터 리네이밍은 파이프라인 hazard를 완화하는 핵심 기술로, 현대 프로세서의 성능에 결정적인 영향을 미친다.
  5. 동일한 ISA라도 마이크로아키텍처 설계에 따라 성능, 전력, 칩 면적이 크게 달라지며, 이는 프로세서 경쟁의 핵심 축이다.