
CMOSの消費電力をPythonで計算する|なぜチップは"発熱"するのか
2026-09-20 ・ 実践
高性能チップほど熱くなり、冷却が課題になります。なぜ半導体は電力を食い、発熱するのか? 消費電力を 動的電力 と リーク電力 に分けてPythonで計算し、「電圧を下げる」ことがなぜ効くのかを数値で理解します。
消費電力の2つの成分
CMOS回路の消費電力は、大きく2つに分かれます。
動的電力 = α × C × V² × f (スイッチするたびに消費)
リーク電力 = V × I_leak (何もしなくても漏れる)
α=スイッチ確率、C=容量、V=電圧、f=周波数。電圧Vの2乗で効くのが最大のポイントです。
準備
pip install numpy
① 動的電力を計算
def dynamic_power(C, V, f, alpha=0.1):
return alpha * C * V**2 * f
# あるチップの例
C = 1e-7 # 総容量 F(チップ全体の等価容量)
f = 3e9 # 3GHz
for V in [1.2, 1.0, 0.8]:
p = dynamic_power(C, V, f)
print(f"電圧 {V}V → 動的電力 {p:.1f} W")
出力:
電圧 1.2V → 動的電力 43.2 W
電圧 1.0V → 動的電力 30.0 W
電圧 0.8V → 動的電力 19.2 W
電圧を1.2V→0.8Vに下げるだけで、電力が43W→19Wへ半分以下。V²で効くので、わずかな電圧低下が大きな省電力になります。だからチップは低電圧化を追い求めるのです。
② リーク電力:微細化の悩み
トランジスタが小さくなるほど、オフのはずでも電流が漏れます(リーク)。
def leakage_power(V, I_leak):
return V * I_leak
# 微細化でリーク電流が増える様子
for node, I_leak in [("旧世代", 0.5), ("微細化後", 5.0)]:
p = leakage_power(1.0, I_leak)
print(f"{node}: リーク電力 {p:.1f} W")
微細化するとリーク電流が増え、**「何もしていなくても電力を食う」**問題が深刻に。かつては動的電力が主役でしたが、微細化とともにリークの比重が増しました。
電圧を下げれば全部良い?
電圧を下げると動的もリークも減りますが、下げすぎるとトランジスタが正しく速く動かなくなります。「性能を保てる最低電圧」を狙うのが設計の腕。周波数を落とす、使わない部分の電源を切る(パワーゲーティング)なども併用します。
デナードスケーリングの終焉
かつては微細化すれば電圧も下げられ、電力密度が一定に保てました(デナードスケーリング)。しかし2000年代半ばにこれが崩れ、微細化しても電力が下がりにくくなった。これが「クロック周波数が頭打ち」「マルチコア化」の引き金です。
まとめ
- 消費電力は動的電力(α·C·V²·f)とリーク電力(V·I_leak)
- 電圧はV²で効くので、低電圧化が最も省電力に効く
- 微細化でリーク電流が増え、待機電力が問題に
- デナードスケーリングの終焉が、周波数頭打ちとマルチコア化を招いた
もう少し詳しく(背景と理論)
CMOS回路の消費電力は大きく動的電力と静的(リーク)電力に分かれます。動的電力は P = α·C·V²·f(α:スイッチング率、C:負荷容量、V:電源電圧、f:周波数)で、電圧の2乗に比例するのが最重要ポイントです1。だから電圧を下げると電力が劇的に減り、Dennardスケーリングの時代は微細化とともに電圧も下げて電力密度を一定に保てました。しかし2000年代半ば以降、しきい値電圧を下げられなくなりリーク電流(サブスレッショルド漏れ・ゲート漏れ)が支配的になって、電圧低下が頭打ちになりました2。これが電力の壁——クロック周波数の頭打ちとマルチコア化への転換を招いた根本原因です3。
次の一歩 🌸
微細化の限界はデナードスケーリング、成長則はムーアの法則をPythonで、微細化の最前線は2nm競争へどうぞ。