Chapter 01

메모리 계층 구조

CPU 코어는 1 ns에 수십 개의 연산을 할 수 있지만, DRAM에서 데이터 하나를 가져오는 데는 80 ns 안팎이 걸린다. SSD는 그보다 천 배, 하드디스크는 다시 백 배 느리다. 빠르면서 크고 싸기까지 한 메모리는 없다. 그래서 컴퓨터는 작고 빠른 메모리부터 크고 느린 메모리까지 여러 층을 쌓아 두고, 자주 쓰는 데이터를 위층에 두는 방식으로 이 간극을 메운다. 이 장은 책 전체의 지도다. 각 층이 어떤 소자로 만들어지고 왜 그 자리에 있는지, 그리고 AI 시대에 왜 메모리가 성능의 병목이 되었는지를 수치와 함께 살펴본다.

컴퓨터에서 메모리의 역할

오늘날 거의 모든 컴퓨터는 1945년 폰 노이만이 EDVAC 보고서에서 정리한 저장 프로그램 방식(Stored-program, von Neumann Architecture)을 따른다. 핵심은 단순하다. 명령어와 데이터를 같은 메모리에 저장하고, 프로세서는 메모리에서 명령어를 하나 읽고(fetch), 해석하고(decode), 필요한 데이터를 읽어 계산한 뒤(execute), 결과를 다시 메모리에 쓴다. 이 순환이 초당 수십억 번 반복된다.

CPU (프로세서) 제어 장치 PC · 디코더 연산 장치 ALU · FPU 레지스터 · 캐시 (SRAM) 수 KB ~ 수십 MB, ~1–20 ns 데이터 버스 (양방향) 주소 버스 제어 (읽기/쓰기) 주기억장치 (DRAM) 0x1000명령어: LOAD r1, [x] 0x1004명령어: ADD r1, r2 0x1008명령어: STORE [y], r1 0x8000데이터: x = 42 0x8004데이터: y = ? 수 GB ~ TB, ~80 ns 저장장치 (SSD) 폰 노이만 병목 명령어와 데이터가 하나의 통로(버스)를 나눠 쓴다
그림 1-1. 폰 노이만 구조. 명령어와 데이터가 같은 주기억장치에 섞여 있고, CPU는 주소를 보내 필요한 내용을 읽고 쓴다. CPU와 메모리 사이 통로의 폭과 속도가 전체 성능을 제한한다는 문제를 존 배커스(1977)는 폰 노이만 병목이라 불렀다.

CPU가 아무리 빨라도 계산할 재료가 제때 도착하지 않으면 기다릴 수밖에 없다. 이것이 이 책 전체를 관통하는 질문이다. 메모리는 얼마나 빨리, 얼마나 많이, 얼마나 싸게, 얼마나 오래 비트를 붙잡아 둘 수 있는가?

비트, 바이트, 주소

메모리의 최소 단위는 0 또는 1을 담는 비트(bit)다. 물리적으로 비트는 커패시터의 전하(DRAM, 4장), 교차 결합 인버터의 상태(SRAM, 3장), 절연막에 갇힌 전자(NAND, 8장), 자성층의 방향(MRAM, 12장) 등으로 표현된다. 8비트를 묶은 바이트(byte)마다 고유 번호인 주소(address)가 붙는다. 이것을 바이트 주소 지정이라 한다.

메모리 = 바이트의 1차원 배열 3F00A109 78563412 FF0000C0 1E77025B …40414243 44454647 48494A4B 4C4D4E4F 주소 (16진수, 0x…) int32 변수 x @ 0x44 = 0x12345678 리틀 엔디언: 낮은 바이트가 낮은 주소 0111 1000 이 16바이트는 64바이트 캐시 라인(0x40~0x7F)의 앞 1/4 — 하나를 읽으면 라인 전체가 함께 온다
그림 1-2. 바이트 주소 지정. 32비트 정수 하나는 연속한 4바이트(0x44~0x47)를 차지한다. x86과 대부분의 ARM 시스템은 낮은 자리 바이트(0x78)를 낮은 주소에 두는 리틀 엔디언을 쓴다. CPU는 바이트 하나가 필요해도 메모리에서 64바이트 단위의 캐시 라인을 통째로 가져온다(3절).

주소가 \(n\)비트면 \(2^n\)개의 바이트를 가리킬 수 있다. 32비트 주소는 4 GiB가 한계였기 때문에 오늘날의 PC와 서버는 64비트 주소를 쓴다(실제 x86-64 가상 주소는 48비트 또는 57비트만 사용). 용량 단위는 10진(1 GB = 10⁹ B)과 2진(1 GiB = 2³⁰ B ≈ 1.074 × 10⁹ B)이 섞여 쓰이는데, 메모리 칩은 관례상 2진(“16Gb DRAM” = 2³⁴ 비트), SSD·HDD 용량 표기는 10진이다.

휘발성과 비휘발성

