지난 포스팅(Systolic Array)에서 우리는 수만 개의 연산기(PE)가 맞물려 돌아가는 강력한 하드웨어 구조를 확인했습니다. 하지만 하드웨어 엔지니어 관점에서 연산기 자체보다 더 큰 고민은 “어떻게 하면 데이터를 끊김 없이, 그리고 저렴하게 공급할 것인가?”입니다.
Mark Horowitz(Stanford) 교수의 분석에 따르면, 45nm 공정에서 64비트 부동소수점 연산(FMA) 자체에 드는 에너지보다 그 데이터를 DRAM에서 가져오는 데 드는 에너지가 약 200배에서 1,000배 더 큽니다. 즉, 성능(Performance)과 전력 효율(Efficiency)의 성패는 연산기 개수가 아니라 데이터 이동 거리의 최소화에 달려 있습니다. 이를 위해 NPU는 고도로 최적화된 3단계 메모리 계층 구조를 가집니다.
1. 데이터 이동 비용의 정량적 이해
메모리 계층을 설계하는 근본적인 이유는 물리적 거리와 전력 소모의 상관관계 때문입니다. 각 계층별 접근 비용을 정량적으로 비교하면 다음과 같습니다. (45nm 공정 기준 정규화 수치)
- PE 내부 레지스터 (Register File): 1 (가장 가까움, 가장 저렴함)
- PE 인접 SRAM (Local Scratchpad): ~2x
- 온칩 글로벌 버퍼 (Global Buffer / Shared SRAM): ~20x
- 오프칩 메모리 (DRAM): ~200x to 1,000x (가장 멀고 비쌈)
이 격차는 NPU 설계의 과제를 명확히 해줍니다. “DRAM 접근 횟수를 최소화하고, 한 번 가져온 데이터는 최대한 칩 안에서(On-chip) 해결하라.” 이것이 바로 데이터 재사용(Data Reuse)의 핵심입니다.
2. NPU 메모리의 3단계 계층 구조 분석
Level 1: Off-chip Memory (DRAM/HBM) – 거대한 창고
- 역할: 모델의 모든 파라미터(Weights)와 대규모 입력 데이터(Feature Maps)를 저장합니다.
- 특징: 용량은 GB 단위로 가장 크지만, 접근 레이턴시가 길고 대역폭 제한(Memory Wall)이 심합니다. 최근 고성능 NPU는 이 한계를 극복하기 위해 일반 DDR 메모리 대신 적층형 메모리인 HBM(High Bandwidth Memory)을 사용하여 대역폭을 극대화합니다.
Level 2: Global Buffer (On-chip SRAM) – 중앙 물류 센터
- 역할: DRAM과 PE 사이의 완충 지대입니다. 다음에 연산할 타일(Tile) 데이터를 미리 가져와 저장합니다.
- 특징: 수 MB에서 수십 MB 용량의 고속 SRAM으로 구성됩니다. 구글 TPU v1의 ‘Unified Buffer(24MB)’가 대표적인 예입니다.
- 최적화 전략: Double Buffering 기법을 사용하여, 연산기가 버퍼 A의 데이터를 처리하는 동안 하드웨어는 백그라운드에서 버퍼 B에 다음 데이터를 DRAM으로부터 채워 넣습니다. 이를 통해 DRAM 접근 시간을 은폐(Latency Hiding)합니다.
Level 3: PE Register File (RF) – 작업대
- 역할: 연산기(MAC unit) 바로 옆에서 데이터를 직접 공급합니다.
- 특징: 용량은 수 KB로 매우 작지만, 에너지 소모가 가장 적고 단일 사이클 내 접근이 가능합니다.
- 최적화 전략: 앞서 배운 Dataflow(WS, OS, RS)가 결정되는 지점입니다. 특정 데이터(예: 가중치)를 레지스터에 고정(Stationary)시켜 수천 번 재사용함으로써 상위 계층으로의 데이터 요청을 원천 차단합니다.
3. 이동 비용 최소화 전략: Tiling (Blocking)
모델의 가중치 행렬이 온칩 버퍼보다 큰 경우, 전체를 한 번에 올릴 수 없습니다. 이때 사용하는 기법이 Tiling입니다.
- Slicing: 거대한 행렬을 온칩 버퍼 용량에 맞춰 작은 블록(Tile)으로 자릅니다.
- Mapping: 하나의 타일을 DRAM에서 버퍼로 로드합니다.
- Maximum Reuse: 로드된 타일 내의 데이터를 PE 배열 내에서 최대한 반복 연산합니다.
- Write-back: 결과가 완성되면 다시 DRAM에 기록합니다.
이 과정에서 Arithmetic Intensity(연산 강도)를 높게 유지해야 합니다. 타일 크기가 너무 작으면 연산 횟수 대비 데이터 이동 횟수가 많아져 시스템은 결국 Memory-bound 상태에 빠지게 됩니다.
4. 결론
훌륭한 NPU는 단순히 TOPS(Tera Operations Per Second) 수치가 높은 칩이 아닙니다. DRAM이라는 비싼 창고로 가는 횟수를 줄이고, 온칩 버퍼와 레지스터라는 좁지만 빠른 공간을 얼마나 영리하게 활용하느냐가 진짜 실력입니다.
참고: NVIDIA Tech Blog