Chapter 05

DRAM 동작과 타이밍

4장에서 1T1C 셀과 센스 앰프가 비트 하나를 어떻게 저장하고 읽어 내는지 보았다. 이 장에서는 시야를 넓혀, 수십억 개의 셀이 채널·랭크·뱅크·로우·컬럼으로 조직된 DRAM 칩이 메모리 컨트롤러의 명령을 받아 나노초 단위의 타이밍 규칙에 따라 움직이는 모습을 따라간다. "DDR5-6400 CL32"라는 숫자가 무엇을 뜻하는지, 왜 대역폭은 10년 사이 4배가 되었는데 지연은 거의 그대로인지, 리프레시와 스케줄러가 성능을 얼마나 좌우하는지가 이 장의 주제다.

DRAM의 조직: 채널에서 셀까지

CPU의 메모리 컨트롤러(IMC, Integrated Memory Controller)가 바라보는 DRAM은 여러 층으로 된 트리다. 각 층은 "무엇을 공유하고, 무엇이 독립적인가"로 구분된다. 이 구분이 곧 병렬성의 단위가 되기 때문에, 타이밍과 스케줄링을 이해하려면 먼저 이 계층을 정확히 알아야 한다.

CPU 메모리 컨트롤러 IMC 채널 A 채널 B … DIMM (서브채널 32b) 랭크 0 랭크 1 ×8×8 ×8×8 4 칩 × 8b = 32b 데이터 DRAM 칩 16 Gb ×8 8 BG × 4 뱅크 = 32 뱅크 로우 디코더 로우 k (열림) 로우 버퍼 (S/A) 컬럼 선택 / I/O 65,536 로우 × 1 KB 페이지
그림 5-1. DDR5 메모리 조직의 예. 컨트롤러는 채널(서브채널)마다 독립 버스를 갖고, 랭크의 칩 4개(×8)가 32비트 데이터를 나눠 맡는다. 칩 안에는 8개 뱅크 그룹 × 4뱅크 = 32개 뱅크가 있고, 각 뱅크는 65,536개 로우와 1 KB짜리 로우 버퍼(센스 앰프 행)를 가진다.

칩 용량은 이 필드들의 곱이다. 16 Gb ×8 DDR5 칩을 예로 들면

$$ C_{chip} = N_{bank}\times N_{row}\times N_{col}\times W = 32 \times 65{,}536 \times 1{,}024 \times 8 = 2^{34}\ \text{bit} = 16\ \text{Gb} $$
\(N_{col}\)은 칩 입장의 컬럼 수, \(W\)는 칩의 데이터 폭(×8). 로우 하나 = \(1024\times 8\) 비트 = 1 KB가 칩 하나의 페이지 크기다. 랭크 전체로 보면 칩 4개가 동시에 열리므로 서브채널의 실효 로우 버퍼는 4 KB가 된다.

한 번의 읽기 명령이 내보내는 양은 버스트(burst)로 정해진다. DDR5는 버스트 길이 BL16이므로 32비트 × 16 = 512비트 = 64바이트, 정확히 CPU 캐시 라인 하나(3장)다. DDR4는 64비트 × BL8 = 64바이트로 같은 크기를 다른 방식으로 채웠다. 즉 DRAM은 바이트 단위가 아니라 캐시 라인 단위로 말한다.

계층DDR4 예 (8 Gb ×8)DDR5 예 (16 Gb ×8)공유 / 독립
채널64b (+8b ECC)DIMM당 32b 서브채널 × 2버스 독립 → 완전 병렬
랭크×8 칩 8개서브채널당 ×8 칩 4개데이터 버스 공유, CS로 선택
뱅크 그룹 × 뱅크4 × 4 = 168 × 4 = 32뱅크마다 로우 버퍼 독립
로우 / 뱅크65,53665,536뱅크당 한 번에 1개만 열림
페이지 (칩 / 랭크)1 KB / 8 KB1 KB / 4 KBACT 한 번에 열리는 양
버스트BL8 × 64b = 64 BBL16 × 32b = 64 B= 캐시 라인
왜 뱅크를 여러 개로 나눌까? 뱅크 하나는 한 번에 로우 하나만 열 수 있고, 로우를 여닫는 데 수십 ns가 걸린다. 뱅크를 32개로 나누면 한 뱅크가 로우를 여는 동안 다른 뱅크들이 데이터를 내보낼 수 있다. 식당 주방에 화구가 하나가 아니라 32개 있는 셈이다. 이 뱅크 수준 병렬성이 DRAM 대역폭의 숨은 원천이다.

명령과 로우 버퍼

DRAM은 스스로 판단하지 않는다. 메모리 컨트롤러가 명령/주소(CA) 버스로 보내는 몇 가지 명령을 정해진 시간 간격을 지켜 수행할 뿐이다. 핵심 명령은 다섯 개다.

① ACT (로우 3) WL3 로우 버퍼 ← 로우 3 전체 센싱 + 재저장 · tRCD 후 RD 가능 ② RD (컬럼 5) 로우 버퍼 DQ → 64 B 버스트 CL 후 데이터 ③ PRE 비어 있음 (V_DD/2) WL off · 비트라인 이퀄라이즈 tRP 후 다음 ACT 가능
그림 5-2. 로우 버퍼의 한살이. ACT는 로우 전체(칩당 1 KB)를 센스 앰프로 끌어올리고, RD는 그중 일부만 골라 내보내며, PRE는 로우를 닫고 비트라인을 다음 센싱을 위한 중간 전압으로 되돌린다.

