지난 포스팅에서 우리는 MLP(Fully Connected Layer)가 하드웨어 관점에서 얼마나 비효율적인지 확인했습니다. 가중치(Weight)를 한 번 가져와서 딱 한 번만 쓰고 버리는 구조 때문에, 시스템 성능이 메모리 대역폭에 의해 제한되는 Memory Wall 현상을 겪게 되죠.
하지만 딥러닝이 세상을 바꿀 수 있었던 진짜 주인공은 MLP가 아니라 CNN(Convolutional Neural Network)이었습니다. 알고리즘 연구자들은 CNN이 이미지의 공간적 특징(Feature)을 잘 잡아낸다고 칭찬하지만, 우리 같은 하드웨어 엔지니어들은 전혀 다른 이유로 CNN을 사랑합니다.
바로 지역성(Locality)과 재사용(Reuse)입니다. 이번 글에서는 CNN의 Sliding Window 방식이 반도체 칩 내부의 SRAM(온칩 버퍼) 효율을 어떻게 극대화하는지, 그리고 왜 NPU가 CNN을 돌릴 때만 제 성능(TOPS)을 뿜어낼 수 있는지 그 물리적인 이유를 파헤쳐 보겠습니다.
1. 지역성(Locality): 캐시 메모리의 존재 이유
컴퓨터 구조(Computer Architecture) 이론에서 가장 중요한 개념 중 하나는 참조의 지역성(Locality of Reference)입니다.
- Temporal Locality) 방금 쓴 데이터를 곧 다시 쓸 확률이 높다.
- Spatial Locality: 방금 쓴 데이터의 옆집 데이터를 쓸 확률이 높다.
CPU나 GPU, NPU 안에 있는 캐시(Cache)나 SRAM 버퍼는 오직 이 원칙 하나를 믿고 설계됩니다. 느리고 전력을 많이 먹는 DRAM까지 가지 말고, 자주 쓰는 데이터는 칩 안의 빠른 SRAM에 두자는 것이죠. MLP는 이 원칙을 무시합니다. (랜덤하게 연결되거나, 한 번 쓰고 버림). 반면, CNN은 이 지역성 원칙의 끝판왕입니다.
2. Sliding Window: 데이터 재사용
CNN의 핵심 연산인 합성곱(Convolution)을 하드웨어 관점에서 봅시다. 3 * 3 크기의 필터(커널)가 거대한 입력 이미지 위를 한 칸씩 이동하며(Sliding) 도장을 찍습니다. 이 과정에서 엄청난 데이터 재사용(Data Reuse)이 발생합니다.
A. 가중치 재사용 (Weight Reuse)
MLP에서는 가중치가 입력값 하나랑 곱해지고 끝났습니다. 하지만 CNN에서는 하나의 필터(Weight set)가 이미지의 왼쪽 위부터 오른쪽 아래까지 훑고 지나갑니다.
만약 입력 이미지가 224 * 224 크기라면, 동일한 3 * 3 필터 가중치는 무려 50,176번 (224 * 224)이나 재사용됩니다.
- DRAM 접근: 1회 (필터 로딩)
- 연산(MAC): 50,000회 이상
- 결과: 연산 강도(Arithmetic Intensity)가 폭발적으로 증가합니다.
B. 입력 데이터 재사용 (Input Reuse)
Sliding Window는 옆으로 한 칸 이동합니다. 이때, 이전 윈도우와 현재 윈도우는 대부분의 픽셀을 공유(Overlap)합니다.
3 * 3 윈도우가 한 칸 이동하면, 9개의 픽셀 중 6개는 이전과 동일한 픽셀입니다. 즉, 입력 데이터를 매번 DRAM에서 새로 가져올 필요 없이, 칩 내부의 레지스터나 라인 버퍼(Line Buffer)에 잠시 담아두면 계속 재사용할 수 있습니다.
3. SRAM 효율성
이러한 재사용 특성 덕분에 CNN 전용 NPU(가속기)는 다음과 같은 메모리 계층 전략을 취할 수 있습니다.
- Load: 필터(Weight)와 이미지의 일부(Input Row)를 DRAM에서 칩 내부의 글로벌 버퍼(Global Buffer, 대용량 SRAM)로 가져옵니다.
- Multicast: 글로벌 버퍼에 있는 데이터를 수백 개의 연산기(PE)로 뿌려줍니다.
- Compute & Reuse: 각 PE는 로컬 레지스터 파일(RF)에 데이터를 저장해 두고, 수천 번의 곱셈을 수행할 때까지 DRAM을 쳐다보지도 않습니다.
이것이 바로 NPU가 높은 성능을 낼 수 있는 비결입니다. 에너지 소모가 큰 DRAM 접근을 최소화하고, 에너지 소모가 적은 SRAM과 레지스터 수준에서 연산을 끝내버리기 때문입니다.
Quantitative Fact:
45nm 공정 기준, DRAM 접근 1회의 에너지는 약 640 pJ인 반면, 칩 내부의 작은 SRAM(8KB) 접근 에너지는 약 10 pJ 수준입니다. CNN의 높은 재사용성 덕분에 우리는 640 pJ짜리 비용을 10 pJ로, 더 나아가 레지스터 수준(0.1 pJ)으로 낮출 수 있습니다. 이것이 CNN이 하드웨어 친화적인 이유입니다.
4. Compute-Bound
지난 글에서 MLP는 Memory-Bound라고 했습니다. 데이터가 안 와서 연산기가 놀고 있는 상황이죠.
하지만 CNN은 데이터 재사용률이 높아서, 한 번 데이터를 가져오면 연산기들이 오랫동안 사용할 수 있습니다. 즉, 메모리 대역폭이 아니라 연산 속도(TOPS)가 전체 성능을 결정하는 Compute-Bound 영역으로 진입하게 됩니다.
이때부터는 Architect의 실력이 중요해집니다. “어떻게 하면 수천 개의 곱셈기(MAC)를 100% 가동률로 돌릴 것인가?” 이 고민이 바로 Dataflow(데이터 흐름) 최적화와 매핑(Mapping) 전략으로 이어집니다.
5. 결론: CNN은 하드웨어의 축복
결론적으로, 하드웨어가 CNN을 사랑하는 이유는 단순히 유명해서가 아닙니다. 적은 메모리 대역폭으로도 엄청난 양의 연산을 수행할 수 있는 구조(High Arithmetic Intensity)를 가졌기 때문입니다. CNN의 등장으로 인해 AI 반도체는 비로소 ‘메모리 셔틀’에서 벗어나 진정한 ‘연산 가속기’로서의 면모를 갖추게 되었습니다.
하지만 모든 것이 완벽할 수는 없습니다. 이 효율적인 CNN 연산을 실제로 하드웨어에 매핑하려고 보니, 복잡한 6중 루프(Loop)를 어떻게 풀어낼지(Unrolling)에 대한 새로운 고민이 시작됩니다.
다음 글에서는 이 CNN 연산을 실제로 처리하기 위한 3가지 핵심 전략, “Conv 연산의 3가지 매핑: Direct vs Im2Col vs Winograd”에 대해 알아보겠습니다.
참고: An Energy-Efficient Reconfigurable Accelerator for Deep Convolutional Neural Networks