전원을 끄면 내용이 사라지는 메모리를 휘발성(Volatile), 남아 있는 메모리를 비휘발성(Non-volatile)이라 한다. SRAM은 전원이 있는 동안만 상태를 유지하고, DRAM은 전원이 있어도 커패시터 전하가 새기 때문에 64 ms(고온에서는 32 ms)마다 리프레시해야 한다(5장). 반면 NAND 플래시는 절연막에 갇힌 전자가 수년 동안 빠져나가지 않는다. JEDEC 규격상 소비자용 SSD는 전원 없이 30°C에서 최소 1년 데이터를 보존해야 한다. 대신 쓰기가 느리고 횟수에 한계가 있다(8장). 이처럼 모든 메모리는 속도·밀도·보존·내구성 사이에서 무언가를 포기한다.

“메모리”와 “스토리지”

관례적으로 CPU가 주소로 직접 읽고 쓰는 휘발성 영역(캐시, DRAM)을 메모리, 운영체제가 블록 단위 입출력으로 다루는 비휘발성 영역(SSD, HDD)을 스토리지라 부른다. CXL 메모리 확장이나 영구 메모리처럼 경계가 흐려지는 기술도 있지만, 이 구분은 계층을 이해하는 좋은 출발점이다.

메모리 계층 피라미드

빠른 메모리는 셀이 크고(비트당 트랜지스터가 많고) 칩 안에 가까이 있어야 하므로 비싸고 작다. 싼 메모리는 셀이 작고 밀도가 높지만 멀리 있고 느리다. 이 트레이드오프를 한 장에 그리면 메모리 계층(Memory Hierarchy) 피라미드가 된다.

레지스터 L1 캐시 L2 캐시 L3 캐시 (LLC) DRAM · HBM SSD (NAND 플래시) HDD · 테이프 ~0.25 ns · 수 KB ~1 ns · 32–64 KB/코어 ~4 ns · 1–2 MB/코어 ~10–20 ns · 수십 MB ~80–120 ns · 수십 GB–TB ~50–100 µs · 수 TB ~ms–수십 s · 수십 TB+ 빠름 · 비쌈 · 작음 ↑ 느림 · 쌈 · 큼 ↓ 청록: 온칩 SRAM · 보라: 주기억장치(휘발성) · 회색: 스토리지(비휘발성)
그림 1-3. 메모리 계층 피라미드. 위로 갈수록 빠르고 비트당 비싸며 작다. 한 층 내려갈 때마다 지연은 대략 3~1000배 늘고 용량은 10~1000배 커진다. 수치는 2024~2025년 데스크톱·서버 기준 대략값이다.

아래 표는 각 층의 대표 수치다. 제품과 세대에 따라 두세 배씩 차이가 나지만, 중요한 것은 자릿수다. 레지스터와 테이프의 지연 차이는 약 \(10^{11}\)배, 즉 11자리에 이른다.

층소자지연대역폭용량비트당 가격
레지스터플립플롭/레지스터 파일~0.2–0.3 ns (1 사이클)수 TB/s /코어수 KB /코어—
L1 캐시SRAM (6T/8T)~1 ns (4–5 사이클)~0.5–1 TB/s /코어32–64 KB /코어다이 면적 환산
~$100s/GB (추정)
L2 캐시SRAM~3–5 ns~0.3 TB/s /코어1–2 MB /코어
L3 캐시SRAM~10–20 ns~0.1–0.2 TB/s /코어32–96 MB (공유)
DRAM (DDR5)1T1C DRAM~70–100 ns채널당 ~45 GB/s (DDR5-5600)16 GB – 수 TB~$2–5/GB (2024, 변동 큼)
HBM3E적층 DRAM + TSV~100 ns+ (DRAM 코어)스택당 ~1.2 TB/s스택당 24–36 GBDDR5의 수 배 (추정)
SSD (NVMe)3D NAND (TLC/QLC)~50–100 µs (4K 랜덤 읽기)~7–14 GB/s (PCIe 4/5 ×4)1 TB – 100 TB+~$0.05–0.1/GB
HDD자기 디스크~5–10 ms~0.2–0.3 GB/s~20–30 TB~$0.015–0.02/GB
테이프 (LTO-9)자기 테이프수십 s (장착·탐색)~0.4 GB/s18 TB /카트리지~$0.005/GB

지연 수치가 ns, µs, ms, s로 흩어져 있어 감이 잘 오지 않는다. 1 ns를 1초로 늘려 사람의 시간으로 바꿔 보자.

동작실제 지연1 ns = 1초라면
레지스터 읽기 (1 사이클 @ 4 GHz)0.25 ns눈 한 번 깜빡임 (0.25초)
L1 캐시 히트1 ns1초 — 책상 위 메모지를 보는 시간
L2 캐시 히트4 ns4초 — 서랍을 여는 시간
L3 캐시 히트15 ns15초 — 옆 책장에서 책을 꺼내는 시간
DRAM 접근80 ns1분 20초 — 옆 사무실에 다녀오기
NVMe SSD 랜덤 읽기80 µs약 22시간 — 하루
HDD 탐색8 ms약 3개월 — 한 계절
테이프 장착·탐색~50 s약 1600년 — 신라 시대부터 지금까지