여기서 중요한 비대칭이 드러난다. ACT는 1 KB를 여는데, RD 한 번은 칩당 16바이트(×8 × BL16)만 가져간다. 그러니 로우가 열려 있는 동안 같은 로우의 다른 컬럼을 읽으면 ACT 비용 없이 CL만 기다리면 된다. 이것이 로우 히트(row hit, page hit)다. 반대로 다른 로우가 필요하면 PRE → ACT → RD를 모두 거쳐야 한다(로우 컨플릭트).

IDLE ACTIVE READ WRITE PRECHARGING REFRESHING SELFREFRESH ACTtRCD RD WR PRE(≥ tRAS) WRA (+tWR) tRP REF tRFC SRE SRX
그림 5-3. 뱅크 하나의 단순화한 상태도. 모든 화살표에는 최소 대기 시간이 붙어 있다. ACT 후 tRCD가 지나야 RD/WR, ACT 후 tRAS가 지나야 PRE, PRE 후 tRP가 지나야 다시 ACT할 수 있다. REF와 셀프 리프레시는 모든 뱅크가 IDLE일 때만 들어간다(DDR5의 동일 뱅크 리프레시는 예외).

오픈 페이지 vs 클로즈 페이지

RD가 끝난 뒤 로우를 열어 둘지, 바로 닫을지는 컨트롤러의 선택이다.

실제 컨트롤러는 둘 사이의 적응형 정책을 쓴다. 일정 시간 동안 히트가 없으면 닫거나(타임아웃), 큐에 같은 로우 요청이 남아 있는지 보고 결정한다. 5절 시뮬레이터에서 두 정책을 직접 비교해 보자.

타이밍 파라미터

DRAM 데이터시트의 절반은 타이밍 파라미터 표다. 각 파라미터는 "명령 A 다음에 명령 B를 보내려면 최소 얼마를 기다려야 하는가"라는 규칙이며, 그 뒤에는 모두 물리적 이유가 있다. 비트라인에 전하가 퍼지고 센스 앰프가 증폭하는 시간, 셀이 다시 채워지는 시간, 비트라인이 중간 전압으로 돌아오는 시간, 전원망이 순간 전류를 견디는 한계 같은 것들이다.

CLK CMD BANK DQ ACT RD PRE ACT 센싱 로우 열림 (ACTIVE) 프리차지 다음 로우 BL8 = 4 tCK tRCD CL tRAS (셀 재저장 완료까지) tRP tRC = tRAS + tRP (같은 뱅크 ACT → ACT)
그림 5-4. 한 번의 읽기에 필요한 기본 타이밍(개념도, 축척 아님). ACT 후 tRCD가 지나야 RD, RD 후 CL이 지나야 첫 데이터가 나온다. PRE는 ACT로부터 tRAS 이후에야 가능하고, PRE 후 tRP가 지나야 같은 뱅크에 다시 ACT할 수 있다.

가장 기본이 되는 세 파라미터와 그 관계는 다음과 같다.

$$ t_{RC} = t_{RAS} + t_{RP}, \qquad t_{RAS} \gtrsim t_{RCD} + t_{restore}, \qquad t_{\text{first data}} = t_{RCD} + CL $$
\(t_{RCD}\): ACT → RD/WR (전하 공유 + 센스 앰프가 충분히 증폭할 때까지). \(CL\) (CAS Latency, \(t_{AA}\)): RD → 첫 데이터 비트. \(t_{RAS}\): ACT → PRE 최소 간격. 읽기는 셀 전하를 파괴하므로(4장) 센스 앰프가 셀을 완전히 다시 채울 때까지 로우를 닫으면 안 된다. \(t_{RP}\): PRE → ACT. \(t_{RC}\): 같은 뱅크에 연달아 서로 다른 로우를 열 수 있는 최소 주기.
파라미터제약물리적 이유대표값 (DDR5, 2024~2025)
tRCDACT → RD/WR전하 공유 + 센싱~14–16 ns
CL (tAA)RD → 첫 데이터컬럼 디코드, 로컬/글로벌 I/O, 직렬화~14–17 ns
CWLWR → 쓰기 데이터수신기 준비CL − 2 nCK
tRPPRE → ACT비트라인 이퀄라이즈~14–16 ns
tRASACT → PRE셀 재저장(restore)32 ns
tRCACT → ACT (같은 뱅크)tRAS + tRP~46–48 ns
tCCD_S / tCCD_LRD → RD (다른 / 같은 BG)BG 내부 I/O 경로 공유8 nCK / ~5 ns 이상
tRRD_S / tRRD_LACT → ACT (다른 뱅크)ACT 순간 전류8 nCK / ~5 ns 이상
tFAW연속 ACT 4개가 들어갈 창전원망·전하 펌프 한계~10–30 ns (페이지 크기·속도 의존)
tWR마지막 쓰기 데이터 → PRE셀에 완전히 기록30 ns (DDR4: 15 ns)
tRTPRD → PRE읽기 데이터 확보~7.5 ns
tWTR쓰기 데이터 끝 → RD버스 방향 전환~2.5–10 ns
tRFCREF → 다음 ACT여러 로우 동시 리프레시~295 ns (16 Gb)

표에서 눈여겨볼 점은 BL16 버스트가 버스를 차지하는 시간(8 nCK)과 tCCD_S가 같다는 것이다. 서로 다른 뱅크 그룹을 번갈아 읽으면 데이터 버스를 빈틈없이 채울 수 있지만, 같은 뱅크 그룹을 연달아 읽으면 tCCD_L 때문에 버스트 사이에 틈이 생긴다. 뱅크 그룹이라는 계층이 생긴 이유는 칩 내부 코어 속도가 I/O 속도를 따라가지 못하기 때문이다. 코어는 느린 채로 두고 여러 뱅크 그룹을 번갈아 쓰는 방식으로 I/O 속도를 올린 것이다.

