Chapter 10

NPU와 AI 가속

사진을 찍으면 휴대폰은 셔터를 누른 순간 이미 하늘과 사람을 구분하고, 여러 장을 합쳐 노이즈를 지우고 있다. 통화 소리에서 잡음을 지우고, 말을 받아 적고, 이제는 휴대폰 안에서 대화형 AI가 문장을 지어낸다. 이 모든 신경망의 계산은 놀랍도록 단순하다. 곱하고, 더하고, 또 곱하고, 더한다. 사진 한 장을 분석하는 데 이 곱셈-누산이 수십억 번 들어간다. CPU로 하면 배터리가 녹고, GPU로 해도 아깝다. 그래서 SoC에는 곱셈-누산기 수천 개를 바둑판처럼 엮은 전용 블록, NPU(Neural Processing Unit)가 있다. 그런데 NPU를 만들어 보면 곧 깨닫게 된다. 진짜 적은 곱셈이 아니라 데이터를 가져오는 일이라는 것을.

신경망은 곱셈-누산의 산

인공 신경망의 기본 단위인 뉴런(Neuron)은 입력 \(x_i\)에 가중치 \(w_i\)를 곱해 모두 더하고, 편향 \(b\)를 더한 뒤, 비선형 함수(대개 ReLU, 음수를 0으로)에 통과시킨다.

$$y = \mathrm{ReLU}\Big(b + \sum_{i} w_i\,x_i\Big)$$

곱하고 누적기에 더하는 이 한 걸음을 곱셈-누산(MAC, Multiply-Accumulate)이라 한다. 하드웨어로는 곱셈기 하나, 덧셈기 하나, 누적 레지스터 하나다. 아래에서 막대를 위아래로 끌어 입력과 가중치를 바꾸고, MAC을 한 번씩 진행해 보자.

누적기—
출력 y (ReLU 후)—
MAC 횟수—
그림 10-1. 만져 보기위쪽 막대가 입력 \(x_i\), 아래쪽 막대가 가중치 \(w_i\)다. 막대를 끌어 값을 바꾸면 결과가 다시 계산된다. 누적기가 음수로 끝나면 ReLU가 0으로 잘라 이 뉴런은 "꺼진다". 활성값에 0이 많다는 사실은 뒤의 희소성 절에서 다시 쓰인다.

실제 신경망은 이런 뉴런 수백만 개를 층으로 쌓는다. 이미지에 쓰는 합성곱(Convolution) 층은 \(K\times K\) 크기의 필터를 이미지 전체에 미끄러뜨리며 같은 가중치를 반복해서 쓴다. 출력 크기가 \(H_o\times W_o\times C_{out}\)이면 MAC 수는

$$\text{MAC} = H_o \, W_o \, C_{out} \times K^2 \, C_{in}$$

이다. 층의 종류와 크기를 바꿔 보며 MAC, 매개변수, 데이터 크기가 어떻게 변하는지 보자. 마지막 숫자 산술 집약도(Arithmetic intensity)는 메모리에서 1바이트를 옮길 때마다 하는 연산 수다. 이 장 전체를 꿰뚫는 숫자다.

MAC—
가중치 (INT8)—
입력+출력 활성값—
산술 집약도—
그림 10-2. 만져 보기입력 텐서(왼쪽), 필터 묶음(가운데), 출력 텐서(오른쪽)의 크기를 로그 비율로 그렸다. 일반 합성곱은 가중치 하나를 화소 수만큼 재사용해 집약도가 수백에 이른다. 깊이별 합성곱(MobileNet류)은 MAC이 수십 배 적지만 집약도도 낮다. 완전 연결 층은 가중치 하나를 딱 한 번만 쓴다(배치 1). 산술 집약도는 연산 수(MAC × 2)를 가중치·입력·출력을 한 번씩 옮기는 바이트로 나눈 값이다.

대표적인 이미지 분류망 ResNet-50은 사진 한 장(224×224)에 약 40억 MAC, 매개변수 약 2,500만 개다. 초당 30장을 처리하려면 초당 1,200억 MAC, 즉 0.24 TOPS(Tera Operations Per Second, MAC 하나 = 연산 2개)가 필요하다. 사진 보정, 실시간 번역, 생성형 AI까지 동시에 돌리면 수십 TOPS가 금세 찬다.