CPU 입장에서 DRAM 접근은 “1분 넘게 손 놓고 기다리기”이고, 디스크 접근은 “석 달 휴가”다. 그래서 운영체제는 디스크를 기다리는 동안 다른 프로세스로 전환하고, CPU 하드웨어는 DRAM을 기다리는 동안 비순차 실행과 프리페치로 다른 일을 찾는다. 아래 시뮬레이터에서 각 층을 눌러 네 가지 지표를 로그 눈금으로 비교해 보자.

SIMULATOR

계층 피라미드 탐색기 (로그 눈금)

지표
지연—
대역폭—
용량(대표)—
가격—
1 ns = 1초라면—
해볼 것: ① 지표를 ‘지연’으로 두고 DRAM과 SSD 막대 길이 차이(약 1000배)를 확인하자. ② ‘대역폭’으로 바꾸면 HBM3E가 DDR5 채널보다 한참 길다 — 지연은 비슷한데 대역폭만 크게 늘린 메모리다(7장). ③ ‘$/GB’에서 SRAM 층은 추정치(다이 면적 환산)라 빗금으로 그렸다. SSD와 DRAM의 가격 차이가 수십 배라는 점이 두 층이 공존하는 이유다.
왜 층마다 다른 소자를 쓰나

SRAM 셀은 트랜지스터 6개로 약 0.02 µm²(3 nm급 공정 고밀도 셀), DRAM 셀은 트랜지스터 1개와 커패시터 1개로 0.0013 µm² 안팎(1b급)이다. 같은 면적에 DRAM이 대략 10배 이상 많은 비트를 담는다. NAND는 셀을 200단 넘게 수직으로 쌓고 셀당 3~4비트를 저장해 비트당 면적을 DRAM의 수십 분의 1로 줄였다. 대신 SRAM은 로직 공정 그대로 CPU 옆에 붙일 수 있어 가장 빠르다. 빠름은 가까움과 단순한 읽기에서, 쌈은 작은 셀과 적층에서 나온다.

지역성과 캐시 라인

작은 캐시가 큰 메모리의 속도를 흉내 낼 수 있는 이유는 프로그램이 메모리를 고르게 쓰지 않기 때문이다. 이를 참조 지역성(Locality of Reference)이라 하며 두 종류가 있다.

시간 (접근 순서) → 주소 → 반복문 명령어: 같은 주소를 계속 재방문 → 시간 지역성 누적 변수 sum: 매 반복마다 접근 → 시간 지역성 배열 a[i] 순회: 인접 주소를 차례로 → 공간 지역성 가로 격자 1칸 = 캐시 라인 64 B
그림 1-4. for (i=0; i<N; i++) sum += a[i];를 실행할 때의 메모리 접근을 주소–시간 평면에 찍은 모식도. 명령어와 sum은 좁은 주소를 반복해서(시간 지역성), 배열은 주소를 조금씩 올라가며(공간 지역성) 접근한다. 배열 원소 16개(4 B × 16 = 64 B)가 한 캐시 라인에 들어가므로 첫 원소에서 미스가 나면 나머지 15개는 히트다.

캐시는 이 두 성질을 이용한다. 한 번 가져온 데이터를 한동안 보관해 시간 지역성을 살리고, 요청한 바이트 하나가 아니라 주변 64바이트를 묶은 캐시 라인(Cache Line, Block)을 통째로 가져와 공간 지역성을 살린다. 64바이트는 우연이 아니다. DDR5 서브채널(32비트 폭)이 버스트 길이 16으로 한 번에 보내는 양이 정확히 32비트 × 16 = 64바이트다(6장). Apple M 시리즈처럼 128바이트 라인을 쓰는 설계도 있다.

주소를 쪼개는 법: 태그 · 인덱스 · 오프셋

가장 단순한 직접 사상 캐시(Direct-mapped Cache)는 주소를 세 필드로 나눈다. 라인 크기가 \(L\) 바이트, 라인 수가 \(S\)개라면

$$\underbrace{\text{tag}}_{\text{나머지 상위 비트}}\;\Big|\;\underbrace{\text{index}}_{\log_2 S\ \text{비트}}\;\Big|\;\underbrace{\text{offset}}_{\log_2 L\ \text{비트}}, \qquad \text{index} = \left\lfloor \frac{\text{addr}}{L} \right\rfloor \bmod S$$
오프셋은 라인 안의 바이트 위치, 인덱스는 이 주소가 들어갈 캐시 칸 번호, 태그는 그 칸에 지금 들어 있는 라인이 정말 이 주소의 것인지 확인하는 이름표다. 저장된 태그와 주소의 태그가 같으면 히트, 다르거나 비어 있으면 미스다.