SIMULATOR

인터랙티브 타이밍 다이어그램

시나리오
속도 (tCK)
버스트 길이
요청 → 첫 데이터—
버스트 시간—
tRC (tRAS+tRP)—
데이터 버스 점유율—
해볼 것: ① 기본값은 JEDEC DDR5-4800B(40-39-39)다. 속도를 DDR5-6400으로 바꾸면 같은 사이클 수가 더 짧은 ns가 된다. ② '히트 ×4'에서 BL16은 같은 뱅크 그룹 연속 읽기(tCCD_L ≈ 5 ns)에서 버스트 사이 틈이 생긴다. 체크박스로 뱅크 그룹을 교대하면 틈이 사라지는지 보자. ③ '쓰기'에서 tWR(30 ns) 때문에 PRE가 얼마나 늦어지는지 확인하자. tRAS(32 ns)·tRTP(7.5 ns)·tWR(30 ns)은 ns로 고정되어 속도에 따라 사이클 수가 자동 환산된다.

속도 등급과 "CL-tRCD-tRP" 표기

메모리 모듈 라벨의 "DDR5-6400 CL32-39-39-102" 같은 표기는 데이터 전송률과 주요 타이밍을 클럭 사이클 수로 적은 것이다. 6400은 핀당 초당 전송 횟수(MT/s)이고, DDR(Double Data Rate)은 클럭의 상승·하강 에지 모두에서 전송하므로 실제 클럭 주파수는 절반인 3200 MHz다. 네 숫자는 순서대로 CL, tRCD, tRP, tRAS다.

$$ t_{CK} = \frac{2}{\text{data rate}} = \frac{2000}{\text{MT/s}}\ \text{ns}, \qquad t[\text{ns}] = N_{cycle}\times t_{CK} $$
예: DDR5-6400 → \(t_{CK} = 2000/6400 = 0.3125\) ns. CL32 → \(32\times0.3125 = 10.0\) ns. JEDEC 표준 등급 DDR5-6400(CL46~56)은 약 14.4~17.5 ns다.

이 변환을 세대별로 해 보면 놀라운 사실이 드러난다. CL의 사이클 수는 세대마다 크게 늘었지만, ns로 환산한 지연은 거의 제자리다.

규격tCKCL-tRCD-tRPCL [ns]tRCD+CL [ns]64b 채널 피크 대역폭
DDR3-16001.25 ns11-11-1113.7527.512.8 GB/s
DDR4-24000.833 ns17-17-1714.1728.319.2 GB/s
DDR4-32000.625 ns22-22-2213.7527.525.6 GB/s
DDR5-4800 (JEDEC B)0.417 ns40-39-3916.6732.938.4 GB/s
DDR5-6400 (JEDEC)0.3125 ns46-46-4614.3828.851.2 GB/s
DDR5-6400 (XMP 오버클럭)0.3125 ns32-39-3910.022.251.2 GB/s

10여 년 동안 대역폭은 4배가 되었지만 첫 데이터까지의 지연은 ~14 ns 근처에 머물러 있다. 지연을 결정하는 것이 I/O 속도가 아니라 셀 어레이의 아날로그 물리, 즉 수십 fF짜리 셀 커패시터가 그보다 몇 배 큰 비트라인 커패시턴스를 흔드는 속도(4장)이기 때문이다. 1장에서 본 메모리 월의 핵심이 바로 이것이다.

"CL이 낮을수록 빠르다"의 함정 CL은 사이클 단위이므로 속도가 다른 두 모듈을 CL 숫자로 비교하면 안 된다. DDR4-3200 CL16(10 ns)은 DDR5-6400 CL32(10 ns)와 첫 워드 지연이 같다. 그러나 64바이트 캐시 라인 하나를 다 받는 시간, 그리고 부하가 걸렸을 때의 실효 지연은 대역폭이 큰 DDR5 쪽이 유리하다. 오버클럭 XMP/EXPO 프로파일은 전압(예: 1.35~1.4 V)을 올려 이런 낮은 타이밍을 얻는다.
SIMULATOR

속도 등급 → 실제 지연 계산기

프리셋
tCK—
CL (히트 첫 데이터)—
tRCD+CL (미스)—
tRP+tRCD+CL (컨플릭트)—
64b 피크 대역폭—
64 B 전송 시간 (64b)—
해볼 것: 그래프의 점선은 CL이 같은 ns가 되는 등지연선이다. 프리셋 점들이 대부분 12.5~17.5 ns 띠 안에 모여 있음을 확인하자. 전송률을 두 배로 올렸을 때 같은 ns를 유지하려면 CL 사이클 수도 두 배가 되어야 한다.

로우 히트·미스·컨플릭트와 뱅크 병렬성

요청이 도착했을 때 해당 뱅크의 상태에 따라 지연은 세 가지로 갈린다.