왜 CPU·GPU가 아니라 NPU인가

1장에서 본 에너지 표를 다시 꺼내 보자. 8비트 정수 곱셈은 약 0.2 pJ, 덧셈은 0.03 pJ이다. 그런데 작은 SRAM에서 그 피연산자를 읽는 데 5 pJ, DRAM에서 읽으면 수백 pJ이 든다. CPU는 여기에 명령어 인출·해독·레지스터 파일 접근이 MAC마다 붙는다. 결국 MAC 자체에 쓰는 에너지는 전체의 몇 %에 불과하다.

NPU 설계의 핵심은 단 하나다. 한 번 가져온 데이터를 최대한 많이 재사용한다. 신경망에는 재사용 기회가 넘친다. 합성곱의 가중치는 화소마다 다시 쓰이고, 입력 화소는 필터마다 다시 쓰이고, 부분합은 채널마다 누적된다. 이 재사용을 데이터가 레지스터와 이웃 PE 사이에서만 오가도록 짜 맞춘 구조가 다음 절의 시스톨릭 배열이다.

MAC 하나의 비용 (45 nm, 대략)곱셈 + 덧셈 에너지면적 (INT8 = 1)
FP32 곱셈 + FP32 덧셈약 4.6 pJ약 37
FP16 곱셈 + FP16 덧셈약 1.5 pJ약 9
INT8 곱셈 + 32비트 누적약 0.3 pJ1
INT4 곱셈 + 누적 (추정)약 0.1 pJ약 0.3
참고: 8 KB SRAM에서 32비트 읽기약 5 pJ—
참고: DRAM에서 32비트 읽기약 640 pJ—

표는 Horowitz(ISSCC 2014)의 45 nm 자료와 그로부터 어림한 값이다. 정수 MAC이 부동소수점보다 열 배 이상 싸고 작다는 것, 그리고 DRAM 접근 한 번이 MAC 수천 번이라는 것, 두 가지가 NPU의 모양을 결정한다. NPU가 정수 연산과 거대한 온칩 SRAM으로 이루어진 이유다.

시스톨릭 배열: 심장이 뛰듯 데이터를 흘린다

1978년 H. T. Kung과 Charles Leiserson이 제안한 시스톨릭 배열(Systolic array)은 심장 박동(systole)처럼 데이터가 일정한 박자로 이웃 처리 소자(PE, Processing Element)로 넘어가는 구조다. PE 하나는 MAC 하나와 레지스터 몇 개뿐이다. 각 PE는 왼쪽에서 받은 값을 오른쪽으로, 위에서 받은 값을 아래로 넘기며 그 사이에 곱셈-누산을 한 번 한다. 긴 배선도, 공유 버스도, 메모리 접근도 없다. 데이터 하나가 배열을 가로지르는 동안 PE 수만큼 재사용된다. 구글 TPU(2016)가 256×256 시스톨릭 배열로 이 구조를 부활시켰고, 지금의 NPU 대부분이 이 생각을 바탕으로 한다.

핵심 묘기는 엇갈림(Skew)이다. 행렬 곱 \(C = A\,W\)에서 \(A\)의 각 열을 한 사이클씩 늦게 들여보내야, 맞는 짝이 맞는 PE에서 정확히 같은 사이클에 만난다. 아래 시뮬레이터에서 한 사이클씩 진행하며 계단 모양으로 들어가는 데이터를 따라가 보자.

SIMULATOR

시스톨릭 배열 행렬 곱

사이클—
지금까지 MAC—
PE 사용률 (누적)—
결과 검증—
WS: PE(k, n)에 가중치 \(W_{kn}\)이 미리 실려 있다. \(A\)의 행 \(m\)의 원소 \(A_{mk}\)는 왼쪽에서 \(k\) 사이클 늦게 들어와 오른쪽으로 흐르고, 부분합은 위에서 아래로 흘러 맨 아래에서 \(C_{mn}\)이 나온다(오른쪽 결과판). OS: PE(i, j)가 \(C_{ij}\)를 붙잡고 누적한다. \(A\)는 왼쪽에서, \(B\)는 위에서 엇갈려 들어온다. 초록 테두리 = 이번 사이클에 MAC을 한 PE. 결과는 실제로 계산해 정답과 비교한다.

