NPU 설계기술 [4mm] MAC/PE에서 Systolic Array, Transformer 가속기와 FPGA/ASIC 구현까지
Updated 2026-09-29 · NEXMASON ANITEX▶ Open interactive ANITEX · equations and animations
This accessible text edition preserves the document's narrative. See the interactive edition for typeset equations, diagrams and playback.
NPU란 무엇인가
NPU(Neural Processing Unit)는 인공신경망에서 반복적으로 등장하는 행렬곱(Matrix Multiplication), 합성곱(Convolution), 벡터 연산, 활성화 함수 등을 높은 병렬성과 높은 에너지 효율로 처리하도록 설계한 AI 전용 프로세서이다.
일반적인 신경망의 한 층은 다음과 같이 표현할 수 있다.
y=f(Wx+b)
여기서 계산량의 대부분은 행렬--벡터 또는 행렬--행렬 곱셈에서 발생한다. 핵심 연산은 Multiply-Accumulate(MAC)이다.
s s+a b
따라서 NPU 설계의 핵심 문제는 단순히 곱셈기를 많이 넣는 것이 아니라,
MAC 유닛을 얼마나 효율적으로 병렬화할 것인가, 데이터를 MAC 가까이에 얼마나 오래 유지할 것인가, 외부 DRAM 접근을 얼마나 줄일 것인가, 데이터 이동과 계산을 얼마나 중첩할 것인가, 낮은 정밀도에서도 정확도를 유지할 수 있는가
로 정리할 수 있다.
CPU, GPU, NPU의 구조적 차이
CPU는 복잡한 제어 흐름과 낮은 지연시간에 최적화되어 있고, GPU는 다수의 범용 병렬 연산기에 최적화되어 있다. NPU는 Tensor 연산과 데이터 재사용에 특화된다.
[h] CPU, GPU, NPU의 개념적 비교 llll 항목 & CPU & GPU & NPU 주요 목표 & 범용 처리 & 대규모 병렬 처리 & AI Tensor 처리 제어 구조 & 복잡 & 중간 & 상대적으로 단순 대표 연산 & Scalar/SIMD & SIMT/Matrix & MAC/Tensor 데이터 재사용 & Cache 중심 & Cache/Shared Memory & Scratchpad/SRAM 중심 정밀도 & FP64/FP32 중심 & FP32/FP16 등 & INT8/FP8/INT4 등 적극 활용 에너지 효율 & 낮음--중간 & 중간 & 높음
NPU 전체 아키텍처
[h] [ node distance=8mm and 11mm, block/.style=draw, rounded corners, minimum width=32mm, minimum height=10mm, align=center, arr/.style=-Latex[length=2mm], thick ] (host) CPU / Host; (cmd) Command Processor\; (dma) DMA / AXI / NoC; (wbuf) Weight SRAM; (abuf) Activation SRAM; (obuf) Output SRAM; (tensor) Tensor Engine\ / MAC / Systolic Array; (vector) Vector Engine\ / Norm / GELU; (out) Quantize / Write Back;
(host)--(cmd); (cmd)--(dma); (dma)--(wbuf); (dma)--(abuf); (dma)--(obuf); (wbuf)--(tensor); (abuf)--(tensor); (tensor)--(obuf); (tensor)--(vector); (vector)|-(out); (tensor)--(out); 전형적인 NPU 블록 구조
실제 NPU에서는 위 블록 외에도 Clock/Reset Controller, Interrupt, Performance Counter, Power Management, Debug Interface, Memory Protection 등이 추가된다.
MAC 유닛 설계
가장 기본적인 연산은
Y=A B+C
이다. INT8 입력을 사용한다고 하자.
A,B
곱셈 결과는 대략 16비트 범위를 필요로 한다. 그러나 수백 또는 수천 개의 곱을 누산하므로 accumulator는 일반적으로 더 넓은 비트 폭을 사용한다.
예를 들어 dot product
y=_k=0^K-1a_kb_k
에서 accumulator overflow를 방지하려면 입력 비트 폭뿐 아니라 K도 고려해야 한다.
파이프라인 MAC
고속 MAC은 다음과 같이 pipeline을 구성할 수 있다.
Register Multiplier Adder Accumulator
Pipeline latency가 증가하더라도 충분히 pipeline을 채운 이후에는 매 clock마다 새로운 결과를 처리할 수 있다.
Processing Element(PE)
PE는 NPU의 기본 계산 셀이다.
[h] [ block/.style=draw,minimum width=20mm,minimum height=10mm, arr/.style=-Latex,thick ] (mul) A B; (add) +; (reg) ACC; (-2,0)--node[above]A(mul); (0,-1.3)--node[right]B(mul); (mul)--(add); (add)--(reg); (reg.south) -- ++(0,-7mm) -| (add.south); 기본적인 PE 내부 구조
PE에는 필요에 따라 다음 기능이 추가될 수 있다.
zero-skipping saturation arithmetic rounding mixed precision local register file operand forwarding
Systolic Array
행렬곱
C=AB
에서
C_ij=_k=0^K-1A_ikB_kj
이다.
Systolic Array에서는 데이터가 PE 사이를 규칙적으로 이동하면서 부분합을 계산한다.
[h] [ pe/.style=draw,minimum width=11mm,minimum height=9mm, arr/.style=-Latex[length=1.5mm],thin ] in 0,...,3 in 0,...,3 (p) at (1.5*,-1.25*) PE; in 0,...,3 (-1,-1.25*)--(p0); in 0,...,2 +1 (p)--(p); in 0,...,3 (1.5*,1)--(p0); in 0,...,2 +1 (p)--(p); at (-1.5,-1.8) A; at (2.2,1.35) B; 44 Systolic Array 개념도
Systolic 구조의 장점은 외부 메모리에서 데이터를 반복해서 가져오는 대신 인접 PE 사이에서 데이터를 재사용할 수 있다는 것이다.
Dataflow 설계
NPU 성능은 연산기의 수보다 데이터 이동 방식에 크게 좌우될 수 있다.
Weight Stationary
가중치 W를 PE 내부에 유지하고 activation을 이동한다.
W:stationary, X:stream
CNN처럼 동일 weight를 반복 사용하는 경우 유리하다.
Output Stationary
부분합을 PE 내부에 유지한다.
psum_ij^(k+1) = psum_ij^(k) + A_ikB_kj
부분합을 SRAM/DRAM으로 반복 저장하는 비용을 줄일 수 있다.
Row Stationary
weight, activation, partial sum의 재사용을 동시에 고려하는 방식이다. 특정 convolution workload에서 높은 데이터 재사용을 얻을 수 있다.
메모리 계층 구조
NPU에서는 ``계산보다 데이터 이동이 비싸다''는 점이 매우 중요하다.
E_total = E_compute + E_memory + E_interconnect
일반적인 계층은
DRAM L2/SRAM Local\ Buffer Register MAC
이다.
[h] [ block/.style=draw,rounded corners,minimum height=9mm,align=center, arr/.style=-Latex,thick ] (dram) External DRAM\ / Slow / High Energy; (sram) On-chip SRAM; (rf) Register File; (mac) MAC; (dram)--(sram); (sram)--(rf); (rf)--(mac); NPU의 메모리 계층
Arithmetic Intensity를
AI= Operations Bytes transferred
로 정의하면, AI가 높을수록 동일한 메모리 대역폭에서 높은 연산 성능을 얻기 쉽다.
Roofline 모델
NPU의 실제 성능은 계산 성능과 메모리 대역폭 중 작은 쪽에 제한된다.
P_attainable = ( P_peak, BW AI )
여기서
P_peak: 최대 연산 성능 BW: 메모리 대역폭 AI: Arithmetic Intensity
이다.
따라서 MAC을 두 배로 증가시켜도 메모리 대역폭이 부족하면 실제 처리량은 거의 증가하지 않을 수 있다.
TOPS 계산
MAC 한 번을 multiplication과 addition의 두 operation으로 계산하면,
P_peak = N_MAC2 f
이다.
4096개의 MAC이 1GHz에서 동작하면
P &=4096210^9 &=8.19210^12\ OPS &=8.192\ TOPS
이다.
그러나 실제 성능은 utilization 를 고려하여
P_real P_peak
로 보는 것이 적절하다.
Quantization
FP32 모델을 INT8로 변환하면 메모리 사용량과 연산 복잡도를 크게 줄일 수 있다.
실수 x를 정수 q로 변환하는 기본식은
q= round ( xS )+Z
이다.
복원은
x S(q-Z)
이다.
S는 scale, Z는 zero point이다.
최근 AI 가속기에서는
FP16, BF16, FP8, INT8, INT4
등 다양한 precision을 지원하며, mixed-precision 설계가 중요하다.
CNN 가속
2차원 convolution은
Y[o,y,x] = _c _k_y _k_x W[o,c,k_y,k_x] X[c,y+k_y,x+k_x]
로 표현된다.
이를 GEMM으로 변환하여 Systolic Array에서 계산하거나, 직접 convolution dataflow를 설계할 수 있다.
CNN 가속기에서 중요한 요소는
feature-map reuse kernel reuse line buffer tiling channel parallelism
이다.
Transformer NPU
Transformer에서는 self-attention이 핵심이다.
입력 X에 대해
Q &= XW_Q K &= XW_K V &= XW_V
이고,
Attention(Q,K,V) = Softmax ( QK^Td_k )V
이다.
여기에는 두 종류의 연산 특성이 존재한다.
GEMM: XW_Q, XW_K, XW_V, QK^T, SV Vector/Special Function: Softmax, LayerNorm, RMSNorm, activation
따라서 Transformer용 NPU에서는 Tensor Engine만으로 충분하지 않고 Vector Engine을 함께 배치하는 것이 효과적이다.
Softmax
Softmax(x_i) = e^x_i _j e^x_j
수치 안정성을 위해
Softmax(x_i) = e^x_i-m _j e^x_j-m, m=_j x_j
를 사용한다.
Layer Normalization
= 1N_i=1^Nx_i
^2= 1N_i=1^N(x_i-)^2
y_i= x_i- ^2+ +
따라서 reduction, reciprocal square root와 vector multiply/add가 필요하다.
LLM 추론과 KV Cache
LLM 추론은 크게 prefill과 decode 단계로 나눌 수 있다.
Prefill에서는 많은 token을 한 번에 처리하므로 GEMM 비중이 높다. 반면 decode에서는 매 단계마다 새로운 token 하나를 생성하면서 기존 Key/Value를 읽어야 하므로 memory bandwidth가 매우 중요해진다.
KV cache의 개념적인 메모리 요구량은
M_KV L T H B
로 생각할 수 있다.
여기서 L은 layer 수, T는 sequence length, H는 hidden 관련 차원, B는 저장 정밀도에 따른 byte 수이다.
따라서 LLM용 NPU에서는 단순 TOPS뿐 아니라 DRAM/HBM bandwidth와 KV cache 관리가 중요한 설계 요소이다.
Sparsity 가속
weight 또는 activation에 0이 많다면 불필요한 MAC을 생략할 수 있다.
w=0 wx=0
Zero-skipping은 연산량과 전력을 줄일 수 있지만, 불규칙한 sparse pattern은 index와 scheduling overhead를 증가시킨다.
따라서 hardware-friendly structured sparsity를 사용하는 방법도 중요하다.
NoC와 데이터 이동
PE 수가 증가하면 단순 bus 구조만으로는 확장성이 떨어진다. 따라서 여러 compute cluster를 연결하기 위해 NoC(Network-on-Chip)를 사용할 수 있다.
대표 topology에는
Mesh, Ring, Tree, Crossbar
등이 있다.
NoC 설계에서는
bandwidth latency congestion multicast power
를 함께 고려해야 한다.
Weight나 activation을 여러 PE에 동시에 전달하는 AI workload에서는 multicast 효율이 특히 중요하다.
Tiling
큰 행렬은 온칩 SRAM에 한 번에 저장할 수 없으므로 tile로 나눈다.
C_M N = A_M K B_K N
를
M_t K_t, K_t N_t
크기의 block으로 분할한다.
좋은 tiling은
SRAM 용량 PE array 크기 DRAM burst bank conflict tensor shape
를 동시에 고려해야 한다.
Double Buffering
계산 중 다음 데이터를 미리 가져오면 memory latency를 숨길 수 있다.
Buffer A: Compute Buffer B: Load
다음 단계에서는 역할을 교환한다.
이론적으로 전체 시간은 단순 합
T_load+T_compute
보다
T_tile (T_load,T_compute)
에 가까워질 수 있다.
간단한 SystemVerilog MAC 예제
다음은 교육용 signed INT8 MAC의 간단한 예이다.
[language=Verilog,caption=INT8 MAC 예제] module mac_int8 ( input logic clk, input logic rst_n, input logic en, input logic signed [7:0] a, input logic signed [7:0] b, output logic signed [31:0] acc );
logic signed [15:0] product;
always_comb begin product = a * b; end
always_ff @(posedge clk or negedge rst_n) begin if (!rst_n) acc <= '0; else if (en) acc <= acc + product; end
endmodule
실제 ASIC/FPGA에서는 pipeline stage, saturation, clock gating, DSP block inference 등을 고려해야 한다.
간단한 PE 예제
[language=Verilog,caption=Systolic PE 개념 예제] module systolic_pe ( input logic clk, input logic rst_n, input logic signed [7:0] a_in, input logic signed [7:0] b_in, output logic signed [7:0] a_out, output logic signed [7:0] b_out, output logic signed [31:0] psum );
always_ff @(posedge clk or negedge rst_n) begin if (!rst_n) begin a_out <= '0; b_out <= '0; psum <= '0; end else begin a_out <= a_in; b_out <= b_in; psum <= psum + a_in * b_in; end end
endmodule
이 PE를 2차원으로 연결하면 작은 Systolic Array를 구성할 수 있다.
FPGA 기반 NPU 개발 절차
교육 및 연구 목적에서는 다음 순서가 실용적이다.
Python/NumPy로 golden model 작성 INT8 quantization 적용 MAC RTL 작성 PE 작성 44 또는 88 Systolic Array 작성 Testbench 작성 Python 결과와 RTL 결과 비교 SRAM/BRAM interface 추가 AXI4/AXI4-Lite interface 추가 DMA 연결 FPGA synthesis Timing closure 실제 neural-network layer 실행
초기에는 큰 NPU를 만들기보다 작은 array를 정확하게 검증한 뒤 확장하는 것이 좋다.
ASIC 설계 흐름
NPU ASIC의 일반적인 흐름은 다음과 같다.
Architecture RTL Verification Synthesis STA P\&R Signoff Tapeout
세부적으로는
workload 분석 architecture exploration RTL coding functional verification logic synthesis static timing analysis floorplanning placement clock tree synthesis routing power integrity 분석 DRC/LVS signoff
과정이 필요하다.
성능과 전력 지표
단순 TOPS만으로 NPU를 평가하는 것은 부족하다.
대표 지표는
TOPS/W = TOPS Power(W)
이다.
또한
Utilization = Active\ MAC\ cycles Total\ available\ MAC\ cycles
도 중요하다.
실제 제품에서는 다음을 함께 보아야 한다.
latency throughput TOPS TOPS/W DRAM bandwidth SRAM capacity chip area model accuracy supported operators compiler efficiency
전력 최적화 기술
동적 전력은 개념적으로
P_dynamic = C V^2 f
로 표현된다.
따라서 전력 감소 방법은
clock gating power gating voltage scaling frequency scaling low precision operand isolation zero-skipping SRAM access 감소
등이다.
특히 V^2 항 때문에 공급전압 감소는 매우 강력하지만 timing margin과 안정성 문제가 함께 발생한다.
Compiler와 NPU
좋은 하드웨어만으로 높은 성능을 얻을 수 없다. AI graph를 NPU 명령으로 변환하는 compiler stack이 필요하다.
PyTorch/ONNX Graph\ Optimization Operator\ Fusion Quantization Tiling Scheduling NPU\ Instructions
대표적인 compiler 최적화 문제에는 operator fusion, memory planning, layout transformation, tensor tiling, instruction scheduling 등이 있다.
예를 들어
MatMul Bias GELU
를 각각 메모리에 저장하지 않고 하나의 fused operation으로 실행하면 중간 tensor의 DRAM 접근을 감소시킬 수 있다.
NPU ISA 개념
NPU는 CPU와 유사한 범용 ISA 대신 tensor 중심 명령을 사용할 수 있다.
개념적인 명령은 다음과 같다.
LOAD_W WBUF, DRAM_ADDR LOAD_X XBUF, DRAM_ADDR MATMUL OBUF, XBUF, WBUF VEC_GELU OBUF STORE DRAM_ADDR, OBUF
명령의 granularity를 너무 작게 만들면 control overhead가 증가하고, 너무 크게 만들면 flexibility가 감소한다.
NPU 설계의 핵심 Trade-off
NPU 설계는 다음 최적화 문제로 생각할 수 있다.
( Performance, Energy\ Efficiency )
subject to
Area & A_ Power & P_ Bandwidth & BW_ Latency & L_
즉 MAC 수만 최대화하는 문제가 아니다.
MAC을 증가시키면
Compute
하지만 동시에
Area, Power, Memory\ Demand, NoC\ Traffic
가 발생한다.
추천 연구 프로젝트: 88 INT8 NPU
대학원 수준의 첫 NPU 프로젝트로 다음 구성을 추천한다.
0.82 88 INT8 Systolic NPU
64개의 INT8 MAC INT32 accumulator Weight/Activation BRAM Output stationary 또는 weight stationary AXI4-Lite control AXI DMA data transfer Python golden model SystemVerilog RTL FPGA synthesis latency/TOPS/power 분석
64개의 MAC을 f Hz로 구동하면 이론 연산량은
P_peak=642 f
이다.
예를 들어 200MHz이면
P_peak &=64220010^6 &=25.610^9 &=25.6\ GOPS
이다.
이 프로젝트를 확장하여 1616, 3232 array로 발전시키고 CNN과 Transformer GEMM을 실행하면 실제 NPU 연구 플랫폼으로 사용할 수 있다.
향후 고급 연구 주제
NPU 설계 이후에는 다음 주제로 확장할 수 있다.
FP8/INT4 mixed-precision Tensor Core Structured Sparsity Accelerator Transformer Attention Accelerator Flash-Attention 계열 memory-aware architecture LLM KV-cache accelerator Chiplet 기반 AI accelerator 2.5D/3D memory integration Near-Memory Computing Processing-In-Memory RISC-V + NPU SoC Dynamic voltage/frequency scaling AI compiler와 hardware co-design
NPU 시각 자료와 하드웨어 사진
NPU 데이터 처리의 전체 흐름
[H] [ node distance=7mm and 8mm, b/.style=draw,rounded corners,minimum width=27mm,minimum height=11mm,align=center, a/.style=-Latex[length=2mm],thick ] (dram) DDR/HBM\ Data; (dma) DMA\; (sram) On-chip SRAM\ Buffer; (array) PE Array\ Matrix; (vec) Vector Unit\/Softmax; (out) Output Buffer; (ctrl) Scheduler / ISA; (host) CPU / RISC-V Host;
(dram)--(dma); (dma)--(sram); (sram)--(array); (array)--(vec); (vec)--(out); (host)--(ctrl); (ctrl)--(array); (out.west)-| (dma.south); NPU에서 외부 메모리부터 Tensor/Vector Engine까지의 데이터 흐름
PE 내부의 파이프라인 구조
[H] [ s/.style=draw,minimum width=22mm,minimum height=12mm,align=center, a/.style=-Latex[length=2mm],thick ] (ra) A Register; (rb) B Register; (mul) Signed\; (add) Adder; (acc) 32-bit\; (sat) Round /\;
(ra.east)--(mul.west); (rb.east)--(mul.west); (mul)--node[above]Product(add); (add)--(acc); (acc)--(sat); (acc.south) -- ++(0,-9mm) -| (add.south); INT8 입력과 INT32 누산기를 가정한 PE의 개념적 datapath
Systolic Array의 시간에 따른 데이터 이동
[H] [ pe/.style=draw,minimum width=13mm,minimum height=10mm,fill=gray!8, ar/.style=-Latex[length=1.5mm],thick ] in 0,...,3 in 0,...,3 (p) at (1.8*,-1.45*) P_; in 0,...,3 (-1.4,-1.45*)--node[above,sloped]A(p0); in 0,...,2 +1 (p)--(p); in 0,...,3 (1.8*,1.1)--node[right]B(p0); in 0,...,2 +1 (p)--(p); 행렬 A는 수평, B는 수직 방향으로 전달되며 각 PE가 부분합을 계산한다.
Transformer를 위한 NPU datapath
[H] [ b/.style=draw,rounded corners,minimum width=24mm,minimum height=10mm,align=center, a/.style=-Latex[length=2mm],thick ] (x) X; (qkv) Q,K,V\; (qk) QK^T\ Engine; (soft) Scale\; (sv) S V\ Engine; (proj) Output\; (norm) LayerNorm /\; (ffn) FFN\--GELU--GEMM;
(x)--(qkv); (qkv)--(qk); (qk)--(soft); (soft)--(sv); (sv)--(proj); (proj)--(norm); (norm)--(ffn); Transformer/LLM용 NPU에서 Matrix Engine과 Vector Engine의 역할
FPGA에서 NPU를 구현하는 실험 구조
[H] [ b/.style=draw,rounded corners,minimum width=31mm,minimum height=11mm,align=center, a/.style=-Latex[length=2mm],thick ] (pc) PC\/NumPy; (axi) PCIe / Ethernet\ AXI DMA; (bram) FPGA BRAM\ Buffer; (npu) 88 NPU 64 INT8 MACs; (result) Result / Counter\ Measurement; (pc)--(axi); (axi)--(bram); (bram)--(npu); (npu)--(result); (result.west)-| (axi.south); 교육용 FPGA NPU 검증 시스템의 구성 예
실제 AI 가속기 사진: TPU 3.0
실제 AI 가속기는 연산 ASIC만 존재하는 것이 아니라 전원회로, 고속 인터페이스, 메모리, 냉각 구조가 하나의 시스템으로 구성된다. 아래 사진 자료는 Wikimedia Commons의 TPU 3.0 장치 사진이다. 원본은 2019년 Zinskauf가 촬영한 사진으로 CC BY-SA 4.0 조건으로 공개되어 있다.
[H] 0.82 3mm Google TPU 3.0 실제 장치 사진 [3mm] https://commons.wikimedia.org/wiki/File:Tensor_Processing_Unit_3.0.jpg [3mm] QR 코드를 스캔하면 고해상도 원본 사진과 라이선스 정보를 확인할 수 있다. Photo: Zinskauf, Wikimedia Commons, CC BY-SA 4.0 3mm TPU 3.0 실물 사진 원본 연결. 배포용 LaTeX에서 저작권과 출처가 분리되지 않도록 QR과 출처를 함께 표시하였다.
실제 TPU v4 패키지와 보드 사진
TPU v4 자료에서는 ASIC 패키지와 HBM, 그리고 여러 가속기가 탑재된 시스템 보드의 물리적 구성을 확인할 수 있다.
[H] 0.82 3mm TPU v4 Package / Board Photograph [3mm] https://commons.wikimedia.org/wiki/File:TPU_v4.png [3mm] Wikimedia Commons 원본 사진으로 연결 Jouppi et al., CC BY 4.0 3mm TPU v4 실제 패키지 및 시스템 보드 사진 자료 연결
사진을 로컬 파일로 문서에 직접 삽입하려면 해당 Commons 원본을 tpu3.jpg, tpu\_v4.png로 저장한 뒤 다음과 같이 사용할 수 있다.
[language=TeX] [H] tpu3.jpg TPU 3.0. Photo: Zinskauf, CC BY-SA 4.0.
결론
NPU 설계의 본질은 단순히 많은 MAC을 배치하는 것이 아니다.
NPU = Compute + Memory + Dataflow + Interconnect + Compiler
높은 성능의 NPU를 만들기 위해서는 MAC/PE의 효율, Systolic Array의 utilization, SRAM 재사용, DRAM bandwidth, NoC, quantization, compiler scheduling을 하나의 시스템으로 동시에 설계해야 한다.
특히 Transformer와 LLM 시대에는 TOPS만이 아니라 memory bandwidth와 데이터 이동 비용이 성능을 결정하는 중요한 요소가 된다.
따라서 현대 NPU 연구는 ``연산기를 얼마나 많이 넣는가''에서 ``데이터를 얼마나 적게 이동하면서 연산기를 계속 바쁘게 유지하는가''로 중심이 이동하고 있다.