$$ \begin{aligned} L_{hit} &= CL + t_{BURST} \\ L_{miss} &= t_{RCD} + CL + t_{BURST} \\ L_{conflict} &= t_{RP} + t_{RCD} + CL + t_{BURST} \end{aligned} $$
히트: 원하는 로우가 이미 열려 있음. 미스(빈 뱅크): 뱅크가 프리차지되어 있음. 컨플릭트: 다른 로우가 열려 있어 먼저 닫아야 함. \(t_{BURST}\)는 버스트 전송 시간(DDR5 BL16 = 8 nCK, 6400 MT/s에서 2.5 ns).
tRCD = CL = tRP = 14 ns, tBURST = 2.5 ns (1 ns = 11 px) 로우 히트 CL 16.5 ns 로우 미스 (빈 뱅크) tRCD CL 30.5 ns 로우 컨플릭트 tRP tRCD CL 44.5 ns ■ 데이터 버스트
그림 5-5. 같은 DRAM이라도 뱅크 상태에 따라 지연이 2.7배까지 차이 난다. 로우 버퍼는 사실상 뱅크마다 붙은 1~8 KB짜리 '캐시'이고, 히트율이 성능을 좌우한다.

평균 지연은 세 경우의 가중 평균이다. 히트 60 %, 미스 10 %, 컨플릭트 30 %라면

$$ \bar L = h\,L_{hit} + m\,L_{miss} + c\,L_{conf} = 0.6(16.5) + 0.1(30.5) + 0.3(44.5) \approx 26.3\ \text{ns} $$
여기에 컨트롤러 큐 대기, 온칩 네트워크, 캐시 탐색 시간이 더해져 CPU가 체감하는 메모리 지연은 보통 70~120 ns가 된다.

뱅크 병렬성과 인터리빙

지연이 수십 ns라도 대역폭까지 그만큼 나쁜 것은 아니다. 명령 버스는 한 사이클에 명령 하나를 보낼 수 있으므로, 뱅크 0이 tRCD를 기다리는 동안 뱅크 1에 ACT, 뱅크 2에 RD를 보낼 수 있다. 연속된 요청이 서로 다른 뱅크로 흩어지도록 주소를 배치하는 것을 뱅크 인터리빙(bank interleaving)이라 한다. 이상적으로는 뱅크 \(N\)개가 tRC를 서로 겹쳐 숨겨서, 데이터 버스가 쉬지 않고 버스트를 내보낸다.

하지만 ACT를 무한히 빨리 보낼 수는 없다. ACT 한 번은 로우 전체의 비트라인 수천 개를 한꺼번에 충방전하므로 큰 순간 전류가 흐른다. 그래서 ACT 사이 최소 간격 tRRD와, 연속 ACT 4개가 반드시 들어가야 하는 창 tFAW(Four Activate Window)가 정해져 있다.

시간 ACT0 ACT1 ACT2 ACT3 금지 ACT4 ACT5 tRRD tFAW: 이 창 안에 ACT는 최대 4개 ACT4는 ACT0로부터 tFAW가 지나야 가능 최대 ACT 속도 = min(1/tRRD, 4/tFAW)
그림 5-6. tRRD와 tFAW. 서로 다른 뱅크라도 ACT는 tRRD 간격 이상, 그리고 임의의 tFAW 창 안에 4개 이하로만 보낼 수 있다. 로우 버퍼 히트가 거의 없는 랜덤 접근에서는 이 전력 제약이 대역폭의 상한이 된다.

예를 들어 tFAW를 13 ns로 가정하면 초당 ACT는 최대 \(4/13\ \text{ns} \approx 3.1\times10^8\)회다. 모든 접근이 컨플릭트/미스여서 ACT 한 번에 64바이트만 가져간다면 대역폭 상한은 \(3.1\times10^8\times64 \approx 19.7\) GB/s로, DDR5-6400 서브채널의 피크 25.6 GB/s에 못 미친다. 랜덤 접근이 순차 접근보다 느린 이유가 지연만이 아니라 전력 예산에도 있다는 뜻이다.

SIMULATOR

뱅크 · 로우 버퍼 시뮬레이터

요청 패턴
뱅크 수
페이지 정책
PRE (tRP)ACT (tRCD)RD → CL데이터 버스: 히트 미스 컨플릭트
로우 히트율—
미스 / 컨플릭트—
평균 서비스 지연—
실효 대역폭—
버스 이용률—
해볼 것: 모델은 DDR5-6400 서브채널(피크 25.6 GB/s)의 단순화판이다(tRCD=CL=tRP=14 ns, tRAS 32 ns, BL16 2.5 ns, tRRD 2.5 ns, tFAW 13 ns 가정, 요청 256개를 순서대로 발행). 주소는 [로우 | 뱅크 | 컬럼(64줄=4 KB)]로 매핑된다. ① 순차 패턴은 오픈 페이지에서 히트율 ~98 %. ② 스트라이드를 2^6 = 64줄(4 KB)로 두면 매 요청이 다음 뱅크로 넘어가고, 2^6 × 뱅크 수로 두면 모든 요청이 같은 뱅크의 다른 로우를 두드리는 최악의 컨플릭트가 된다. ③ 랜덤 패턴에서는 히트가 거의 없으므로 클로즈 페이지가 서비스 지연을 크게 줄인다(컨플릭트 → 미스). 뱅크 수를 1 → 32로 늘리면 대역폭이 어떻게 변하는지도 보자. 요청을 순서대로만 발행하므로, 바쁜 뱅크 하나가 뒤의 요청까지 막는 현상(head-of-line blocking)도 함께 나타난다.

주소 매핑: 물리 주소를 비트로 자르기

CPU가 내는 물리 주소는 그냥 하나의 큰 정수다. 메모리 컨트롤러는 이 주소의 비트들을 잘라 채널·랭크·뱅크 그룹·뱅크·로우·컬럼 필드에 배정한다. 이 배정 규칙, 곧 주소 매핑(address mapping)은 하드웨어에 고정된 단순한 배선이지만, 어떤 비트를 어디에 두느냐에 따라 같은 프로그램의 히트율과 병렬성이 크게 달라진다.