배열이 다 차고 다 비는 데 걸리는 시간이 보이는가? 첫 결과가 나오기까지 \(2S-1\) 사이클 남짓이 걸리고, 마지막 데이터가 빠져나가는 데도 그만큼 걸린다. 전체 사이클은 약 \(L + 2S - 1\)이므로

$$\text{사용률} \approx \frac{L}{L + 2S - 1}$$

이다. 흘려 보낼 길이 \(L\)(WS에서는 배치나 화소 수)이 배열 크기보다 훨씬 길어야 효율이 난다. 256×256 배열에 배치 1짜리 작은 행렬을 넣으면 PE 대부분이 논다.

S = 8 배열에 L = 4짜리 일을 넣으면 사용률은?

식으로 계산하고, 시뮬레이터에서 끝까지 돌려 확인해 보자.

답 보기

\(4 / (4 + 15) \approx 21\%\)다. 배열의 79%가 채우고 비우는 데 낭비된다. 그래서 NPU 컴파일러는 작은 행렬 여러 개를 묶어 한꺼번에 흘리거나, 배열을 작은 조각으로 나눠 따로 쓰게 한다. 큰 배열이 늘 좋은 것은 아니다. 휴대폰 NPU가 거대한 배열 하나 대신 중간 크기 엔진 여러 개를 두는 이유다.

두 데이터 흐름의 차이는 무엇을 붙잡아 두느냐다. 가중치 고정(Weight-stationary)은 가중치를 PE에 한 번 싣고 수많은 입력에 재사용한다. 합성곱처럼 가중치가 여러 화소에 쓰일 때 좋다. 출력 고정(Output-stationary)은 부분합을 PE 안에 붙잡아 누적하므로 넓은(32비트) 부분합이 움직이지 않는다. 그 밖에 입력 고정, 행 고정(MIT Eyeriss) 같은 흐름도 있다. 어느 쪽이 나은지는 층의 모양에 따라 달라서, 요즘 NPU는 층마다 흐름을 바꿀 수 있게 만든다.

루프라인: 연산의 지붕과 메모리의 경사

NPU가 40 TOPS라고 해서 어떤 신경망이든 40 TOPS로 도는 것은 아니다. 계산할 데이터가 제때 도착하지 않으면 MAC은 논다. 커널이 낼 수 있는 성능의 상한을 한 장의 그림으로 보여 주는 것이 루프라인 모델(Roofline model)(Williams, Waterman, Patterson 2009)이다.

$$\text{성능} = \min\big(\text{최대 연산 성능},\;\; \text{메모리 대역폭} \times \text{산술 집약도}\big)$$

가로축이 산술 집약도(연산/바이트), 세로축이 성능이다. 왼쪽은 대역폭이 정하는 경사, 오른쪽은 연산기가 정하는 평평한 지붕이다. 두 선이 만나는 능선점(Ridge point)보다 왼쪽에 있는 커널은 메모리 한계, 오른쪽은 연산 한계다. 커널을 눌러 보고, 대역폭과 연산 성능을 바꿔 보고, "내 커널" 점을 좌우로 끌어 보자.

SIMULATOR

NPU 루프라인

가중치 정밀도
능선점—
선택한 커널 성능—
최대 대비—
한계—
산술 집약도는 대략값이다. 원소별 연산(INT8 덧셈·ReLU): 1연산/3바이트. 깊이별 3×3: 출력 하나에 MAC 9개, 입출력 약 2바이트. 3×3 합성곱(64→64 채널): 출력 하나에 MAC 576개. 큰 행렬 곱 1024³: \(2N^3/3N^2\). LLM 디코드: 토큰 하나에 가중치 1바이트(INT8)당 2연산 × 배치. 프리필: 프롬프트 토큰 512개가 같은 가중치를 공유. 온칩 SRAM에 다 들어가는 작은 모델은 DRAM 루프라인보다 위로 갈 수 있다.

