私たちの身の回りでは,数多くのコンピュータが使われています。パソコンやゲーム機はもちろんのこと,テレビ,ラジオ,CD,クーラー,冷蔵庫,掃除機など私たちの家庭にある電気製品のほとんどにコンピュータが内蔵されています。このようなコンピュータシステムは組込システムとも呼ばれます。街に出ても,携帯電話,自動販売機,自動改札機,自動車と組込システムを内蔵した製品があふれています。コンピュータが入っていない電気製品を見つけることの方が難しいくらいです。今や電気製品でコンピュータを内蔵していないのは,蛍光灯やドライヤー,懐中電灯くらいでしょうか。私たちは朝起きてから夜寝るまで,一日に50個以上のコンピュータを使って毎日生活をしているのです。
現在のコンピュータの心臓部であるプロセッサとメモリは半導体集積回路で作られています。最先端の技術では,0.13ミクロンの加工技術(1ミクロンは1ミリの1000分の1)を使って,数千万から1億個のトランジスタを1平方センチ程度のシリコン板上に構成できます。このように多数の素子を小さな面積の中に押し込めて,1ギガヘルツ(1秒間に10億回の繰り返し)で動作させると,大きなエネルギーを消費することになります。最新のプロセッサは,20ワット以上の電力を消費するものもあります。
皆さんの家庭で使うホットプレートは,1500ワット程度の消費電力で,面積は1000平方センチ程度ですから,1平方センチあたりの発熱量は1.5ワット程度です。すでに,プロセッサは同じ面積からホットプレートの10倍もの「熱」を出しているのです。インテル社のペンティアムを並べて計算をさせながら,その上で目玉焼きを焼くこともできるのです。過去20年間で,プロセッサの消費電力の増加は3年ごとに約2倍の割合で増えています。このままの割合でいけば,10年後にはプロセッサの表面は,原子炉の中と同じ程度の熱を出すことになってしまいます。もちろん,こんなに熱を出したのでは,コンピュータもそれを入れている筐体も,熱で溶けてしまいます。コンピュータや組込システムの設計者は,電力消費の低減と放熱機構(皆さんのパソコンにもあのブーンと唸るファンが付いていると思います。)の工夫に多くの時間を費やしています。
コンピュータの電力消費を減らす技術は,今やコンピュータシステムの設計の最も重要な技術となっています。消費電力が大きいと,電気代がかかります。事実,スーパーコンピュータを持つ計算センターでは,1年間の電気代が数億円にのぼることもあります。我々の携帯用ノートパソコンや携帯電話では,電池の寿命に大きく関ってきます。消費電力を半分にすると同じ重さの電池で2倍の時間使えるのです。また,ファンを付けずにすめば,その分軽くなるし,ファンを動かす電力も削減できます。電力が大きな回路は熱に強いパッケージに入れなければなりません。セラミックのパッケージは,熱に弱いプラスチックパッケージに比べてとても高価です。このように,消費電力の問題は,コンピュータや組込システムの設計において,最重要事項の一つとなっているのです。
消費電力とエネルギーという言葉を確認しておきましょう。電力は,単位時間あたりのエネルギー消費量です。数学的な言葉でいえば,消費エネルギーは消費電力の時間積分であるといえます。瞬間的に必要なエネルギーの議論は消費電力の問題ですし,電池がどれだけ持続するかというような議論には,ある期間に使われるエネルギーの総量が問題となります。今後は,エネルギーで話を進めます。エネルギーを表す単位としては,ワット時(電力量:1ワットの電力を1時間使った時のエネルギー量が1ワット時),ジュール(仕事量:1リットルの水を1メートル持ち上げるのに必要なエネルギー量が1ジュール),カロリー(熱量:1グラムの水の温度を一度C上げるのに必要なエネルギー量が1カロリー)など電気的・力学的・熱力学的な定義がありますが,いずれもエネルギーを表す単位です。
皆さんが使っているノートパソコンで,どの部分がエネルギーを多く使っているのでしょうか?高速で回転しているディスクでしょうか?表示のために明るく光っている液晶パネルでしょうか?出し入れ自由なフロッピーディスクでしょうか?実は,パソコン全体の約6割の電力はプロセッサやメモリが載っているマザーボードと呼ばれるコンピュータの心臓部で消費されているのです。ディスクが約1割,液晶パネルが約1割,フロッピーディスクは2%程度,電源などが約2割といった割合です。パソコンで一番電力を使うのは,計算と記憶を行うプロセッサとメモリの部分なのです(図1)。
現在のプロセッサやメモリは,シリコンの上にMOSトランジスタと呼ばれる基本素子を大量に並べて構成されます。特に,電力消費が大きいのが,計算を実行する論理回路です。論理回路は相補的MOS(CMOS: Complementary MOS)と呼ばれる回路構成で大半の部分が作られています。CMOSでは,論理演算において基本となる素子(論理ゲート)の出力が0から1あるいは1から0に変化する時(スイッチングと呼びます)に電流が流れ,瞬時的に電力を消費します。出力信号が変化しない時は,電力消費が極めて小さくなる性質があります。また,一回の出力変化に対する消費電力は,回路の電源電圧VDDの二乗に比例し,各ゲートの出力が駆動する負荷容量CL(次のゲートまでの配線や繋がっているゲートの数によって決まる。)にも比例します(図2)。
コンピュータの上の計算は,プログラムとして与えられる一連の命令の列として実現されます。各命令の実行が,内部の論理ゲートのスイッチングを引き起こします。あるまとまった計算(タスク)を実行するために必要な命令サイクル数をCycletaskとし,各ゲートkの負荷容量をCLk,各ゲートkの一命令実行時の平均スイッチング回数をSwitk,電源電圧をVDD,とすれば,そのタスクの実行に必要となるエネルギー量は,次の式のようになります。
この式から考えると,一つのタスクを実行するのに必要なエネルギーを減らすためには,(i)実行に必要な命令サイクル数Cycletaskを減らす,(ii)各ゲートの負荷容量CLkを減らす,(iii)各ゲートのスイッチング回数Switkを減らす,(iv)電源電圧VDDを下げるという四つの方法があることがわかります。
コンピュータ設計者は,これら四つのパラメータをいかに減らしてエネルギーを削減するかに日夜努力しているのです。
式(1)によれば,エネルギー消費を決定する四つのパラメータのうちで電源電圧が二乗で効くので,最も削減効果が大きいと考えられます。すなわち,電源電圧を半分にすると,消費エネルギーを四分の一にできることになります。ところが,電源電圧は回路の性能に大きな影響を与えます。回路の動作速度は,電源電圧に反比例するのです。よく働く人はたくさんご飯を食べ,ご飯の量を減らせば働きが悪くなるというわけです。また,電源電圧は,トランジスタの動作に重要な影響を与え,ディジタル回路として正しく動作をさせるためには,無闇に下げることはできません。1970年代は電源電圧は5ボルト程度でしたが,現在は2.5ボルトから1.5ボルトが使われており,今後1ボルト以下に下がることが予想されています。
電源電圧の制御を利用したエネルギー削減の方法としては,大きく分けて二つの方法があります。一つは,アーキテクチャ的な工夫によって計算に必要な命令サイクル数を減らし,その分電源電圧を下げて一サイクルの動作を遅くして,性能を落とさずにエネルギー消費を下げる方法です。例えば,並列処理を導入し,同時に複数の命令を処理することで命令サイクル数を減らし,それで稼いだ時間を電源電圧を下げるのに充てるという考え方です。図3の例では,四つのタスクがありますが,逐次的に処理すると電源電圧5ボルトで全体で100ジュールのエネルギーが消費されます。もし,うまく並列化ができて,2台のプロセッサで実行することができれば,電源電圧を2.5ボルトまで下げて一サイクルあたりの時間を二倍にすることで,全体の処理時間は変えずに,消費エネルギーを4分の1にすることができるというわけです。最近は,このような考え方に基づいて,一つの集積回路の上に複数のプロセッサを搭載する技術が盛んに開発されています。この方法の問題点は,いつもうまく並列計算で命令サイクル数が減らせるわけではないところにあります。計算の中には,本質的に逐次的にしか計算できない部分を含むものが多く,そのような計算にはこの方法が適用しにくくなります。
二つ目の方法は,忙しい時だけ電源電圧を高くし高速かつ高消費エネルギーモードで動作させ,暇なときは電圧を下げて低消費エネルギーモードで動作させる方法です。一般的に,コンピュータの内部は,時間的にも空間的にもその忙しさは均一ではありません。極端に忙しい部分と暇な部分があったり,入力されるデータによって,忙しい時期と暇な時期が生じたりします。設計者は,最も忙しい時にも十分に対応できるように設計するため,電源電圧を固定する従来の方法では,暇な時(実は,忙しい時はめったに無く,ほとんどは暇なのですが)には,必要以上の能力を持ったまま動作することになり,大きなエネルギーの無駄が生じます。そこで,忙しい部分と暇な部分で異なる電圧を使ったり,時間的に電源電圧を変化させて,忙しいときだけ高電圧高エネルギーモードにして,必要最小限のエネルギーで動作させる技術が開発されました。特に,時間的・動的に電源電圧を変化させて,柔軟にエネルギー消費と性能のバランスをとる技術は,可変電源電圧プロセッサと呼ばれ,現在,関連技術の研究開発が盛んに行われています。
図4の例を見てみましょう。2.5ボルト,4ボルト,5ボルトの3種類の電圧が使えるプロセッサで,命令サイクル数1000Mサイクル(10億サイクル)のタスクを25秒以内に計算する場合を考えましょう。最大電圧である5ボルトで計算を行うと,タスクは20秒で終了し,残り5秒は電源をOFFにして休むことにすれば,全体で40ジュールのエネルギーを使うことになります(図4(A))。図4の(B)では,2.5ボルトで計算を始めています。そのままでは25秒で終了できないので,途中から5ボルトモードに切り替えて25秒でちょうど計算を終了するようにしています。この場合のエネルギー消費は32.5ジュールです。(A)に比べて20%程度のエネルギー削減ができます。(C)のように,4ボルトで動かすと,ちょうど25秒で終了し,エネルギー消費は25ジュールまで減らせます。(A)と比べると40%近くエネルギーを節約できることになります。実は,(C)の場合が,電源電圧を制御して達成できるエネルギー消費の最小値であることも証明できます。このように,電源電圧をうまく制御すれば,要求される計算時間の制約を守りながら,必要最低限のエネルギーで計算を行うことができるのです。我々の血圧や脈拍数が,運動時には高くなり,安静時には低くなることと似ています。
それでは,いつ誰がどのようにしてその時点での最適な電源電圧を決めるのでしょうか?プログラムの性質から,忙しい時と暇な時が予測できるような場合には,コンパイラによってプログラムのコンパイル時に電圧の割当を行うことができます。処理要求が外部から入力されるようなシステムで,入力を監視していて,処理要求が溜まってきたら電源電圧を上げ,処理要求が少ないときに電圧を下げるようなシステムがすでに実現されています。一方,電圧の割当が,実行時にしか決められないような場合には,オペレーティングシステムに電圧スケジューリングの機能を付与しなければなりません。あるタスクが予定より早く終了した場合には,時間に余裕ができたわけですから,次のタスクに対する電源電圧を下げて,少し時間をかけて処理することができるわけです。また,機器の温度が高くなったら電圧を下げてエネルギー消費を少なくすることで,空冷用のファンを付けないパソコンも開発されています。
スイッチング回数を減らす手法もいろいろと開発されています。回路の中では,計算に実質的には関係しない信号の流れも多く,このような信号の流れによるスイッチングは無駄なエネルギー消費を生み出します。計算に無関係な回路を動かさないようにするために,回路に供給するクロック(回路の動作を取り仕切る時計のような信号)を部分的に停止する技術が広く利用されています。また,二つの整数の比較において,まず符号だけを比較して,それで結果がわかる場合は,数値部分の比較を行わないような工夫も行われています。
プログラム中に現れる変数は,常に1語(32ビット)全部に情報を載せているわけではありません。例えば,デジタル動画像伝送に使われる符号化であるMPEG2の復号器プログラムの場合,406個の変数が32ビットの整数として定義されていますが,そのうち50個は1ビットの情報しか記憶していません。詳しく調べますと,406個の32ビット変数の情報量は約1万3千ビットほどですが,実際に計算に必要な情報量は4万5千ビット程度なのです。プログラム中の各変数が実質的に必要なビット数を調べて,使わないビットに関しては計算の途中でスイッチングが起こらないように回路を工夫すると,プロセッサとメモリで30%以上のエネルギーが節約できることがわかっています。
負荷容量は,回路の大きさと密接な関係があります。大きな回路は,負荷容量が大きくなりやすく,小さな回路は負荷容量が小さくてすみます。この性質を利用すると,「計算の中で頻繁に利用する回路は小さく作り,めったに利用しない回路は大きくしても良い」という考え方が出てきます。実際の計算においても,プログラム中のある部分は頻繁に実行され,例外処理などめったに実行されない部分もあることが知られています。具体的に,プログラムのうちで実行される回数の多い順に上位1%の部分を取り出すと,そのプログラムの実行の60%から90%の時間がこの取り出された1%の部分で費やされていることが知られています。すなわち,長いプログラムでも,実際に頻繁に実行されているのはほんの一握りの部分で,残りの多くはめったに実行されないことがわかります。このように,計算やプログラムには大きな偏りがあるのです。この計算に内在する偏りを利用して,負荷容量を実質的に削減することができます。
一つの例として,次のような場合を考えましょう。プログラムはメモリに置かれ,実行中は一命令ごとにプロセッサへ送られて実行されます。メモリでのエネルギー消費は読み出し時にそのほとんどが発生します。一方,ビット数の大きなメモリはエネルギー消費も大きく,小さなメモリはエネルギー消費も小さくなります。そこで,プログラムのうち頻繁に実行される部分だけを抜き出して,小型のメモリに入れてやれば,メモリの読み出しに関するエネルギー消費を節約できるはずです。例えば,MPEG2の復号器プログラムの場合,3万命令からなるプログラムのうち,頻繁に実行される1000命令ほどを取り出して小型のメモリに置くと,命令メモリでの消費エネルギーが50%以上削減できることが知られています。
すでに,我が国の総発電量の5%から7%がコンピュータのために消費されていると推測されています。10年後には,総発電量の20%を越えるというような予想もあります。コンピュータは,すでに環境問題にも影響を与えるほどのエネルギー消費の原因となっているのです。2Mバイト程度の電子メールを送るのに必要なエネルギーは,インターネット中の中継をする高性能サーバーの消費エネルギーを考慮すれば,石炭で200ミリグラム程度になるとの試算もあります。
コンピュータといえば,すぐに動作周波数や性能などの比較を頭に浮かべます。しかし,現在のコンピュータ設計の最大の課題は,エネルギー問題なのです。プロセッサチップが溶けてしまわないように,コンピュータの利用者が火傷をしないように,そして与えられたエネルギーを最大限活かしてより多くの計算ができるように,半導体材料,回路,アーキテクチャ,コンパイラ,オペレーティングシステム,応用ソフトウェアとあらゆるレベルの設計者が,この省エネルギー技術に取り組んでいるのです。皆さんも,いろいろな現場でコンピュータのエネルギー問題にいろいろな形で関られることと思いますが,本日の話がその時の一助になれば幸いです。
(本稿は2001年9月26日 京都コンピュータ学院で行った文化講演会の講義をまとめたものである。)