Ryotta's Basic

System
🖥️ System 검증완료

title: CPU Cache Architecture
date: 2025-06-21
category: system
tags: [cache, CPU, memory hierarchy, MESI, associativity, cache coherence]


CPU Cache Architecture

개요

CPU Cache Architecture는 프로세서와 메인 메모리(DRAM) 사이의 속도 격차를 해소하기 위한 핵심 하드웨어 메커니즘이다. 현대 CPU는 수 GHz 클럭으로 동작하는 반면 DRAM은 수백 사이클의 지연(latency)을 가지므로, 레지스터와 DRAM 사이에 다층 캐시 계층(hierarchy)을 배치하여 평균 메모리 접근 시간을 최소화한다.

캐시 아키텍처의 설계 결정은 프로세서 성능에 직접적인 영향을 미치며, 멀티코어 시스템에서는 캐시 일관성(coherence) 문제까지 해결해야 한다. 따라서 CPU 캐시 구조를 이해하는 것은 컴퓨터 아키텍처 학습의 기초이자, 실리콘 수준의 성능 최적화에 필수적인 지식이다.

핵심 개념

캐시 계층 구조 (Cache Hierarchy)

현대 멀티코어 프로세서는 일반적으로 3단계의 캐시 계층을 사용한다:

  • L1 Cache (1차 캐시): CPU 코어에 가장 가까운 캐시. 명령어/Instruction(L1I)과 데이터(L1D)로 분리된 구조(하버스트 아키텍처)가 일반적이다. 크기는 32~64KB, 접근 지연은 3~5클럭 사이클이다.
  • L2 Cache (2차 캐시): 각 코어에 전용으로 배치되며, L1 miss 시 접근된다. 크기는 256KB~1MB, 지연은 10~20클럭이다. unified 구조(명령어+데이터 혼용)가 일반적이다.
  • L3 Cache (3차 캐시 / LLC): 모든 코어가 공유하는 마지막 캐시 계층이다. 크기는 수MB~수십MB, 지연은 30~50클럭이다. 멀티코어 간 캐시 일관성 프로토콜이 이 계층에서 작동한다.
CPU Cache Hierarchy

캐시 조직 방식 (Associativity)

캐시 블록이 어떤 위치에 저장될 수 있는지를 결정하는 방식으로, 성능과 하드웨어 복잡도의 트레이드오프를 결정한다.

  • Direct-Mapped (1-way): 각 메모리 주소가 캐시의 정확히 한 위치에만 매핑된다. index = address % num_sets. 하드웨어가 가장 단순하지만, 충돌 miss(conflict miss)가 잦다.
  • Set-Associative (N-way): 각 세트(set)에 N개의 블록이 저장된다. 접근 시 N개 블록을 병렬로 비교하여 hit 여부를 판별한다. 일반적으로 L1은 8-way, L3는 16-way가 사용된다.
  • Fully Associative: 캐시의 모든 블록에 어떤 주소든 저장 가능하다. 충돌 miss가 없지만, N개 비교기(comparator)가 필요하므로 소형 캐시(TLB 등)에만 사용된다.
Cache Associativity

주소 변환 (Address Translation)

물리 주소(Physical Address)는 캐시 접근 시 다음과 같이 분할된다:

비트 필드 역할 설명
Tag 블록 식별 해당 세트 내에서 어떤 메모리 블록인지 판별
Index 세트 선택 캐시의 어느 세트에 접근할지 결정 (Direct-mapped: 전체 캐시 라인 수, Set-assoc: 세트 수)
Offset 바이트 위치 블록 내에서 특정 바이트를 선택 (블록 크기에 따라 결정)

예: 64KB L1D 캐시, 64B 블록, 8-way set-associative인 경우:
- Index = log₂(64KB / (8 × 64B)) = log₂(128) = 7비트
- Offset = log₂(64) = 6비트
- Tag = 나머지 비트

캐시 라인과 포함 정책 (Cache Line & Inclusion Policy)

캐시는 보통 고정 크기의 cache line 또는 block 단위로 데이터를 이동한다. 64B 라인은 공간 지역성을 잘 살릴 수 있어 일반적인 선택이며, 주소의 Offset 비트 수와도 직접 연결된다.

다중 계층 캐시에서는 상위 캐시와 하위 캐시의 포함 관계가 중요하다.

정책 설명 의미
Inclusive 상위 캐시의 라인이 하위 캐시에 반드시 포함됨 무효화 전파가 쉽지만 중복 저장이 생긴다
Exclusive 같은 라인이 상위/하위 캐시에 중복 저장되지 않음 용량 효율이 좋지만 이동 관리가 복잡하다
Non-inclusive / Non-exclusive 포함 관계를 강제하지 않음 설계 자유도가 높고 구현에 따라 절충이 달라진다