가장 중요한 관찰은 LLM 디코드다. 대화형 AI가 단어를 하나씩 만들 때(배치 1), 매 토큰마다 모델의 모든 가중치를 DRAM에서 한 번씩 읽어야 하고, 가중치 1바이트당 연산은 2번뿐이다. 산술 집약도 2는 능선점(40 TOPS ÷ 68 GB/s ≈ 590)보다 수백 배 왼쪽이다. NPU가 아무리 커도 0.5% 남짓밖에 쓰지 못한다. 배치를 키우면(여러 사용자의 요청을 묶으면) 점이 오른쪽으로 움직이지만, 휴대폰의 사용자는 한 명뿐이다.

LLM 디코드를 빠르게 하려면 NPU의 TOPS를 두 배로 늘려야 할까, 대역폭을 두 배로 늘려야 할까?

시뮬레이터에서 두 슬라이더를 각각 움직여 보자.

답 보기

대역폭이다. 메모리 한계 영역에서는 성능이 \(\text{대역폭} \times \text{집약도}\)로 정해지므로 TOPS를 열 배 올려도 아무것도 바뀌지 않는다. 반대로 INT4로 가중치를 줄이면 같은 대역폭으로 두 배의 가중치를 읽으므로 집약도가 두 배가 되어 토큰 속도도 두 배가 된다. 휴대폰 LLM에서 양자화가 필수인 이유다.

온칩 SRAM과 타일링: 재사용을 짜 맞추기

루프라인에서 오른쪽으로 가려면 산술 집약도를 높여야 한다. 같은 계산을 하면서 DRAM 트래픽을 줄이는 방법은 데이터를 조각(Tile)으로 나눠 칩 안 SRAM에 올리고, 내려보내기 전에 최대한 많이 쓰는 것이다. \(n\times n\) 행렬 곱을 \(T\times T\) 타일로 하면, \(A\)와 \(B\)의 각 원소는 DRAM에서 \(n/T\)번만 읽힌다.

$$\text{DRAM 트래픽} \approx \underbrace{2\,\frac{n^3}{T}}_{A,\;B\ \text{읽기}} + \underbrace{n^2}_{C\ \text{쓰기}} \quad(\text{바이트, INT8}),\qquad \text{SRAM} \gtrsim 2T^2 + 4T^2$$

타일이 클수록 트래픽이 줄지만, 타일은 SRAM에 들어가야 한다(\(A\)·\(B\) 타일 각 \(T^2\) 바이트, 32비트 누적기 \(C\) 타일 \(4T^2\) 바이트). SRAM 크기와 타일 크기를 바꾸며 이 맞바꿈을 보자.

SIMULATOR

행렬 곱 타일링과 DRAM 트래픽

DRAM 트래픽—
산술 집약도—
걸리는 시간 (40 TOPS, 68 GB/s)—
필요 SRAM—
왼쪽은 \(C = A\,B\)의 타일 순회(바깥 i, j, 안쪽 k)를 애니메이션으로 보여 준다. 칸의 진하기는 그 타일이 지금까지 DRAM에서 몇 번 읽혔는지다. 행렬이 크면 8×8 타일로 줄여 그렸다. 시간은 연산 시간과 메모리 시간 중 긴 쪽(겹쳐 실행 가정)이다. 실제 NPU는 이중 버퍼링으로 다음 타일을 미리 읽으므로 SRAM이 두 배쯤 더 필요하다.

SRAM이 작으면 타일을 키울 수 없고, 트래픽이 수십 배로 불어난다. 그래서 휴대폰 NPU는 수 MB, 데이터센터 가속기는 수십~수백 MB의 SRAM을 품는다. SRAM은 다이에서 비싼 면적이지만, 그 면적이 DRAM 트래픽을 줄여 아끼는 에너지가 더 크다. 시스템 캐시(SLC, 5장)도 NPU에게는 두 번째 타일 저장소 역할을 한다. 층과 층 사이의 중간 결과(활성값)를 DRAM에 내려보내지 않고 SRAM에서 다음 층으로 바로 넘기는 층 융합(Layer fusion)도 같은 생각이다.

