●8T SRAMとStatic Circuit

もう一つの省電力のキーワードが、回路構成の省電力化だ。一般論としてプロセスを微細化すると、トランジスタの動作できる範囲が狭まってくる(Photo18,19)。

Photo18,19:これは2つのプレゼンテーションを並べて比較しないと意味が無い。プロセスを微細化すると、消費電力の問題や、小型化により限界電圧が下がる事に起因して、最大電圧(Vmax)は必然的に下がる。その一方、性能の維持や動作エラーなどを防ぐために、最低電圧(Vmin)はむしろ上がる傾向にある。このため、電圧を上げるとか下げるとかいった形での特性変更の余地があまり無くなりつつある。

こうした状況で低消費電力・高性能を維持するためには、回路構成を従来から変更する必要がある。一つがL1/L2キャッシュ(や、LSD/TLBなど)に使われているSRAMセルの構造である。従来の6T構成から、Core i7では8T構成とした(Photo20)。これに加えて、ECCをより強化したり、ECUによって温度補償を行ったり、ときめ細やかな配慮が行われている。8T-SRAMの構成により電圧を下げても安定動作するようにし、これを強力なエラー訂正や温度補償回路でバックアップする事で、トータルとして省電力が狙えるという話だ。

Photo20:8T-SRAMの方が微細化した状態で効果的、という話は例えばIBMが2005年にVLSI Technology Symposiumで行った発表にも既に見られるし、VIA TechnologyのNanoプロセッサもやはり8T-SRAMを使っていることで有名。

ただこれよりも劇的というか信じられなかったのが、Static Circuitの採用だ(Photo21)。「IAプロセッサとしては20年ぶり」というが、別にIAに限らず、最近のプロセッサでこんなものを採用したケースは殆ど見かけない。

Photo21:今から考えると、Prescottの消費電力過多は、単に長いパイプラインだけでなく、このLVSが悪かったのかもしれないとも思う。

そもそもStatic Circuitとは何ぞや、という話をするためにはDynamic Circuitを説明する必要がある。Dynamic CircuitとはMOS回路(特にNMOS)で生まれた方式で、NMOSのゲートが一種のコンデンサ的な状態に置かれるのを利用し、クロック信号を入力に印加することで回路を動作させるという仕組みだ。

Photo21にも両者の違いが示されているが、もう少し簡単なところでインバータ(反転回路)を考えてみる。Static Circuit、つまり普通に教科書に載ってる方法が図3である。トランジスタの上側がコンデンサの充電、下側が放電を行う形になる(入力がLoならば、電流は上から下に流れる事になり、OutはHighになる。一方入力がHighならば、電流が流れなくなり、OutはLoである)。

これをDynamic Circuitにする場合、回路全体のClock信号をゲートに突っ込む形だ。上側のトランジスタは先にも書いたとおりコンデンサに近い働きをしているから、断続的にクロック信号が来さえすれば電圧レベルを維持でき、図3と同じ働きをする。

図3:Static Circuit

図4:Dynamic Circuit

このDynamic Circuitのメリットとデメリットは、

・メリット:

  • 同じ回路を、Static Circuitより少ないトランジスタで構成できる(図3・4だと全く同じだが、これは非常に簡単な回路のためだ)。したがって、要件次第ではむしろ省電力になるし、またダイ面積も小さく抑えられ、低コストにも貢献する。
  • 回路構成の自由度が高い。これは設計の柔軟性に寄与する。
  • タイミング設計が楽。
  • 性能の調整(速度優先とか省電力優先とか)が行いやすい。

・デメリット:

  • あまりクロックが遅いと、トランジスタが放電してしまい、動作できなくなる。したがって最低動作周波数がある。
  • 原理的に雑音に弱い。

といったところだろう。

さて、ここまでの話はNMOS回路の話であるが、CMOS回路でもやはり同じようにDynamics Circuitが一般的に利用されている。ただし回路規模が複雑になると、入力Clockの位相を調整するのが次第に難しくなってくる。このために採用されたのが、(Photo21にも出てきている)Domino Circuitである。Dominoとはドミノ倒しのアレの事で、要するに複数段の回路を構成するときに、前の段が動く事でそれが次の段を起動する、といったまさしくドミノ倒しの様な動き方をすることからこの名前がつけられている。

このDomino Circuit、長所はほぼ先のDynamic Circuitに近いものがあるが、更に高速性が付け加わった。元々CMOS回路をDynamic化することで、Staticの場合よりも短い時間で状態が変わる(=より動作周波数が上げられる)という特徴があり、これをそのまま引き継いだ形だ。Intelの場合、Prescott世代からは新しいLVS(Low-Voltage Swing)と呼ばれる回路を採用しており、こちらは内部回路を通常のCMOSより低い電圧とすることでより高速に動作できるようにした(*1)。

(*1) LVSに関する詳細は、ISSCC 2004でIntelが発表した"Low-voltage-swing logic circuits for a 7GHz x86 integer core"に詳しいが、これとは別にIntel Technology JournalのバックナンバーにもLVSの解説があり、これの日本語版ダイジェストがこちらからまだ入手可能である。

さて、話を戻す。そんなわけで現在は殆どのプロセッサがDynamic Circuitで構成されている。現在Static Circuitを使っているのは、省電力などの目的でDynamic Circuitが構成できないほど動作周波数を落とすプロセッサ程度のものだ。

ところが最近になって、Dynamic Circuitを構成する前提条件が幾つか変わってきた。その最大のものは、リーク電流の増大だろう。プロセス微細化に伴い、ゲートからの漏れ電流が増大の一途を辿っており、この結果として最低動作周波数をどんどん引き上げないと放電しきってしまう。また、Dynamic Circuitはクロック信号にあわせて事実上On/Offするため、余分な消費電力を喰う事になる。結果として、消費電力という観点では極めて厳しいものになりつつあるのも事実ではあった。

ただ、だからと言っていきなりStatic Circuitを採用したのは正直驚きである。「微細化の結果、トランジスタはもう十分高速に動作するので、Static Circuitでも問題ない」というのがIntelの見解であるが、逆に言えばPower GateやStatic Circuitまで使わないといけないほど、Nehalemの消費電力はCriticalだったと筆者は理解している。

しかしそうなると疑問なのは「なぜ?」である。これがAMDの場合、K8→K10は同じ製造プロセスながら、L1キャッシュとデコーダを猛烈に強化した結果として消費電力が爆発的に増えたと理解できるのだが、Penryn→Nehalemではそんなに大きな消費電力増となる要因を見出せないのが正直なところだ。

こちらのレポートでもまとめたとおり、Penryn→Nehalemで、コア内に大きな変更はない。せいぜいがLSDの実装だが、たかだか18命令分のFIFOだからその影響も限られるだろう。SSE 4.2の実装がそんなに大事にも思えないし、Branch Prediction関係やTLB、細かいPrefetchやBufferが大きく影響するとも考えにくい。普通に考えれば、Penryn世代と同じ回路設計でも「多少消費電力が増える」程度で済んだ様にも思えるのだが、それでは済まない何かがあったのか、それとも既に打てる手を全部打ちきっており、残るのがStatic Circuitくらいしかなかったという話なのか、非常に興味あるところである。