미스에는 세 종류가 있다(3C 분류). 처음 접근해서 어쩔 수 없는 강제 미스(Compulsory), 캐시 전체 용량보다 작업 집합이 커서 생기는 용량 미스(Capacity), 용량은 남는데 같은 인덱스로 몰려 서로 쫓아내는 충돌 미스(Conflict). 충돌 미스는 한 인덱스에 여러 라인을 둘 수 있는 집합 연관 구조로 줄이는데, 이는 3장에서 SRAM 어레이와 함께 다룬다. 아래 시뮬레이터에서 접근 패턴에 따라 히트율이 어떻게 달라지는지 직접 보자.

SIMULATOR

접근 패턴과 직접 사상 캐시

접근 패턴
라인 크기
라인 수
접근 수—
히트율—
강제 미스—
용량·충돌 미스—
AMAT (1 ns / 80 ns)—
해볼 것: ① ‘순차’, 64 B 라인: 원소 4 B이므로 16번에 1번만 미스(히트율 ≈ 94%). 라인을 16 B로 줄이면 4번에 1번 미스가 된다. ② 배열 크기를 캐시 용량(라인 수 × 라인 크기) 이하로 줄이면 첫 바퀴 이후 모두 히트 — 시간 지역성이다. 캐시보다 크면 매 바퀴 같은 미스가 반복된다(용량 미스). ③ ‘스트라이드’를 16(= 64 B)으로 두면 매 접근이 새 라인이라 공간 지역성이 사라진다. 스트라이드 256 B(64)에서는 소수의 인덱스에만 몰려 충돌 미스가 폭증한다. ④ ‘랜덤’은 배열이 캐시보다 크면 히트율 ≈ 캐시 용량 / 배열 크기로 떨어진다.
행렬은 행 방향으로 돌아라

C 언어의 2차원 배열은 행 우선(row-major)으로 저장된다. a[i][j]를 j 안쪽 루프로 돌면 순차 접근이지만, i 안쪽 루프로 돌면 한 행 길이만큼의 스트라이드 접근이 된다. 1024×1024 float 행렬이라면 스트라이드가 4 KiB여서 거의 매번 미스가 나고, 같은 계산이 수 배 느려진다. 알고리즘의 연산 수가 같아도 메모리 접근 순서가 성능을 좌우한다.

히트율과 평균 메모리 접근 시간

캐시 성능은 평균 메모리 접근 시간(AMAT, Average Memory Access Time) 하나로 요약할 수 있다. 모든 접근은 일단 캐시를 확인하는 데 \(t_{hit}\)이 들고, 미스가 난 비율 \(m\)만큼은 아래층에서 가져오는 벌칙 \(t_{miss}\)를 추가로 치른다.

$$AMAT = t_{hit} + m \cdot t_{miss}$$
\(t_{hit}\): 히트 시간, \(m\): 미스율(= 1 − 히트율), \(t_{miss}\): 미스 벌칙(아래층에서 라인을 가져오는 시간). 예) \(t_{hit}=1\) ns, \(m=5\%\), \(t_{miss}=80\) ns → AMAT = 1 + 0.05 × 80 = 5 ns.

이 예에서 히트율 95%라는 좋은 성적에도 평균 시간은 L1 히트의 5배다. 미스 벌칙이 히트 시간의 80배나 되기 때문에 미스율 몇 %가 성능을 지배한다. 히트율을 95%에서 99%로 올리면 AMAT는 5 ns에서 1.8 ns로 준다. 그래서 캐시를 여러 층으로 쌓아 미스 벌칙 자체를 줄인다.

코어 L11 ns L24 ns L315 ns DRAM80 ns 5% 30% 40% 95% 히트 L2에서 70% 히트 DRAM까지 내려가는 비율 (전역 미스율) = 0.05 × 0.3 × 0.4 = 0.6% AMAT = 1 + 0.05 × (4 + 0.3 × (15 + 0.4 × 80)) ≈ 1.9 ns
그림 1-5. 3단 캐시의 흐름. 화살표 위 숫자는 각 층의 국부 미스율(그 층에 도착한 요청 중 미스 비율)이다. 아래층 캐시는 위층에서 걸러지고 남은 “어려운” 접근만 받으므로 국부 미스율이 30~50%로 높아 보이지만, 전역적으로는 DRAM까지 가는 요청을 1% 미만으로 줄인다.

다단 캐시에서는 “아래층 미스 벌칙” 자리에 다시 아래층의 AMAT가 들어가는 재귀 구조가 된다.

$$AMAT = t_1 + m_1\Big(t_2 + m_2\big(t_3 + m_3\, t_{mem}\big)\Big)$$
\(t_k\): k번째 캐시의 히트 시간, \(m_k\): 국부 미스율. 전역 미스율은 \(m_1 m_2 m_3\)이다. 실제 CPU에서는 미스 처리 중에도 다른 명령을 실행하므로(메모리 수준 병렬성) 체감 벌칙은 이 식보다 작을 수 있다.
SIMULATOR

다단 캐시 AMAT 계산기

