8. マルチコアプロセサの電力制御
CMOSのスタティック論理回路は、広い電源電圧範囲で正しい論理動作をする。6トランジスタセルを使うSRAMは電源電圧が低くなると、書き込みが正しく行えなくなったり、読み出し時に記憶していたデータが破壊されたりという問題が起こるため、論理回路ほど低い電源電圧では動作しないが、それでも0.8V程度までは動作する。また、8トランジスタSRAMセルの使用やその他の回路的な工夫で、より低い電源電圧でも動作するSRAMセルも作られている。
CMOSプロセサはSRAMの動作限界までは電源電圧を下げても論理的には正しく動作するが、動作できる最高クロック周波数はほぼ電源電圧に比例して低下していく。前に述べたように、CMOSプロセサのダイナミック電力はαCV2fで表されるので、80%のクロックで動けば十分な処理速度が得られる場合は、クロックfと電源電圧Vを0.8倍にすると、ダイナミック消費電力は0.8の3乗の0.512倍とおおよそ半分の消費電力で処理ができることになる。
DVFS(Dynamic Voltage Frequency Scaling)
この関係を利用して、処理する仕事が多く、負荷が重い場合には電源電圧を上げてクロックを上げ、逆に負荷が低い状態では電源電圧とクロックを下げるという制御を行う方式を「DVFS(Dynamic Voltage Frequency Scaling)」と呼ぶ。
DVFSを採用した最初の商用プロセサは、今は無くなってしまったTransmetaという会社が2000年に出したCrusoeというプロセサである。Crusoeは、内部構成は独自のVLIW命令を持つが、x86命令のプログラムを、ダイナミックに独自命令に翻訳して実行するという方式のプロセサであった。この翻訳は実行頻度の高い部分を優先して行っており、このトランスレータから負荷量の情報を得て、電源電圧とクロックを制御するという方法を取っていた。
その後、消費電力の問題が深刻になるにつれてDVFSの採用が広まっていき、多くのプロセサがDVFSを採用している。特に、低負荷の時間が長いモバイル用のプロセサでは、DVFSは例外なく採用されている。
マルチコアプロセサとDVFS
マルチコアのプロセサでは、コアごとに動作状態が異なるので、消費電力の点からは、コアごとに最適の電源電圧とクロック周波数で動作させるのが望ましい。
しかし、プロセサチップでは、コア以外のクロスバ、シェアードキャシュなどの部分があり、さらに、最近のプロセサチップは、PCI ExpressやDRAMインタフェースなどを同じチップ上に集積している。各コアに個別の電源を供給し、その他の部分にもそれぞれ独立した電源を供給するとなると多くの安定化電源回路が必要であるだけでなく、チップパッケージの電源ピン数も多く必要になるし、プリント基板での電源パターンの引き回しのために配線層が増えてコストアップになるなど難しい問題が出てくる。
このため、現状では、図8.1に示すように、全部のプロセサコアに共通の電圧を与え、各プロセサコアには電源スイッチを付けて電源をオンオフすることが出来るようにするという構造が一般的である。
電源電圧一定でクロック周波数を変えるのは、性能と消費電力が同時に同じ比率で変わるので、処理のエネルギー効率は変わらない。しかし、処理負荷が低く、クロックを下げても処理が間に合う場合は、クロックを下げた方が電力消費を平準化できる。このため、図8.1に示すようにコアごとに独立したクロック発生器を持つものもあるが、全コアに共通のクロックを供給する構成もある。
DVFSの電源電圧としては、電源スイッチがオンになっているコアの中で、最も負荷が重く高いクロックを必要とするコアに合わせた電圧を供給する。そして、各コアのクロックとしては、処理負荷に合わせたクロックを供給する。このとき、負荷が低いコアでは、そのクロックでの動作に必要な最低限の電圧より高い電源電圧が供給され、ムダが生じるが、コア群全体に1つの電源で電力を供給するので、これは止むを得ない。
このように全コアに共通の電源を使うマルチコアチップを使う場合、全体の処理量が多いときは、すべてのコアに平均に負荷を割り振り、その処理に必要な電源電圧を供給するのが電力効率が高いが、処理量が少なく1コアで処理が出来る場合は、1コアにすべての処理を集め、残りのコアの電源スイッチをオフにする方が漏れ電流が小さくなりトータルの消費電力が少なくなることが多い。
このため、サーバ用プロセサでは、低負荷の時間は、仮想化による仮想プロセサ間のジョブのマイグレーション機能を使って、負荷を少数のコアに集め、空いたコアの電源をオフにするという運用が行われる。