양자화: 32비트는 너무 많다

신경망은 학습할 때 32비트나 16비트 부동소수점을 쓰지만, 추론할 때는 그렇게 정밀할 필요가 없다. 가중치를 8비트나 4비트 정수로 바꾸는 것을 양자화(Quantization)라 한다. 가장 단순한 대칭 양자화는 값의 범위를 정하고(클리핑 값 \(\alpha\)), 그 범위를 \(2^{b-1}-1\)개의 등간격 칸으로 나눈다.

$$q = \mathrm{round}\!\left(\frac{x}{s}\right),\quad s = \frac{\alpha}{2^{b-1}-1},\qquad \hat x = s\,q$$

비트 수가 하나 줄 때마다 칸 수가 절반이 되고 오차가 두 배가 된다. 신호 대 양자화 잡음비(SQNR)로는 비트당 약 6 dB이다. 그런데 가중치 분포에는 드물게 아주 큰 값(이상치)이 있다. 범위를 이상치에 맞추면 대부분의 작은 값이 칸 몇 개에 몰리고, 범위를 좁혀 이상치를 잘라 내면 작은 값은 정밀해지지만 이상치가 망가진다. 클리핑 값을 움직여 이 줄다리기를 직접 해 보자.

SQNR—
30억 매개변수 모델 크기—
MAC 에너지 (대략)—
MAC 면적 (INT8=1)—
그림 10-3. 만져 보기위: 값 4,000개의 분포(막대)와 양자화 단계(세로선), 잘려 나가는 영역(빨강). 아래: 값 40개의 원래 값(테두리)과 양자화된 값(채움). INT4에서 클리핑을 최댓값의 30~50%로 줄이면 SQNR이 오히려 좋아지는 지점이 있다. 활성값은 ReLU 뒤라 음수가 없으므로 비대칭(0~α) 양자화로 칸을 두 배 쓴다. FP16은 사람 눈에 차이가 없을 만큼 정밀하다.

실전 양자화는 이보다 영리하다. 채널마다 따로 범위를 정하고(채널별 스케일), 작은 묶음(32~128개)마다 스케일을 두고(그룹 양자화), 이상치만 따로 높은 정밀도로 남기기도 한다. 그 덕에 이미지 신경망은 INT8에서 정확도 손실이 1% 안팎이고, LLM은 INT4 가중치(활성값은 8~16비트)로 쓸 만한 품질을 낸다. 하드웨어 이득은 앞의 표대로다. 비트 수를 절반으로 줄이면 MAC 면적은 대략 1/3~1/4, 메모리와 대역폭은 정확히 절반이 된다.

TOPS 숫자를 읽는 법

NPU 광고의 "45 TOPS"는 대개 INT8 기준이고, 어떤 회사는 INT4나 희소성을 가정한 값을 쓴다. INT4 TOPS는 같은 칩의 INT8 TOPS의 두 배로 표시되는 경우가 많다. 비교할 때는 정밀도와 희소성 가정을 꼭 확인하자.

희소성: 0은 곱하지 않는다

ReLU 뒤의 활성값은 절반 넘게 0이고, 학습이 끝난 가중치 중에도 아주 작은 값이 많다. 0을 곱하는 MAC은 결과에 아무 영향이 없으니 건너뛰면 된다. 이를 희소성(Sparsity) 활용이라 한다. 문제는 0이 어디에 있느냐다. 0이 무작위로 흩어져 있으면 시스톨릭 배열처럼 규칙적으로 데이터를 흘리는 하드웨어는 건너뛸 방법이 없다. 0의 위치를 적어 둔 색인을 따라가며 데이터를 모아야 하는데, 그 비용이 아낀 MAC보다 크기 쉽다.

그래서 나온 타협이 2:4 구조적 희소성(2:4 structured sparsity)이다(NVIDIA Ampere, 2020). 가중치 4개마다 정확히 2개만 남기도록 가지치기한다. 하드웨어는 남은 2개와 2비트 위치 색인만 보고 곱셈기 절반으로 같은 일을 한다. 0의 비율은 50%로 정해져 있지만 그 50%를 확실히 속도로 바꿀 수 있다.