캐시 단 수
AMAT—
코어 사이클 (4 GHz)—
DRAM 도달 비율—
DRAM이 차지하는 시간—
해볼 것: ① ‘L1만’으로 두면 L1 미스가 곧장 80 ns DRAM으로 가서 AMAT가 5 ns가 된다. L2, L3를 차례로 추가하며 AMAT가 어떻게 줄어드는지 보자. ② 3단 구성에서 L3 미스율을 40%→80%로 올리면(작업 집합이 L3보다 큰 서버 워크로드) DRAM 비중이 급증한다. ③ 아래 그래프는 L1 미스율에 따른 AMAT이다 — 캐시 단이 많을수록 기울기(= 실질 미스 벌칙)가 완만하다.
히트 시간과 용량의 줄다리기

L1을 그냥 크게 만들면 되지 않을까? SRAM 어레이가 커지면 워드라인·비트라인이 길어지고 태그 비교 대상이 늘어 히트 시간이 길어진다. L1 히트 시간은 파이프라인의 모든 load 명령에 더해지므로 1 사이클만 늘어도 전체 성능이 떨어진다. 그래서 L1은 32~64 KB에 4~5 사이클로 억제하고, 용량은 L2·L3가 맡는다. AMD의 3D V-Cache처럼 SRAM 다이를 수직으로 쌓아 L3를 64 MB 늘리면서 지연 증가를 몇 사이클로 막는 기술도 등장했다.

대역폭과 지연, 그리고 리틀의 법칙

메모리 성능에는 전혀 다른 두 축이 있다. 지연(Latency)은 요청 하나를 보내고 첫 데이터가 돌아올 때까지의 시간(ns), 대역폭(Bandwidth)은 단위 시간당 옮길 수 있는 데이터 양(GB/s)이다. 고속도로에 비유하면 지연은 서울–부산 주행 시간, 대역폭은 차로 수 × 제한 속도로 결정되는 시간당 통과 차량 수다. 차로를 늘려도 부산까지 걸리는 시간은 줄지 않는다.

코어요청 발행 메모리응답 관의 길이 = 지연 W (ns) 관의 굵기 · 흐름 속도 = 대역폭 λ (요청/ns) 관 안에 떠 있는 요청 수 L = λ · W
그림 1-6. 대역폭–지연 파이프. 관을 꽉 채워야 최대 대역폭이 나온다. 관 안에 동시에 떠 있어야 하는 요청 수(in-flight)는 대역폭 × 지연이며, 네트워크에서는 이를 대역폭-지연 곱(BDP)이라 부른다.

큐잉 이론의 리틀의 법칙(Little's Law, 1961)은 안정된 시스템에서 평균적으로 시스템 안에 머무는 개체 수 \(L\)이 도착률 \(\lambda\)와 평균 체류 시간 \(W\)의 곱이라는 것이다. 메모리에 적용하면 다음과 같다.

$$N_\text{in-flight} = \frac{BW \times t_\text{lat}}{\text{요청 크기}} \qquad\Longleftrightarrow\qquad BW_\text{달성} = \frac{N_\text{in-flight}\times \text{요청 크기}}{t_\text{lat}}$$
예) 듀얼 채널 DDR5(~90 GB/s), 지연 90 ns, 64 B 라인: \(N = 90\,\text{GB/s} \times 90\,\text{ns} / 64\,\text{B} \approx 127\)개. 즉 대역폭을 다 쓰려면 64 B 요청 약 130개가 동시에 진행 중이어야 한다.

코어 하나가 동시에 추적할 수 있는 L1 미스는 수십 개 수준이다(미스 상태 처리 레지스터, MSHR/fill buffer 수). 그래서 단일 스레드는 DRAM 대역폭을 다 쓰지 못하고, 여러 코어가 함께 요청하거나 하드웨어 프리페처가 미리 요청을 띄워야 대역폭이 찬다. GPU는 반대 극단이다. 지연이 수백 ns인 HBM에서 수 TB/s를 뽑으려면 수만 개의 요청이 떠 있어야 하는데, GPU는 수만 개의 스레드를 번갈아 실행하며 이를 채운다. GPU는 지연을 줄이는 대신 병렬성으로 지연을 숨기는 기계다.

SIMULATOR

리틀의 법칙: 동시 요청 수와 달성 대역폭

프리셋
요청 크기
달성 대역폭—
이용률—
포화에 필요한 N*—
떠 있는 바이트 (BDP)—
해볼 것: ① ‘CPU 코어 1개’: 동시 요청 약 16개로는 90 GB/s 중 일부만 쓴다. N을 늘려 꺾이는 점(N*)을 찾아보자. ② 지연을 90 → 180 ns로 두 배로 늘리면 같은 N에서 대역폭이 절반이 된다 — 대역폭 제한 영역이 아니라면 지연이 곧 대역폭을 깎는다. ③ ‘GPU+HBM’에서 필요한 N*는 수만 개다. 관 그림에서 패킷이 드문드문하면 관이 비어 있다는 뜻이다.

메모리 월: 벌어지는 속도 격차

