전력: 동적·누설·DVFS
게임을 30분 하면 휴대폰이 손난로처럼 따뜻해지고 배터리가 20% 넘게 줄어든다. 그 에너지는 어디로 갔을까? 화면이 꺼진 채 하룻밤을 보내도 배터리가 몇 %밖에 줄지 않는 것은 또 어떻게 가능할까? 답은 같은 곳에 있다. 칩 안에서 수십억 개의 아주 작은 커패시터가 1초에 수십억 번 충전되고 방전되며, 꺼져 있어야 할 트랜지스터로도 전류가 조금씩 샌다. 이 장에서는 그 두 가지 전력의 정체를 직접 재 보고, SoC가 전압·주파수를 쉴 새 없이 바꾸고 블록을 통째로 끄면서 같은 일을 더 적은 에너지로 해내는 방법을 배운다.
- 커패시터를 한 번 충전·방전할 때 \(CV^2\)의 에너지가 열이 되는 과정을 설명하고 \(P=\alpha C V^2 f\)로 칩 전력을 어림한다.
- 문턱 전압 아래 누설 전류가 문턱 전압과 온도에 지수로 반응한다는 것을 그래프로 확인한다.
- 전압-주파수 곡선 위에서 동작점을 옮기며 전력이 주파수의 세제곱에 가깝게 느는 이유와 에너지 최소점을 찾는다.
- DVFS 거버너(performance, powersave, ondemand, schedutil)를 같은 작업에 돌려 에너지와 마감 위반을 비교한다.
- 클럭 게이팅과 전원 게이팅의 차이, 전원을 끄는 것이 이득이 되는 손익분기 시간을 계산한다.
스위칭 한 번의 값
디지털 회로의 모든 신호선은 결국 작은 커패시터다. 게이트 출력은 다음 게이트들의 입력(게이트 산화막), 그 사이를 잇는 배선, 자기 자신의 드레인 접합을 함께 끌고 다닌다. 이것들을 하나로 묶어 출력에 매달린 부하 커패시턴스 \(C\)라 부른다. 신호를 0에서 1로 바꾼다는 것은 이 커패시터를 전원 전압 \(V\)까지 충전하는 일이고, 1에서 0으로 바꾼다는 것은 그 전하를 접지로 버리는 일이다(인버터의 구조는 2장).
아래 그림은 CMOS 인버터 하나가 부하 \(C\)를 구동하는 모습이다. 입력이 0이면 위쪽 PMOS가 켜져 전원에서 전하가 흘러들고, 입력이 1이면 아래쪽 NMOS가 켜져 전하가 접지로 빠진다. 오른쪽 장부는 전원이 내준 에너지가 어디로 갔는지를 실시간으로 적는다. 전압과 커패시턴스를 바꾸고, 입력 데이터의 종류도 바꿔 보자.
여기서 놀라운 점은 PMOS의 저항값이 결과에 들어가지 않는다는 것이다. 저항이 크면 천천히 충전되고 작으면 빨리 충전될 뿐, 저항에서 열로 사라지는 에너지는 언제나 \(\tfrac12 CV^2\)다. 즉 에너지를 줄이려면 \(C\)나 \(V\)를 줄이거나, 충전 횟수 자체를 줄여야 한다. 트랜지스터를 더 좋게 만들어도 이 식을 피할 수는 없다. 특히 전압은 제곱으로 들어가므로 가장 강력한 손잡이다.
그림 12-1에서 확인하기 전에 먼저 계산해 보자.
답 보기
\((0.6/0.8)^2 = 0.5625\), 즉 44% 가까이 준다. 전압을 25% 낮췄는데 에너지는 거의 절반이 됐다. 대신 트랜지스터가 내는 전류가 줄어 충전이 느려진다. 이 대가가 무엇인지는 4절에서 본다.
칩 전체로 키우기: P = αCV²f
칩 전체의 전력은 그림 12-1의 인버터 수십억 개를 더한 것이다. 모든 노드의 커패시턴스를 더한 값을 \(C\), 사이클마다 실제로 0→1로 바뀌는 노드의 비율을 활동 계수(Activity factor) \(\alpha\), 1초에 반복하는 사이클 수를 클럭 주파수 \(f\)라 하면 동적 전력(Dynamic power)은 다음과 같다.
숫자를 넣어 보자. 큰 CPU 코어 하나에 스위칭될 수 있는 커패시턴스가 모두 6 nF쯤 있고, 그중 평균 15%가 매 사이클 바뀐다고 하자. 1.0 V, 3.2 GHz라면 \(0.15 \times 6\,\text{nF} \times 1^2 \times 3.2\,\text{GHz} \approx 2.9\) W다. 1 V에서 2.9 W라는 것은 코어 하나에 약 3 A가 흐른다는 뜻이기도 하다. 이 큰 전류를 칩 안까지 안정적으로 보내는 문제는 13장에서 다룬다.
네 손잡이는 서로 성격이 다르다. \(C\)는 설계할 때 정해진다. 트랜지스터 크기, 배선 길이, 회로 구조가 결정한다. \(\alpha\)는 설계와 소프트웨어가 함께 정한다. 쓰지 않는 회로의 클럭을 끊으면(8절의 클럭 게이팅) 그 회로의 \(\alpha\)는 0이 된다. 버스에 같은 데이터를 계속 싣거나, 값이 거의 바뀌지 않게 부호화하는 것도 \(\alpha\)를 줄인다. \(V\)와 \(f\)는 칩이 동작하는 도중에도 바꿀 수 있는 손잡이다. 이 둘을 함께 바꾸는 기술이 6절의 DVFS다.
클럭은 사이클마다 반드시 한 번 오르내리므로 \(\alpha = 1\)이고, 칩의 모든 플립플롭까지 가지를 뻗은 거대한 배선망(클럭 트리)을 구동한다. 그래서 클럭 분배만으로 칩 동적 전력의 20~40%를 쓰는 일이 흔하다. 클럭 트리는 14장에서 자세히 본다.
꺼진 스위치로 새는 전류
이상적인 스위치라면 꺼졌을 때 전류가 0이어야 한다. 실제 트랜지스터는 그렇지 않다. 게이트 전압이 문턱 전압 \(V_{th}\)보다 낮아도, 채널의 전자 중 열에너지가 큰 일부는 장벽을 넘어 흘러간다. 이것이 문턱 아래 누설(Subthreshold leakage)이다. 볼츠만 분포를 따르기 때문에 이 전류는 게이트 전압에 지수적으로 반응한다.
이 식에서 두 가지가 바로 읽힌다. 첫째, \(V_{GS}=0\)일 때의 누설 \(I_{\text{off}}\)는 \(V_{th}\)를 \(S\)만큼 낮출 때마다 10배 늘어난다. 빠른 트랜지스터를 원해 \(V_{th}\)를 낮추면 누설이 폭발한다. 둘째, 온도가 오르면 \(kT/q\)가 커져 기울기가 완만해지고, 동시에 \(V_{th}\)도 1 K당 약 1 mV씩 내려간다. 두 효과가 겹쳐 누설은 온도에 거의 지수로 늘어난다. 아래 그래프에서 곡선을 좌우로 끌어 \(V_{th}\)를 바꾸고, 온도를 올려 보자.
그림 12-3에서 \(V_{th}\) = 0.3 V로 두고 온도만 바꿔 보기 전에 짐작해 보자. 2배? 5배? 20배?
답 보기
이 모델에서는 약 13배다. 온도가 20 °C 오를 때마다 대략 2.5배씩 늘어나는 셈이다. 실제 칩에서도 60 °C 상승에 누설이 수 배~10여 배 늘어나는 것이 보통이다. 게임을 오래 하면 칩이 뜨거워지고, 뜨거워진 칩은 같은 일을 해도 전력을 더 쓰고, 그래서 더 뜨거워진다. 이 양성 되먹임이 13장의 열 폭주 이야기다.
누설에는 다른 경로도 있다. 아주 얇은 게이트 산화막을 양자 터널링으로 뚫는 게이트 누설, 드레인-기판 접합의 역방향 전류, 짧은 채널에서 드레인 전압이 장벽을 낮추는 DIBL(Drain-induced barrier lowering) 효과 등이다. 2000년대 중반 90~65 nm 공정에서 누설이 동적 전력에 맞먹을 만큼 커지자, 업계는 high-k 게이트 절연막(게이트 누설 대책)과 FinFET, 이어서 GAA 나노시트(채널을 게이트로 감싸 \(S\)를 이상값 가까이 회복)로 대응했다. 그래도 수십억 개의 트랜지스터가 조금씩 새는 양을 합치면 크다. 뜨거운 플래그십 SoC에서 누설은 전체 전력의 10~30%를 차지한다.
공정은 보통 \(V_{th}\)가 다른 트랜지스터를 3~5종(ULVT, LVT, SVT, HVT 등) 제공한다. 설계 도구는 타이밍이 빠듯한 임계 경로에만 빠르지만 새는 저 \(V_{th}\) 셀을 쓰고, 여유가 있는 경로는 느리지만 덜 새는 고 \(V_{th}\) 셀로 바꾼다. 같은 회로에서 누설을 수 배 줄이는 흔한 기법이다.
전압과 주파수는 같이 움직인다
그렇다면 전압을 마음껏 낮추면 될까? 문제는 속도다. 게이트 하나의 지연은 부하 \(C\)를 충전하는 데 걸리는 시간 \(t \approx CV/I_{\text{on}}\)이고, 켜짐 전류 \(I_{\text{on}}\)은 \(V - V_{th}\)가 작아질수록 빠르게 줄어든다. 짧은 채널 트랜지스터에서는 이 관계를 알파 전력 법칙(Alpha-power law, Sakurai–Newton 1990)으로 잘 근사한다.
전압을 높이면 더 빠르게 돌릴 수 있고, 빠르게 돌리려면 전압을 높여야 한다. 그래서 칩은 주파수마다 그 주파수를 안전하게 낼 수 있는 최소 전압을 표로 갖고 있다. 아래 왼쪽 그래프의 점을 곡선을 따라 끌어 보자. 오른쪽은 같은 동작점에서의 전력이다.
전압과 주파수가 대략 비례한다고 보면 \(P \propto V^2 f \propto f^3\)이다. 성능을 10% 더 얻으려면 전력을 약 33% 더 써야 하고, 반대로 성능을 30% 포기하면 전력은 거의 3분의 1로 준다. 이 비대칭이 휴대폰 칩 설계의 기본 전략을 만든다. 코어를 여러 개 두고 각자 낮은 전압·주파수로 돌리는 편이 코어 하나를 아주 빠르게 돌리는 것보다 에너지 효율이 좋다. 작은 효율 코어와 큰 성능 코어를 함께 두는 big.LITTLE 구조(4장)도 같은 생각에서 나왔다. 같은 성능이라도 작은 코어가 더 낮은 곡선 위에 있다.
오른쪽 그래프에서 3.0 GHz → 3.3 GHz(+10%)에 드는 전력 증가를 보자. 최고 클럭은 짧은 순간(앱 실행, 스크롤 시작)에만 쓰고, 몇 초 넘게 유지하면 열 한계에 걸린다. 벤치마크 점수의 최고 클럭과 실제 사용의 지속 클럭이 다른 이유다.
에너지가 가장 적은 전압
전력이 아니라 일 하나를 끝내는 데 드는 에너지를 보자. 배터리가 정말로 신경 쓰는 것은 이것이다. 연산 한 번의 동적 에너지는 \(\alpha C V^2\)이므로 전압을 낮출수록 줄어든다. 그런데 누설 전력은 연산이 끝날 때까지 계속 흐른다. 전압을 문턱 근처까지 낮추면 회로가 극도로 느려져서, 한 연산에 걸리는 시간 동안 새는 에너지가 급격히 커진다.
대부분의 조건에서 최소점은 문턱 전압 근처, 0.3~0.5 V에 있다. 그곳의 에너지는 공칭 전압의 몇 분의 1이지만 주파수는 수십~수백 분의 1로 떨어진다. 이렇게 문턱 근처에서 동작시키는 설계를 문턱 근처 컴퓨팅(Near-threshold computing, NTC)이라 부른다. 속도가 중요하지 않은 센서 허브, 웨어러블, 항상 켜진 음성 감지 회로가 이 영역을 노린다. 다만 문턱 근처에서는 공정 편차에 따라 트랜지스터마다 속도가 크게 달라지고, SRAM이 안정적으로 동작하기 어려워 실제 설계는 까다롭다.
DVFS와 거버너
할 일이 많을 때는 전압과 주파수를 올리고, 적을 때는 내린다. 이것이 동적 전압·주파수 조절(DVFS, Dynamic voltage and frequency scaling)이다. 칩은 미리 검증한 동작점 목록(P-state 또는 OPP, Operating performance point)을 갖고 있고, 운영체제의 거버너(Governor)가 몇 ms마다 다음 동작점을 고른다. 주파수를 올릴 때는 PMIC에 전압을 먼저 올리라고 요청해 안정되기를 기다린 뒤 PLL 주파수를 바꾸고, 내릴 때는 반대 순서로 한다. 한 번 전환에 수십 µs가 걸린다.
| SB-1 큰 코어 P-state | P0 | P1 | P2 | P3 | P4 | P5 | P6 | P7 |
|---|
문제는 거버너가 미래를 모른다는 것이다. 사용자가 화면을 스크롤하면 60분의 1초마다 프레임 하나를 그려야 하는데, 프레임마다 일의 양이 다르다. 너무 낮은 클럭을 고르면 프레임이 마감(vsync)을 놓쳐 화면이 끊기고(jank), 너무 높으면 에너지를 낭비한다. 아래 시뮬레이터에서 같은 작업에 거버너를 바꿔 끼워 보자.
- performance: 항상 최고 P-state. powersave: 항상 최저 P-state.
- ondemand: 표본 주기마다 지난 구간의 사용률을 재서 80%를 넘으면 최고로, 아니면 사용률에 비례한 주파수로 간다(리눅스의 고전적인 거버너).
- schedutil: 스케줄러가 아는 사용률을 주파수 불변 값으로 바꾸고 1.25배 여유를 둔 주파수를 고른다(현재 안드로이드·리눅스 기본).
- 수동: 고정 P-state. 유휴 시간 동안 깊은 유휴 상태(전원 게이팅, 8절)를 쓸지도 고를 수 있다.
DVFS 거버너 실험실
깊은 유휴 상태를 켠 채로 생각해 보자.
답 보기
powersave는 0.6 GHz로 버티지 못해 거의 모든 프레임을 놓친다. 놓친 일은 쌓여서 결국 코어가 내내 바쁘다. performance는 마감을 다 지키지만 일할 때 전력이 4 W가 넘어 에너지가 가장 크다(powersave의 세 배 이상). 그 사이의 거버너들이 흥미롭다. ondemand는 사용률이 80%만 넘으면 최고 클럭으로 뛰어올라 마감은 지키지만 에너지를 꽤 쓴다. schedutil은 에너지를 가장 아끼지만, 프레임마다 일의 양이 들쭉날쭉하면 평균에 맞춘 클럭으로는 무거운 프레임을 놓친다. 오히려 작업을 잘 아는 사람이 고른 고정 P-state(수동 P3)가 마감도 지키고 에너지도 적다. 거버너가 "미래를 모른다"는 문제가 그대로 드러난다. 표본 주기를 늘려 보면 반응이 늦어져 결과가 더 나빠지는 것도 볼 수 있다.
그래서 실제 휴대폰은 거버너에게 힌트를 준다. 화면을 터치하는 순간 미리 클럭을 올리는 입력 부스트, 화면에 보이는 앱의 작업에 최소 사용률을 걸어 두는 uclamp, 큰 코어와 작은 코어 중 어디에 작업을 둘지 정하는 에너지 인지 스케줄링(EAS), 열 상태에 따라 최고 P-state를 막는 열 관리(13장)가 함께 돈다. 코어마다 전압을 따로 줄 수 없는 칩이 많아서, 같은 클러스터의 코어들은 가장 바쁜 코어에 맞춰 같은 전압을 쓰기도 한다.
빨리 끝내고 쉴까, 천천히 할까
사진 한 장을 1초 안에 처리해야 한다고 하자. 높은 클럭으로 0.4초 만에 끝내고 0.6초 동안 잠드는 레이스 투 아이들(Race-to-idle)이 좋을까, 낮은 클럭으로 마감 직전까지 천천히 하는 편이 좋을까? 4절의 세제곱 법칙만 보면 답은 "천천히"다. 하지만 코어가 일하는 동안에는 코어만 깨어 있는 게 아니다. DRAM, 인터커넥트, 캐시, 다른 블록들도 함께 깨어 있어야 하고, 이들의 전력은 코어 클럭과 무관하게 시간에 비례해서 쌓인다.
나머지 시스템 전력이 작으면 낮은 클럭이 이기고, 크면 빨리 끝내고 모두를 재우는 편이 이긴다. 유휴 상태에서 얼마나 깊이 잘 수 있는지도 중요하다. 클럭만 멈추고 전원은 켜 둔다면 쉬는 동안에도 누설이 흐르므로, 일할 때의 전압이 낮은 편이 유리해진다. 실제 시스템의 최적점은 보통 곡선 중간의 "효율 좋은 지점"에 있으며, 휴대폰 칩 회사들은 이 지점을 P-state 표에서 찾아 스케줄러에 알려 준다.
클럭 게이팅과 전원 게이팅
가장 확실한 절약은 쓰지 않는 회로를 멈추는 것이다. 방법은 두 단계다. 클럭 게이팅(Clock gating)은 블록으로 들어가는 클럭을 AND 게이트(실제로는 글리치를 막는 래치 기반 ICG 셀)로 막아 \(\alpha\)를 0으로 만든다. 한 사이클 만에 걸고 풀 수 있어 거의 공짜이고, 현대 설계 도구는 플립플롭 묶음마다 자동으로 넣는다. 하지만 전원은 켜져 있으니 누설은 그대로다.
전원 게이팅(Power gating)은 블록과 전원 사이에 큰 스위치 트랜지스터(헤더 또는 푸터)를 넣어 전원 자체를 끊는다. 누설까지 거의 없어지지만 대가가 있다. 꺼지면 레지스터 내용이 사라지므로 필요한 상태를 저장해 두거나(리텐션 플립플롭), 켤 때 다시 초기화해야 한다. 꺼진 블록의 출력이 떠서 이웃 블록을 오작동시키지 않도록 격리 셀(Isolation cell)도 둔다. 다시 켤 때는 블록 전체의 전원망 커패시턴스를 충전해야 하고, 갑자기 큰 전류가 흐르지 않도록 스위치를 조금씩 순서대로 켜야 해서 수 µs~수백 µs가 걸린다.
이제 칩 전체로 넓혀 보자. SB-1은 블록마다 따로 끌 수 있는 전원 도메인(Power domain)으로 나뉘어 있다. 아래 다이에서 블록을 누를 때마다 상태가 켜짐 → 클럭 정지 → 전원 차단 순으로 바뀐다. 상황을 고르고, 일하지 않는 블록을 꺼서 전력을 얼마나 줄일 수 있는지 보자. 일하는 블록을 꺼 버리면 기능이 멈춘다(빨간 테두리). 전력·클럭 관리 블록은 다른 블록을 깨워야 하므로 항상 켜진 도메인(AO, Always-on)에 있다.
SB-1 전원 도메인 스위치
CG 빗금 = 클럭 정지
OFF 어두운 칸 = 전원 차단
빨간 테두리 = 일해야 하는데 꺼져 멈춘 기능
대기 상태의 휴대폰이 며칠을 버티는 비결이 여기에 있다. 화면이 꺼지면 큰 코어, GPU, NPU, ISP는 물론 대부분의 캐시까지 전원을 끊고, 항상 켜진 작은 영역(PMU, 음성 감지 DSP, 모뎀의 일부, 타이머)만 남긴다. DRAM은 스스로 내용을 유지하는 셀프 리프레시 모드로 들어간다(7장). 그 결과 SoC 대기 전력은 수 mW~수십 mW까지 내려간다.
| 항목 | 대략값 | 비고 |
|---|---|---|
| 휴대폰 SoC 지속 전력 | 약 3~5 W | 순간 최대 10 W 이상, 열 한계로 수십 초~수 분만 (2024년 플래그십) |
| 큰 코어 하나 최고 클럭 | 약 3~5 W | 약 1.0~1.1 V, 3.3~4.3 GHz (2023~2025년) |
| 작은 코어 하나 | 약 0.1~0.4 W | 최고 2 GHz 안팎 |
| 누설 비중 | 약 10~30% | 뜨거운 상태(85 °C 이상)에서 큼 |
| 클럭 분배 전력 | 동적 전력의 약 20~40% | 클럭 게이팅으로 크게 줄임 |
| DVFS 전환 시간 | 약 10~100 µs | 전압 조정기 응답 + PLL 재고정 |
| 코어 전원 게이팅 복귀 | 약 수십 µs~1 ms | 상태 복원 포함, 깊은 상태일수록 길다 |
| SoC 대기 전력 (화면 꺼짐) | 약 5~30 mW | DRAM 셀프 리프레시, 모뎀 페이징 포함 시 더 큼 |
| 문턱 아래 기울기 S | 약 65~80 mV/dec | FinFET·GAA, 실온. 이론 한계 60 mV/dec |
핵심 정리
- 커패시터를 한 번 충전·방전하면 \(CV^2\)가 모두 열이 된다. 칩 전체로는 \(P_{\text{dyn}} = \alpha C V^2 f\). 전압이 제곱으로 들어가는 가장 강한 손잡이다.
- 꺼진 트랜지스터도 문턱 아래 누설로 전류가 샌다. 누설은 \(V_{th}\)와 온도에 지수로 반응해서, 뜨거운 칩은 같은 일에 전력을 더 쓴다.
- 높은 주파수에는 높은 전압이 필요하므로 전력은 주파수의 세제곱에 가깝게 는다. 에너지만 보면 문턱 근처에 최소점이 있지만 속도는 크게 떨어진다.
- DVFS 거버너는 사용률을 보고 P-state를 고른다. 너무 느리면 마감을 놓치고 너무 빠르면 에너지를 낭비한다. 레이스 투 아이들이 이기는지는 나머지 시스템 전력과 유휴 상태의 깊이에 달렸다.
- 클럭 게이팅은 동적 전력을, 전원 게이팅은 누설까지 없앤다. 전원 게이팅은 전환 비용이 있어 손익분기 시간보다 오래 쉴 때만 이득이다.
확인 퀴즈
Q1. 부하 커패시터 C를 전압 V로 한 번 충전할 때 전원이 내주는 에너지와, 그중 충전 과정에서 PMOS에서 열이 되는 에너지는?
Q2. 다른 조건이 같을 때 동적 전력을 가장 크게 줄이는 변화는?
Q3. 문턱 아래 기울기가 80 mV/decade인 트랜지스터에서 문턱 전압을 160 mV 낮추면 꺼짐 전류는 대략 몇 배가 되는가?
Q4. 에너지 최소점이 문턱 전압 근처에 생기는 이유로 옳은 것은?
Q5. 레이스 투 아이들(최고 클럭으로 빨리 끝내고 깊이 잠들기)이 가장 유리해지는 조건은?
Q6. 어떤 블록은 켜 둔 채 쉬면 누설이 40 mW이고, 전원을 끊었다 다시 켜는 데 8 µJ이 든다(꺼진 동안 누설은 무시). 전원을 끄는 것이 이득이 되는 최소 유휴 시간은?