0인 가중치—
남은 가중치 크기 (에너지)—
조밀 배열에서 속도—
희소 지원 하드웨어에서—
그림 10-4. 만져 보기8×32 가중치 행렬. 칸의 색은 값의 부호와 크기, 빈칸은 가지치기된 0이다. 2:4 모드에서는 가로로 4개씩 묶은 칸(가는 세로선) 안에서 큰 값 2개만 남는다. "남은 가중치 크기"는 원래 가중치 제곱합 중 남은 비율로, 정확도 손실의 거친 대리 지표다. 비구조적 희소성은 같은 비율이면 덜 손해 보지만, 전용 색인 하드웨어 없이는 빠르지 않다.

활성값의 0은 실행 중에야 알 수 있으므로 다르게 다룬다. 많은 NPU는 0인 활성값이 들어오면 그 PE의 곱셈기 클럭을 멈춰(클럭 게이팅, 12장) 에너지만 아끼고, 일부는 0을 압축해 SRAM·DRAM 트래픽을 줄인다. 속도보다 에너지와 대역폭을 얻는 쪽이다.

휴대폰에서 LLM 돌리기: 토큰 속도의 산수

루프라인 절에서 본 대로 LLM 디코드는 철저히 메모리 한계다. 그렇다면 토큰 하나를 만드는 시간은 계산이 아니라 모든 가중치를 DRAM에서 한 번 읽는 시간이다. 여기에 지금까지 만든 토큰들의 키·값 기록(KV 캐시(KV cache))도 매번 읽어야 한다.

$$\text{토큰/초} \;\approx\; \frac{\text{대역폭} \times \eta}{\text{매개변수 수} \times \text{매개변수당 바이트} + \text{KV 캐시}}$$

\(\eta\)는 실제로 얻는 대역폭 비율(대개 60~80%, 7장)이다. 모델 크기, 정밀도, 대역폭을 바꿔 휴대폰이 말을 얼마나 빨리 하는지 보자. 화면에 글자가 실제 계산된 속도로 찍힌다.

가중치 크기—
토큰당 읽는 데이터—
생성 속도—
40 TOPS NPU 사용률—
그림 10-5. 만져 보기대역폭 효율 \(\eta = 0.7\). KV 캐시는 80억 매개변수급(32층, KV 차원 1,024, FP16) 모델의 토큰당 약 128 KB를 모델 크기에 비례해 어림했다. 막대는 휴대폰 RAM 12 GB 중 모델과 KV 캐시가 차지하는 양이다. 30억 매개변수 INT4(약 1.5 GB)를 60 GB/s로 돌리면 초당 약 25토큰, 사람이 읽는 속도(초당 5~10토큰)보다 빠르다. 70억 FP16은 메모리에 들어가기도 버겁다.

여기서 휴대폰 AI의 설계 방향이 모두 나온다. 대역폭을 늘리고(LPDDR5X → LPDDR6, 더 넓은 버스), 가중치를 줄이고(INT4, 작은 모델, 지식 증류), 한 번 읽은 가중치로 토큰을 여러 개 만든다(추측 디코딩, Speculative decoding: 작은 모델이 몇 토큰을 미리 짐작하면 큰 모델이 한 번에 검증해 배치 효과를 얻는다). 처음 프롬프트를 읽는 프리필 단계는 토큰 수백 개가 같은 가중치를 공유하므로 연산 한계에 가깝고, 여기서 NPU의 TOPS가 빛난다.

NPU (연도)공개 성능비고
Google TPU v1 (2016, 데이터센터)92 TOPS (INT8)256×256 시스톨릭 배열, 온칩 28 MB, 약 40 W
Apple A17 Pro Neural Engine (2023)약 35 TOPS16코어, 스마트폰
Apple M4 Neural Engine (2024)약 38 TOPS태블릿·노트북
Qualcomm Snapdragon X Elite Hexagon (2024)약 45 TOPS (INT8)노트북용, 스마트폰 Hexagon도 비슷한 세대
Intel Core Ultra 200V NPU (2024)약 48 TOPS노트북용
AMD Ryzen AI 300 XDNA 2 (2024)약 50 TOPS노트북용, 공간형 데이터 흐름 배열