35비트 물리 주소 (32 GiB) — 매핑 A: 로우 | 랭크 | BG | BA | 컬럼 | 채널 | 오프셋 로우 (16) Rk BG (3) BA 컬럼 (6) Ch 오프셋 (6) 3419 1817:15 14:1312:7 65:0 캐시 라인 64 B 안의 바이트 연속 라인 → 서브채널 교대 같은 로우 안 64라인 (4 KB) 상위 비트: 같은 뱅크의 다른 로우 4 KB × 2채널 = 8 KB마다 다음 뱅크
그림 5-7. 매핑의 예(2 서브채널 × 2 랭크 × 32 뱅크, 로우 버퍼 4 KB). 하위 비트일수록 연속 주소에서 빠르게 변한다. 컬럼을 하위에 두면 순차 접근이 같은 로우에 머물러 히트율이 높고, 뱅크를 하위에 두면 연속 요청이 여러 뱅크로 퍼져 병렬성이 높다.

매핑 설계의 기본 원칙은 두 가지다. 첫째, 공간 지역성을 로우 버퍼에 담는다. 캐시 라인 몇 개가 연달아 접근될 때 같은 로우에 머물도록 컬럼 비트를 낮은 쪽에 둔다. 둘째, 충돌을 여러 뱅크로 흩는다. 행렬의 열 방향 순회처럼 큰 2의 거듭제곱 간격(스트라이드)으로 접근하면, 매핑 A에서는 뱅크 비트가 변하지 않고 로우 비트만 변해서 한 뱅크에서 컨플릭트가 연달아 일어난다. 이를 막기 위해 많은 컨트롤러가 로우 비트 일부를 뱅크 비트에 XOR해 섞는 순열 기반 인터리빙(permutation-based / XOR bank hashing)을 쓴다.

$$ BA'_i = BA_i \oplus R_{j(i)}, \qquad BG'_i = BG_i \oplus R_{k(i)} $$
XOR은 가역이므로 서로 다른 주소가 같은 (뱅크, 로우)에 겹치지 않는다. 같은 로우의 주소들은 뱅크가 그대로라 히트율은 유지되고, 로우만 다른 주소들은 서로 다른 뱅크로 흩어진다. 실제 CPU의 해시 함수는 대부분 공개되어 있지 않고, 여러 비트를 XOR하는 더 복잡한 형태다.
SIMULATOR

주소 매핑 비트 분해기

매핑 방식
아래 격자: 64회 접근의 간격
채널 / 랭크—
BG / 뱅크—
로우 / 컬럼—
64회 중 쓰인 뱅크—
64회 중 로우 히트 가능—
해볼 것: 주소를 직접 입력하거나 버튼으로 움직여 보자. 격자는 현재 주소부터 선택한 간격으로 64번 접근했을 때 128개 (채널, 랭크, 뱅크) 칸에 몇 번씩 떨어지는지 보여 준다. 매핑 A에서 간격 1 MB(= 로우 비트만 바뀜)는 전부 한 뱅크에 몰리고, 'A + XOR'로 바꾸면 여러 뱅크로 흩어진다. 매핑 B는 64 B 순차 접근을 BG 8개로 흩어 tCCD_S를 살리지만 같은 로우에 머무는 비율이 낮아진다.
채널 인터리빙과 NUMA 채널 비트를 어디에 두는지는 대역폭 분배의 문제다. 채널을 캐시 라인(64 B)이나 256 B 단위로 교대하면 한 스레드도 모든 채널의 대역폭을 쓰고, 4 KB 페이지 단위로 교대하면 OS가 페이지를 특정 채널에 배치하는 페이지 컬러링으로 간섭을 줄일 수 있다. 7장의 HBM은 한 스택에 독립 채널 16개(HBM3: 의사 채널 32개)가 있어 이 문제가 더 두드러진다.

리프레시: 잊어버리는 메모리의 대가

4장에서 보았듯 DRAM 셀 커패시터의 전하는 접합 누설, GIDL, 서브스레숄드 누설로 조금씩 빠져나간다. 대부분의 셀은 수 초를 버티지만, 수십억 셀 중 가장 약한 꼬리 분포의 셀까지 지키기 위해 JEDEC는 모든 셀을 정해진 창 안에 한 번씩 다시 써 주도록 규정한다. 이 창이 리프레시 주기 \(t_{REFW}\)다.

REF 한 번이 들어오면 칩은 내부 카운터가 가리키는 로우들을 모든 뱅크에서 동시에 ACT·PRE한다. 이 동안(\(t_{RFC}\)) 랭크 전체가 다른 명령을 받을 수 없다. 뱅크당 로우 수를 REF 횟수로 나누면 REF 한 번에 뱅크마다 몇 개의 로우를 새로 고쳐야 하는지 나온다. 16 Gb DDR5 ×8(뱅크당 65,536 로우)이라면 \(65{,}536/8192 = 8\)개다.