대형 LLC는 제품과 세대에 따라 inclusive, exclusive, non-inclusive 중 하나를 선택하거나 혼합 정책을 사용한다. 이 선택은 eviction 동작, coherence 트래픽, 실효 용량에 직접 영향을 준다.

교체 정책 (Replacement Policy)

캐시가 가득 찼을 때 어떤 블록을 교체할지를 결정한다:

  • LRU (Least Recently Used): 가장 오래전에 접근된 블록을 교체한다. 일반적이나 N-way에서 O(N) 하드웨어 비용이 든다.
  • Pseudo-LRU (Tree-PLRU): 트리 구조로 근사 LRU. 비용을 줄이면서 실질적으로 LRU에 가까운 성능을 제공한다.
  • Random: 임의로 블록을 선택한다. 구현이 간단하고, 충돌 공격에 강하다. MIPS, AMD에서 사용.
  • FIFO: 먼저 들어온 블록부터 교체한다.

기입 정책 (Write Policy)

데이터 수정 시 캐시와 메모리 간 동기화 방식:

  • Write-Through: 모든 기입이 캐시와 상위 메모리에 동시에 반영된다. 일관성은 좋지만, 모든 기입에 메모리 접근이 필요하여 느리다.
  • Write-Back: 캐시에서만 기입하고, 해당 블록이 교체될 때만 상위 메모리에 반영(dirty bit 사용). 성능이 우수하지만 복잡도가 증가한다. 현대 CPU의 표준 방식.
  • Write-Allocate: Write miss 시 해당 블록을 캐시에 로드한 후 기입한다 (Write-back과 함께 사용).
  • No-Write-Allocate: Write miss 시 캐시에 로드하지 않고 바로 메모리에 기입한다 (Write-through와 함께 사용).

AMAT (Average Memory Access Time)

캐시 성능을 종합적으로 평가하는 지표:

AMAT = Hit Time + (Miss Rate × Miss Penalty)
  • Hit Time: 캐시에서 데이터를 찾는 시간 (L1: ~1ns, L2: ~3ns, L3: ~10ns)
  • Miss Rate: 접근 대비 miss 비율 (L1: 2~5%, L2: 10~20%, L3: 5~10%)
  • Miss Penalty: miss 시 추가 소요 시간 (다음 계층까지의 접근 비용)

다층 캐시의 경우 중첩으로 계산된다:

AMAT = L1_hit + L1_miss × (L2_hit + L2_miss × (L3_hit + L3_miss × DRAM_access))

비교/분석

캐시 교체 정책 비교

정책 구현 복잡도 정확도 하드웨어 비용 사용처
LRU 높음 높음 O(N) 소형 캐시
Pseudo-LRU 중간 중간 O(log N) L1/L2 캐시
Random 낮음 중간 O(1) 대형 캐시
FIFO 낮음 낮음 O(1) 특정 시스템
RRIP (Re-Reference Interval Prediction) 중간 높음 중간 LLC (Intel)

기입 정책 비교

정책 쓰기 지연 대역폭 사용 일관성 복잡도
Write-Through 낮음 (즉시 반영) 높음 (모든 기입이 메모리 접근) 높음 낮음
Write-Back 높음 (교체 시 반영) 낮음 (블록 단위로 반영) 중간 높음
Write-Allocate 중간 중간 중간 중간

현대 프로세서 캐시 사양 비교 (2024 기준)

프로세서 L1I L1D L2 L3 캐시 일관성
Intel Raptor Lake 32KB × 8-way 48KB × 12-way 2MB × 16-way 36MB × 12-way (공유) MESIF
AMD Zen 4 32KB × 8-way 32KB × 8-way 1MB × 8-way 32MB × 16-way (CCD 내) MOESI
Apple M3 192KB × 8-way 128KB × 8-way 16MB × 12-way 40MB (공유) MESI+
ARM Cortex-A720 64KB × 4-way 64KB × 4-way 256KB × 8-way 4~12MB (공유) MOESI

동작 원리

1단계: 주소 디코딩 및 접근

CPU가 메모리 주소를 요청하면:
1. Physical Address 생성: TLB를 통해 가상 주소→물리 주소 변환
2. Index 추출: 물리 주소에서 Index 필드를 추출하여 캐시 세트를 선택
3. 병렬 태그 비교: 선택된 세트의 모든 Way에 대해 Tag를 병렬 비교
4. Hit/Miss 판정: 어떤 Way에서 hit했는지, 없으면 miss인지 판별

2단계: Hit 처리