2024년에 PC 업계가 "AI PC" 기준으로 NPU 40 TOPS 이상을 내걸면서, 휴대폰과 노트북 NPU는 모두 수십 TOPS대에 모였다. 그런데 앞에서 계산했듯 LLM 디코드에서 이 TOPS의 1%도 쓰기 어렵다. 다음 세대 NPU 경쟁이 TOPS보다 대역폭, SRAM, 저정밀도 지원으로 옮겨 가는 이유다. NPU 옆에서 사진을 처리하는 ISP와 영상 코덱 같은 고정 기능 블록은 11장에서 다룬다.

핵심 정리

  1. 신경망 계산의 대부분은 곱셈-누산(MAC)이다. 합성곱 층의 MAC = 출력 크기 × K² × Cin.
  2. MAC 자체보다 데이터 이동이 훨씬 비싸다. NPU는 정수 MAC 배열과 큰 SRAM으로 재사용을 극대화한다.
  3. 시스톨릭 배열은 데이터를 엇갈려 흘려 이웃 PE끼리만 주고받는다. 사용률 ≈ L/(L+2S−1)이라 흘릴 데이터가 충분히 길어야 한다.
  4. 루프라인: 성능 = min(최대 연산, 대역폭 × 산술 집약도). LLM 디코드(배치 1)는 극단적인 메모리 한계다.
  5. 타일링은 트래픽을 1/T로, 양자화는 바이트를 절반씩, 2:4 희소성은 MAC을 절반으로 줄인다. 휴대폰 LLM 속도 ≈ 대역폭 ÷ 모델 바이트.

확인 퀴즈

Q1. 출력 28×28×128, 입력 채널 128, 3×3 합성곱 층의 MAC 수에 가장 가까운 것은?

28 × 28 × 128 = 100,352개 출력 각각에 3 × 3 × 128 = 1,152번의 MAC. 곱하면 115,605,504 ≈ 1억 1,600만이다. 가중치는 3×3×128×128 ≈ 14.7만 개뿐이니 가중치 하나가 약 784번 재사용된다.

Q2. 시스톨릭 배열에서 입력 데이터를 행마다 한 사이클씩 늦게(엇갈려) 넣는 이유는?

부분합이 한 행 내려가는 데 한 사이클이 걸리므로, 다음 행의 입력도 한 사이클 늦게 도착해야 같은 출력 원소의 다음 항을 정확히 누적할 수 있다.

Q3. 최대 40 TOPS, 대역폭 80 GB/s인 NPU에서 산술 집약도 100 연산/바이트인 커널이 낼 수 있는 최대 성능은?

80 GB/s × 100 = 8 TOPS < 40 TOPS. 능선점은 40T/80G = 500 연산/바이트이므로 100은 그 왼쪽, 메모리 한계 영역이다.

Q4. n×n 행렬 곱의 타일 크기를 32에서 128로 키우면 A·B를 읽는 DRAM 트래픽은 대략 어떻게 되는가?

A·B 트래픽 ≈ 2n³/T이므로 T가 4배면 1/4이다. 대신 필요한 SRAM은 T²에 비례해 16배가 된다.

Q5. 70억 매개변수 모델을 INT4로 양자화해 대역폭 70 GB/s(효율 70%)에서 돌리면 토큰 생성 속도는 대략?

가중치 7 × 10⁹ × 0.5 B = 3.5 GB. 49 GB/s ÷ 3.5 GB ≈ 14토큰/초(KV 캐시 제외). 계산 능력은 거의 상관없다.

Q6. 2:4 구조적 희소성이 비구조적 희소성보다 하드웨어에서 유리한 점은?

규칙적인 패턴 덕분에 데이터 흐름을 바꾸지 않고 곱셈기 절반을 건너뛸 수 있다. 비율은 50%로 고정되고, 같은 비율이면 비구조적보다 정확도 손실이 약간 클 수 있다.