1980년부터 2000년대 초까지 마이크로프로세서 성능은 해마다 25~50% 이상 빨라졌지만, DRAM의 접근 지연은 해마다 약 7% 개선에 그쳤다. DRAM은 용량(밀도)을 늘리는 데 집중했고, 셀을 읽는 물리 과정(비트라인 충전, 센싱, 프리차지 — 5장)은 크게 빨라지지 않았기 때문이다. 1995년 울프와 매키는 이 격차가 계속 벌어지면 결국 프로세서 성능이 메모리에 막힐 것이라며 이를 메모리 월(Memory Wall)이라 불렀다.

그 뒤 단일 코어 성능 증가가 둔화되면서 지연 격차는 더 벌어지지 않았지만, 병목은 대역폭으로 옮겨 갔다. 멀티코어와 GPU·AI 가속기의 연산 능력이 폭발적으로 늘어난 반면 메모리 대역폭 증가는 그에 못 미친다. 한 분석(Gholami 외, 2024)에 따르면 지난 20여 년간 서버 하드웨어의 최대 FLOPS는 2년마다 약 3.0배, DRAM 대역폭은 약 1.6배, 칩 간 인터커넥트 대역폭은 약 1.4배 늘었다.

SIMULATOR

메모리 월 그래프 (로그 눈금)

관점
CPU 성능 (1980=1)—
DRAM 성능 (1980=1)—
격차—
해볼 것: ① ‘CPU vs DRAM 지연’에서 커서를 2005년 근처로 옮기면 격차가 이미 천 배를 넘는다. 캐시 계층이 이 격차를 흡수해 왔다. ② ‘연산 vs 대역폭’으로 바꾸면 20년 사이 FLOPS는 수만 배, DRAM 대역폭은 약 100배 늘어 “바이트당 FLOP”가 수백 배 불균형해진다. 곡선은 발표된 평균 성장률로 그린 모델이며 개별 제품값이 아니다.

AI 시대의 병목: 파라미터를 읽는 시간

대형 언어 모델(LLM)이 토큰 하나를 생성할 때(디코드 단계)는 모든 가중치를 한 번씩 읽어 곱셈-누산을 한다. 파라미터가 \(P\)개면 연산은 약 \(2P\) FLOP, 읽는 데이터는 \(P \times b\) 바이트(\(b\): 파라미터당 바이트)다. 배치 크기 1이면 바이트당 연산이 \(2/b\), FP16에서는 1 FLOP/B에 불과하다. 700억(70B) 파라미터 모델을 FP16으로 두면 140 GB이고, HBM3를 쓰는 H100 SXM(~3.35 TB/s)도 이를 한 번 읽는 데 약 42 ms가 걸린다. 연산기가 아무리 빨라도 초당 약 24 토큰이 상한이다.

$$\text{토큰/s}\big|_\text{배치 1} \;\lesssim\; \frac{BW_\text{mem}}{P\cdot b} = \frac{3.35\times10^{12}\ \text{B/s}}{70\times10^{9}\times 2\ \text{B}} \approx 24$$
KV 캐시 읽기와 활성값은 무시한 상한이다. 여러 사용자의 요청을 묶어(배치) 같은 가중치로 여러 토큰을 계산하면 바이트당 연산이 배치 크기만큼 늘어난다.

이 관계를 일반화한 것이 루프라인 모델(Roofline Model)이다. 커널의 연산 강도 \(I\)(FLOP/바이트)에 따라 도달 가능한 성능이 메모리 대역폭 지붕과 연산 지붕 중 낮은 쪽으로 결정된다.

$$\text{성능}_\text{도달} = \min\big(\text{Peak FLOPS},\; BW_\text{mem}\times I\big), \qquad I_\text{ridge} = \frac{\text{Peak FLOPS}}{BW_\text{mem}}$$
H100 SXM의 FP16 밀집 연산은 약 989 TFLOPS, 대역폭은 3.35 TB/s이므로 \(I_\text{ridge} \approx 295\) FLOP/B. 연산 강도가 이보다 낮은 커널은 전부 메모리가 성능을 결정한다.
연산 강도 I (FLOP/바이트, 로그) 성능 (FLOP/s, 로그) I_ridge 연산 지붕 (Peak FLOPS) 메모리 지붕: 기울기 = BW 메모리 바운드 연산 바운드 LLM 디코드 (배치 1, ~1 FLOP/B) 배치 64 대형 GEMM (학습·프리필)
그림 1-7. 루프라인 모델. 연산 강도가 꺾이는 점(\(I_\text{ridge}\))보다 낮으면 성능은 메모리 대역폭에 비례하고(보라 영역), 높으면 연산기가 한계다. LLM 추론의 디코드 단계는 대표적인 메모리 바운드 작업이어서 HBM 대역폭(7장)과 용량이 곧 AI 서비스의 성능과 비용이 된다.
SIMULATOR

LLM 디코드 루프라인 계산기