Hit가 발생하면:
1. 해당 Way에서 데이터 블록의 Offset 위치로 접근
2. 요청된 데이터를 CPU에 전달
3. 교체 정책에 따라 접근 순서 정보 갱신 (LRU 등)
4. Write Hit: Write-back이면 dirty bit 설정, Write-through이면 메모리에도 기입

3단계: Miss 처리

Miss가 발생하면:
1. L1 Miss → L2 접근: L2에서 같은 과정으로 탐색
2. L2 Miss → L3 접근: L3에서 탐색 (coherence check)
3. L3 Miss → DRAM 접근: 메모리 컨트롤러를 통해 블록 로드
4. 교체: 해당 세트에서 교체할 블록 선택 (LRU 등)
5. Write-Back: 교체 대상이 dirty이면 메모리에 반영

4단계: 캐시 일관성 (Cache Coherence)

멀티코어 환경에서 각 코어의 L1 캐시에 동일한 메모리 주소의 다른 복사본이 존재할 수 있다. MESI 프로토콜은 이를 해결한다:

MESI Protocol
  • Modified (M): 해당 캐시 라인만 수정됨(dirty). 다른 캐시에는 없음. 다른 코어가 읽으면 메모리에 쓰고 Shared로 전이.
  • Exclusive (E): 해당 캐시 라인만 존재, 수정 안 됨(clean). 같은 코어가 쓰면 Modified로 전이.
  • Shared (S): 여러 캐시에 동일한 블록이 존재. 읽기만 가능.
  • Invalid (I): 유효하지 않은 블록.

snooping 기반 프로토콜은 모든 캐시가 버스를 감시(snoop)하여 다른 코어의 접근을 감지하고, 필요 시 상태를 전이한다. 대형 캐시에서는 Directory 기반 프로토콜이 사용된다.

5단계: Pre-fetching 및 최적화

캐시 miss를 줄이기 위한 기법들:
- HW Pre-fetcher: 접근 패턴을 분석하여 아직 요청되지 않은 블록을 미리 로드
- Software Pre-fetch: 컴파일러가 __builtin_prefetch 등을 사용하여 로드 지시
- Loop Streaming Detector (LSD): 반복 접근 패턴을 감지하여 적시에 블록 로드
- Victim Cache: 교체된 블록을 작은 ASSOCIATIVE 캐시에 저장하여 재접근 시 빠르게 복원

장단점

장점 단점
DRAM 대비 수십~수백배 빠른 접근 속도 칩 면적의 상당 부분을 차지 (30~50%)
멀티레벨 구조로 평균 지연 최소화 캐시 일관성 프로토콜의 복잡도
멀티코어에서 데이터 공유 효율화 캐시 크기 증가 → 지연 증가 (diminishing returns)
Pre-fetching으로 패턴 기반 최적화 가능 Side-channel 공격 벡터 (Spectre 등)
프로그램 성능에 극적인 영향 (hit/miss 차이) 메모리 용량의 2~3배 오버헤드 (tag + metadata)

관련 기술

  • Hennessy & Patterson: Computer Architecture: A Quantitative Approach - CPU 캐시 이론의 교과서
  • Intel 64 and IA-32 Architectures Software Developer's Manual: 캐시 무효화, 메모리 순서, TLB, 멀티프로세서 동작의 기준 문서
  • AMD MESI/MOESI 프로토콜: AMD64 아키텍처에서 캐시 일관성 구현
  • Intel MESIF 프로토콜: Intel 프로세서의 F(Forward) 상태 추가로 읽기 트래픽 감소
  • Spectre/Meltdown (2018): 캐시 타이밍 기반 사이드 채널 공격 - 캐시 보안 문제 부각
  • ChampSim: 캐시 시뮬레이터 (연구용 trace-driven simulation)
  • gem5: 아키텍처 시뮬레이터에서 상세한 캐시 모델링 지원

핵심 정리

CPU Cache Architecture는 프로세서 성능의 핵심으로, L1/L2/L3으로 구분되는 다층 계층 구조를 통해 DRAM과의 속도 격차를 극복한다. Set-associativity는 충돌 miss와 하드웨어 복잡도 사이의 트레이드오프를 결정하며, MESI/MOESI 프로토콜은 멀티코어 환경에서 데이터 일관성을 보장한다. Write-back + Pseudo-LRU 조합은 현대 프로세서에서 가장 널리 사용되는 캐시 전략이다. 캐시 성능은 AMAT 공식으로 평가되며, L1 miss rate 1% 개선이 전체 성능에 큰 영향을 미친다. 최근에는 보안 관점에서 캐시 기반 사이드 채널 공격이 부각되면서, 캐시 파티셔닝 및 타이밍 불변 기법이 연구되고 있다.