t_REFW = 32 ms (DDR5) — REF 8192회 REFREFREF 정상 접근 가능정상 접근 가능… t_REFI = 3.9 µs t_RFC ≈ 295 ns (tRFC 폭은 보기 쉽게 과장)
그림 5-8. 리프레시 타임라인. 컨트롤러는 평균 t_REFI마다 REF를 보내고, 매 REF 뒤 t_RFC 동안 랭크는 다른 요청을 처리하지 못한다. DDR4는 최대 8개 REF까지 미뤘다가 몰아서 보낼 수 있어 바쁜 순간을 피할 수 있다.
$$ \text{리프레시 오버헤드} \approx \frac{t_{RFC}}{t_{REFI}}, \qquad t_{REFI} = \frac{t_{REFW}}{8192} $$
DDR4 16 Gb: \(550\ \text{ns} / 7.8\ \mu s \approx 7.1\%\) (고온에서는 14 %). DDR5 16 Gb: \(295\ \text{ns}/3.9\ \mu s \approx 7.6\%\). 이 비율만큼 랭크가 '멈춰' 있고, 그 사이 도착한 요청의 지연은 최대 t_RFC만큼 튄다.

문제는 이 오버헤드가 용량과 함께 커진다는 것이다. REF 횟수는 8192로 고정인데 칩의 로우 수는 세대마다 두 배로 늘기 때문에, REF 한 번에 더 많은 로우를 처리해야 한다. 한꺼번에 여는 로우를 늘리면 전류 한계(tFAW와 같은 이유)에 걸리므로 tRFC가 길어질 수밖에 없다.

칩 용량DDR3 tRFCDDR4 tRFCDDR5 tRFC (all-bank)DDR5 tRFCsb (same-bank)
4 Gb260 ns260 ns——
8 Gb350 ns350 ns195 ns~115 ns
16 Gb—550 ns295 ns~130 ns
32 Gb——~410 ns~190 ns

DDR5는 이를 누그러뜨리기 위해 동일 뱅크 리프레시(REFsb, same-bank refresh)를 도입했다. REFsb는 모든 뱅크 그룹에서 같은 번호의 뱅크 하나씩(32개 중 8개)만 리프레시하고, 나머지 24개 뱅크는 정상 접근을 계속 받는다. LPDDR의 뱅크별 리프레시(REFpb)도 같은 아이디어다. 이 밖에도 온도 센서로 저온에서 리프레시를 줄이거나, 셀 보존 시간을 측정해 강한 로우는 덜 자주 리프레시하는 연구(RAIDR 등)가 있다.

리프레시와 로우해머 같은 로우를 짧은 시간에 수만 번 ACT하면 이웃 로우의 셀 전하가 리프레시 전에 빠져 비트가 뒤집히는 로우해머(RowHammer) 현상이 생긴다. 미세화로 셀 간격이 좁아질수록 뒤집힘에 필요한 ACT 수가 줄어서, DDR4의 TRR(Target Row Refresh), DDR5의 RFM(Refresh Management) 명령처럼 '추가 리프레시'로 막는 기법이 도입되었다. 자세한 내용은 11장에서 다룬다.
SIMULATOR

리프레시 오버헤드 계산기

칩 (프리셋)
온도
리프레시 모드
tREFI—
랭크 정지 비율—
뱅크당 차단 비율—
REF당 뱅크별 로우—
잃는 대역폭 (서브채널)—
해볼 것: DDR4 16 Gb를 고온으로 바꾸면 랭크가 시간의 14 %를 리프레시로 쓴다. tRFC 슬라이더를 끝까지 올려 64 Gb급 칩을 가정해 보자(tRFC가 1 µs에 가까워지면?). DDR5 프리셋에서 Same-bank 모드로 바꾸면 랭크 전체가 멈추는 시간이 사라지고, 한 번에 8개 뱅크만 짧게(tRFCsb) 막힌다. 아래 막대는 표준 칩들의 all-bank 오버헤드(정상 온도)를 비교한다.

메모리 컨트롤러와 스케줄링

지금까지의 규칙을 모두 지키면서 요청들을 어떤 순서로 처리할지 정하는 것이 메모리 컨트롤러의 핵심 업무다. 컨트롤러는 코어들로부터 온 읽기/쓰기 요청을 큐에 쌓고, 매 사이클 "지금 타이밍 규칙상 보낼 수 있는 명령들" 중 하나를 골라 명령 버스에 싣는다.

코어 0 코어 1 GPU / DMA 메모리 컨트롤러 읽기 큐 쓰기 큐 (버퍼) 리프레시 타이머 주소 매핑 스케줄러 FR-FCFS 뱅크 상태 추적 타이밍 검사기 CMD/ADDR DQ (양방향) DRAM 랭크 요청 → (채널, 랭크, 뱅크, 로우, 컬럼)으로 변환 → 뱅크별로 가능한 명령 중 최선을 선택
그림 5-9. 메모리 컨트롤러의 구조. 요청은 주소 매핑을 거쳐 뱅크별로 분류되고, 스케줄러는 뱅크 상태와 모든 타이밍 제약을 추적하면서 매 사이클 보낼 명령을 고른다. 쓰기는 버퍼에 모았다가 한꺼번에 처리한다.

FCFS와 FR-FCFS

가장 단순한 정책은 도착 순서대로 처리하는 FCFS(First-Come First-Served)다. 공정하지만, 로우 A와 로우 B를 번갈아 요청하는 스트림이 오면 매번 컨플릭트가 난다. 2000년 Rixner 등이 제안한 FR-FCFS(First-Ready FCFS)는 두 단계 우선순위를 쓴다.

  1. First-Ready: 지금 열려 있는 로우에 히트하는(= 바로 RD/WR 가능한) 요청을 먼저.
  2. FCFS: 그런 요청이 없으면 가장 오래된 요청.