하드웨어 프리셋
가중치 정밀도
연산 강도—
한계 요인—
사용자당 토큰/s—
전체 토큰/s—
가중치 크기—
해볼 것: ① H100, 70B, FP16, 배치 1 → 약 24 토큰/s. 정밀도를 FP8, INT4로 낮추면 읽을 바이트가 줄어 속도가 2배, 4배가 된다 — 양자화가 추론을 빠르게 하는 주된 이유다. ② 배치를 키우면 전체 처리량은 늘지만 연산 강도가 꺾이는 점을 지나면 더는 늘지 않는다. ③ PC 프리셋(~90 GB/s)에서 70B 모델은 1초에 1토큰도 어렵다. (KV 캐시·통신·효율 손실을 무시한 상한 모델이며, 프리셋 수치는 대략값이다.)
용량도 병목이다

70B FP16 모델의 가중치 140 GB는 HBM3 80 GB를 단 H100 한 장에 들어가지 않는다. 게다가 긴 문맥을 처리하면 토큰마다 쌓이는 KV 캐시가 수십 GB에 이를 수 있다. 그래서 가속기 한 개에 붙는 HBM 용량(H200 141 GB, B200 약 180 GB)과 여러 칩을 잇는 인터커넥트 대역폭이 대역폭만큼 중요해졌다. 메모리를 연산기 옆이나 안으로 옮기는 PIM·CXL 같은 시도는 12장에서 다룬다.

메모리 종류 지도와 이 책의 구성

지금까지 계층의 “위치”를 보았다면, 이제 각 층을 채우는 “소자”를 정리해 보자. 반도체 메모리는 크게 휘발성과 비휘발성으로 나뉘고, 각각 셀 구조에 따라 다시 갈라진다.

반도체 메모리 휘발성 비휘발성 SRAM6T · 3장 DRAM1T1C · 4–5장 DDR·LPDDRGDDR · 6장 HBM7장 플래시전하 저장 신흥 메모리저항 변화 · 12장 NAND8–10장 NOR코드 MRAM · PCMReRAM · FeRAM 공통 기반: 소자 물리(2장) · 신뢰성과 ECC(11장) · 시스템 설계(13장)
그림 1-8. 반도체 메모리 분류와 이 책의 장 구성. 휘발성 메모리는 속도, 비휘발성 메모리는 밀도와 보존을 맡는다. 신흥 메모리는 “DRAM처럼 빠르고 NAND처럼 남아 있는” 이상적인 메모리를 노리지만 아직 틈새 시장에 머물러 있다.

아래 표는 주요 메모리의 특성을 한눈에 비교한 것이다. 셀 크기는 공정의 최소 선폭 \(F\)(feature size)의 제곱을 단위로 쓰는 F² 표기를 쓴다. 예를 들어 DRAM의 6F²는 워드라인 피치 2F × 비트라인 피치 3F 격자를 뜻한다. 셀 크기가 작을수록 같은 면적에 비트를 많이 담는다.

종류셀 크기읽기쓰기내구성 (쓰기 횟수)휘발성주 용도
SRAM~120–150 F²<1 ns<1 ns사실상 무제한 (>10¹⁶)휘발레지스터 파일, 캐시
DRAM6 F² (4F² 개발 중)~10–15 ns (셀)~10–15 ns>10¹⁶휘발 (리프레시)주기억장치, HBM
NAND 플래시4 F² (평면) · 3D는 비트당 <1 F²~20–60 µs (페이지)~0.2–2 ms (페이지)SLC ~10⁵, TLC ~10³, QLC ~수백비휘발SSD, 모바일 저장장치
NOR 플래시~10 F²~50–100 ns (랜덤)~µs (워드)~10⁵비휘발펌웨어, 코드 실행(XIP)
STT-MRAM~6–50 F²~10 ns~10–30 ns~10¹⁰–10¹⁵비휘발임베디드 NVM, 캐시 후보
PCM~4–20 F²~50–100 ns~100 ns–1 µs~10⁸–10⁹비휘발스토리지 클래스 메모리
ReRAM~4–12 F²~10–100 ns~10–100 ns~10⁶–10⁹비휘발임베디드 NVM, 인메모리 연산
FeRAM / FeFET~6–40 F²~50 ns~50 ns~10¹⁰–10¹⁴비휘발저전력 MCU, 차세대 후보

신흥 메모리 수치는 연구·제품마다 편차가 매우 크므로 자릿수 참고용이다. 표를 보면 “모든 칸에서 이기는” 메모리가 없다는 사실이 분명해진다. SRAM은 빠르지만 크고, DRAM은 작고 빠르지만 휘발성이며, NAND는 가장 싸고 남아 있지만 느리고 닳는다. 이것이 계층이 존재하는 근본 이유이며, 이 책은 각 소자를 물리(2장)에서 시작해 회로, 어레이, 인터페이스, 시스템 순으로 쌓아 올린다.

이 책을 읽는 순서

① 2장에서 MOSFET 스위치, 누설, 전하 저장, 터널링의 물리를 익힌다. ② 3~7장은 휘발성 메모리: SRAM 셀과 캐시, DRAM 셀과 타이밍, DDR·LPDDR·GDDR 인터페이스, HBM 적층. ③ 8~10장은 비휘발성 메모리: NAND 셀, 3D NAND, SSD 컨트롤러. ④ 11~13장은 공통 주제: 신뢰성과 ECC, 차세대 메모리와 PIM·CIM, 메모리 시스템 설계. 각 장의 시뮬레이터에서 이 장에서 본 지연·대역폭·용량 수치가 어디서 나오는지 확인하게 될 것이다.

핵심 정리

  1. 폰 노이만 구조에서 명령어와 데이터는 같은 메모리에 있고, CPU–메모리 통로의 속도가 전체 성능을 제한한다(폰 노이만 병목). 메모리는 바이트 단위 주소로 접근하며, 휘발성(SRAM·DRAM)과 비휘발성(NAND 등)으로 나뉜다.
  2. 메모리 계층은 레지스터(~0.25 ns) → L1/L2/L3 SRAM(1~20 ns) → DRAM/HBM(~80~120 ns) → SSD(~50~100 µs) → HDD(~ms) → 테이프(~수십 s)로, 층마다 지연·용량이 자릿수로 달라지고 비트당 가격은 반대로 준다.
  3. 1 ns를 1초로 늘리면 DRAM 접근은 1분 20초, SSD 읽기는 하루, HDD 탐색은 석 달이다. 이 간극을 캐시·프리페치·비순차 실행·문맥 전환이 숨긴다.
  4. 캐시는 시간 지역성(재사용)과 공간 지역성(인접 접근)을 이용한다. 64 B 캐시 라인 단위로 옮기며, 주소는 태그·인덱스·오프셋으로 나뉜다. 미스는 강제·용량·충돌로 분류된다.
  5. \(AMAT = t_{hit} + m\cdot t_{miss}\). 미스 벌칙이 히트 시간의 수십 배이므로 미스율 몇 %가 성능을 좌우하고, 다단 캐시는 미스 벌칙을 재귀적으로 줄인다.
  6. 대역폭과 지연은 다른 축이다. 리틀의 법칙에 따라 최대 대역폭을 쓰려면 대역폭 × 지연 / 요청 크기만큼의 요청이 동시에 떠 있어야 한다. CPU는 수십, GPU는 수만 개의 동시 요청으로 대역폭을 채운다.
  7. 메모리 월: 프로세서 성능이 DRAM 지연 개선보다 훨씬 빨리 늘어 격차가 천 배 이상으로 벌어졌고, 오늘날에는 연산(FLOPS) 대비 메모리 대역폭 부족이 병목이다.
  8. LLM 디코드(배치 1)는 연산 강도 ~1 FLOP/B의 메모리 바운드 작업이라 토큰/s 상한 ≈ 메모리 대역폭 / 가중치 바이트다. 그래서 HBM의 대역폭·용량, 양자화, 배치가 AI 성능을 결정한다.

확인 퀴즈

1. 다음 중 지연이 짧은 순서대로 올바르게 나열한 것은?

레지스터(~0.25 ns) < L1(~1 ns) < L2(~4 ns) < L3(~15 ns) < DRAM·HBM(~80~120 ns) < SSD(~80 µs) < HDD(~8 ms) 순이다. HBM은 대역폭이 클 뿐 지연은 DRAM과 비슷하다.

2. L1 히트 시간 1 ns, L1 미스율 10%, 미스 벌칙 60 ns일 때 AMAT는?

AMAT = 1 + 0.1 × 60 = 7 ns. 히트율 90%라도 미스 벌칙이 크면 평균 시간은 히트 시간의 7배가 된다.

3. 4바이트 int 배열을 순차 접근한다. 캐시 라인이 64 B이고 배열이 캐시보다 훨씬 크다면 히트율은 약 얼마인가?

한 라인에 원소 64/4 = 16개가 들어간다. 라인의 첫 원소에서만 미스가 나고 나머지 15개는 공간 지역성 덕분에 히트다. 15/16 ≈ 93.75%.

4. 메모리 지연이 100 ns이고 목표 대역폭이 128 GB/s다. 요청 크기가 64 B라면 동시에 진행 중이어야 하는 요청 수는?

리틀의 법칙: N = BW × 지연 / 크기 = 128 B/ns × 100 ns / 64 B = 200. 1 GB/s = 1 B/ns로 바꾸면 계산이 쉽다.

5. 대역폭 4 TB/s인 가속기에서 40B 파라미터 모델을 FP8(1 B/파라미터)로 배치 1 디코드할 때 토큰/s의 상한에 가장 가까운 것은?

토큰마다 가중치 40 GB를 한 번 읽어야 한다. 4 TB/s ÷ 40 GB = 100 토큰/s. 연산 강도가 2 FLOP/B 정도로 낮아 연산 능력은 거의 영향을 주지 못한다.

6. 다음 설명 중 옳지 않은 것은?

SRAM 어레이가 커지면 배선이 길어지고 태그 비교가 늘어 히트 시간이 오히려 길어진다. L1 히트 시간은 모든 load에 더해지므로 L1은 작고 빠르게, 용량은 L2·L3가 맡는다.