로우 히트를 몰아서 처리하므로 히트율과 처리량이 크게 오른다. 대가는 공정성이다. 로우 히트를 계속 만들어 내는 스트리밍 스레드가 있으면 다른 스레드의 요청은 한없이 밀릴 수 있다(기아, starvation). 그래서 실제 컨트롤러는 요청 나이 상한(age cap), 한 로우에서 연속 히트 횟수 제한, 스레드별 우선순위(ATLAS, TCM 같은 연구) 등을 더한다.

명령 버스 파이프라이닝과 쓰기 배치

DDR5에서 ACT와 RD/WR은 명령 버스 2사이클을, PRE는 1사이클을 쓴다. 한 뱅크의 tRCD·CL을 기다리는 동안 명령 버스는 다른 뱅크의 명령으로 채워진다. 잘 스케줄된 컨트롤러는 여러 뱅크의 ACT → RD → PRE 사슬을 엇갈려 겹쳐서 데이터 버스를 연속 버스트로 채운다. 한편 데이터 버스는 양방향이라 읽기 ↔ 쓰기 전환 때마다 tWTR·tRTW만큼 버스가 논다. 그래서 컨트롤러는 쓰기를 버퍼에 모았다가 버퍼가 상한(high watermark)에 이르면 한꺼번에 쓰고(write drain), 하한(low watermark)까지 비우면 다시 읽기로 돌아간다.

SIMULATOR

스케줄러 비교: FCFS vs FR-FCFS

뱅크 수
데이터 버스트: 히트 미스 컨플릭트숫자 = 요청 도착 순번
FCFS 완료 시간—
FR-FCFS 완료 시간—
히트율 FCFS / FR—
평균 지연 FCFS / FR—
FR-FCFS에서 더 늦어진 요청 (최대)—
해볼 것: 요청 40개가 2 ns 간격으로 도착하고, 각 뱅크에는 '핫 로우' 하나와 다른 로우 3개가 섞여 요청된다. 지역성이 높을수록 FR-FCFS는 핫 로우 요청을 앞당겨 묶어서 완료 시간을 줄이지만, 그 대가로 일부 요청은 FCFS 때보다 더 늦게 끝난다(마지막 칸: 개수와 최대 지연 증가량). 데이터 버스트의 숫자(도착 순번)가 뒤섞인 모습에서 재정렬을 확인하자. 히트를 계속 만드는 스트림이 끝없이 들어오면 이렇게 밀린 요청이 기아에 빠진다. 탐색 창을 1로 줄이면 FR-FCFS가 FCFS와 똑같아진다.

DRAM 전력: 활성화, 배경, 셀프 리프레시

서버에서 DRAM은 시스템 전력의 상당 부분(워크로드에 따라 대략 10~30 %)을 차지한다. DRAM 전력은 크게 네 가지로 나뉜다.

데이터시트는 이를 상태별 전류 IDD로 제공한다. Micron의 전력 계산 방식을 따르면, ACT 한 번의 에너지는 ACT-PRE를 tRC마다 반복할 때의 전류(IDD0)에서 배경 전류를 뺀 것으로 추정한다.

$$ E_{ACT} \approx V_{DD}\left[I_{DD0}\,t_{RC} - \left(I_{DD3N}\,t_{RAS} + I_{DD2N}\,(t_{RC}-t_{RAS})\right)\right] $$
가상의 예시값: \(V_{DD}\) = 1.1 V, \(I_{DD0}\) = 60 mA, \(I_{DD3N}\) = 45 mA, \(I_{DD2N}\) = 35 mA, \(t_{RC}\) = 48 ns, \(t_{RAS}\) = 32 ns → \(1.1\times(2880 - 1440 - 560)\ \text{pC} \approx 0.97\) nJ (칩당). 랭크의 칩 4~8개가 동시에 열리므로 ACT 한 번은 수 nJ 수준이다.
IDD상태상대 크기의미
IDD0ACT-PRE 반복 (tRC 주기)중간활성화 에너지 추정의 기준
IDD2N / IDD2P프리차지 스탠바이 / 파워다운낮음 / 매우 낮음모든 뱅크 닫힘
IDD3N / IDD3P액티브 스탠바이 / 파워다운낮음~중간로우가 열린 채 대기
IDD4R / IDD4W연속 읽기 / 쓰기 버스트높음대역폭에 비례하는 전력
IDD5B연속 리프레시 (tRFC 동안)가장 높음짧은 순간의 피크 전류
IDD6셀프 리프레시최저 (수~수십 mA)외부 클럭 없이 데이터 보존

셀프 리프레시(Self-Refresh)는 시스템이 잠들 때 쓰는 모드다. 컨트롤러가 SRE 명령을 보내면 DRAM은 외부 클럭 없이 내부 발진기로 스스로 리프레시하며 데이터만 지킨다. 노트북의 절전(S3, suspend-to-RAM)이 이 상태다. LPDDR은 여기에 온도에 따라 리프레시 주기를 바꾸는 TCSR, 쓰지 않는 영역은 리프레시하지 않는 부분 어레이 셀프 리프레시(PASR) 같은 기능을 더해 대기 전력을 더 줄인다(6장). 짧은 유휴 구간에는 셀프 리프레시보다 진입·탈출이 빠른 파워다운(입력 버퍼와 클럭 수신 회로 정지)을 쓴다.

에너지로 본 오픈 페이지 랜덤 접근에서 64 B를 읽는 데 드는 에너지는 대략 [ACT 에너지 + 버스트 에너지]인 반면, 로우 히트는 버스트 에너지만 든다. 그래서 스케줄러가 히트를 몰아 처리하면 성능과 에너지가 동시에 좋아진다. HBM(7장)이 비트당 에너지가 낮은 이유 중 하나도 짧은 배선과 작은 페이지(1 KB 이하)로 활성화·I/O 에너지를 줄였기 때문이다. 메모리 시스템 전체의 전력 설계는 13장에서 다시 다룬다.

핵심 정리

  1. DRAM은 채널 → 랭크 → 칩 → 뱅크 그룹 → 뱅크 → 로우/컬럼으로 조직된다. 채널은 버스가 독립, 랭크는 버스를 공유, 뱅크는 로우 버퍼가 독립이다. DDR5 16 Gb ×8 칩은 32뱅크 × 64K 로우 × 1 KB 페이지다.
  2. ACT는 로우 전체를 로우 버퍼(센스 앰프)로 열고, RD/WR은 그 일부(버스트 64 B)를 입출력하며, PRE는 로우를 닫는다. REF는 셀 전하를 주기적으로 되살린다.
  3. tRCD(ACT→RD), CL(RD→데이터), tRP(PRE→ACT), tRAS(ACT→PRE), tRC = tRAS + tRP. tCCD·tRRD·tFAW는 뱅크 그룹 구조와 전력 한계에서 나온다.
  4. "CL-tRCD-tRP"는 사이클 수다. \(t_{CK} = 2000/\text{MT/s}\) ns로 환산하면 세대가 바뀌어도 CL은 ~14 ns 근처로 거의 일정하다. 대역폭은 늘었지만 지연은 셀 물리에 묶여 있다.
  5. 지연은 히트(CL) < 미스(tRCD+CL) < 컨플릭트(tRP+tRCD+CL)로 갈린다. 오픈/클로즈 페이지 정책과 주소 매핑이 히트율을, 뱅크 인터리빙이 병렬성을 결정한다.
  6. 주소 매핑은 물리 주소 비트를 필드로 자르는 규칙이다. 컬럼 비트를 아래에 두면 로우 지역성을, 뱅크 비트를 아래에 두거나 XOR 해시를 쓰면 병렬성과 스트라이드 내성을 얻는다.
  7. 리프레시 오버헤드 ≈ tRFC/tREFI (DDR4 16 Gb ~7 %, 고온 ~14 %). 용량이 커질수록 tRFC가 늘어 오버헤드가 커지며, DDR5 동일 뱅크 리프레시(REFsb)가 이를 완화한다.
  8. FR-FCFS는 로우 히트를 우선해 처리량과 에너지 효율을 높이지만 기아를 막는 장치가 필요하다. 전력은 활성화·버스트·배경·리프레시로 나뉘고, 셀프 리프레시가 대기 전력을 최소화한다.

확인 퀴즈

1. DDR5-6400 CL32 모듈의 CAS 지연을 ns로 환산하면?

6400 MT/s의 클럭은 3200 MHz이므로 \(t_{CK} = 0.3125\) ns. \(32 \times 0.3125 = 10\) ns. DDR4-3200 CL16(16 × 0.625 = 10 ns)과 같은 지연이다.

2. tRP = tRCD = CL = 14 ns일 때, 다른 로우가 열려 있는 뱅크에 읽기 요청이 오면 첫 데이터까지 최소 얼마가 걸리는가? (버스트 시간 제외)

로우 컨플릭트는 PRE(tRP) → ACT(tRCD) → RD(CL)를 모두 거친다. 14 × 3 = 42 ns. 같은 로우가 열려 있었다면(히트) 14 ns면 된다. 단, 열린 로우가 ACT된 지 tRAS가 지나지 않았다면 PRE부터 더 기다려야 한다.

3. DDR4 16 Gb 칩(tRFC = 550 ns)을 85 °C 이하에서 쓸 때 리프레시로 랭크가 멈춰 있는 시간의 비율은 대략?

\(t_{REFI} = 64\ \text{ms}/8192 = 7.8\ \mu s\), 오버헤드 ≈ 550 ns / 7.8 µs ≈ 7.1 %. 85 °C를 넘으면 tREFI가 3.9 µs로 줄어 약 14 %가 된다.

4. tFAW 제약이 존재하는 가장 근본적인 이유는?

ACT는 로우 전체의 비트라인 수천 개를 동시에 충방전한다. 서로 다른 뱅크라도 짧은 창 안에 ACT가 몰리면 전원 전압이 출렁이므로 tRRD와 tFAW로 속도를 제한한다. 셀 재저장은 tRAS, 버스 전환은 tWTR/tRTW의 이유다.

5. FR-FCFS 스케줄러에 대한 설명으로 옳은 것은?

First-Ready(로우 히트 우선) → FCFS(오래된 순) 두 단계 우선순위다. 히트를 몰아 처리하므로 히트율과 대역폭이 오르지만, 히트를 계속 만드는 스트림이 있으면 다른 요청이 굶을 수 있어 나이 상한 등의 보완책을 둔다.

6. 매핑 [로우 | 뱅크 | 컬럼 | 오프셋]에서 프로그램이 정확히 '로우 버퍼 크기 × 뱅크 수' 간격으로 메모리를 순회하면 어떤 일이 생기고, 흔한 해결책은?

이 간격이면 주소가 바뀔 때 로우 필드만 1씩 증가하고 뱅크·컬럼 필드는 그대로다. 매번 같은 뱅크의 다른 로우를 열어야 해서 tRC마다 한 번씩만 접근할 수 있다. XOR 뱅크 해싱은 로우 비트 변화를 뱅크 변화로 바꿔 요청을 여러 뱅크로 흩는다.