はじめに
今回は最近話題になっているマルチコアからメニイコアまでの話を私なりの解釈でまとめてみました。私はソフトウェア方面の知識しかないので、かなーり怪しい内容ですが、空想半分の話ということで読んでいただければと思います。というわけで、マジ突っ込みはナシでお願いします。
最近のトレンド
最近のパソコン向け CPU のトレンドでは、搭載するコア数を増やす方向に向かっています。Intel と AMD 共にすでにデュアルコアの CPU を製品投入しており、今秋には Intel が先行してクアッドコアの CPU を製品投入する予定であり、来年には AMD もクアッドコアの CPU を製品投入するといわれています。また、先日の Intel Developer Forum(IDF) では、80コアの CPU を搭載した試作品を公開したそうで、今後ますますマルチコア化が進んでいくのかもしれません。
現在のマルチコア製品
現在の発売されているマルチコア製品は、同一設計のコアを複数搭載するもので、ソフトウェアから見れば従来のマルチプロセッサと概ね同様に見えるという利点があります。複数のスレッドを駆使して動作するようなアプリケーションであれば、従来のソフトウェアでも速度の向上が見込めます。主に同じようなオペレーションを大量に繰り返す、画像処理、映像処理、音声処理などのソフトウェアで恩恵を得られます。しかし、逆に見ればこのような特殊なソフトウェアでなければ、マルチコアの恩恵を受けにくいという現実もあります。
一般的なソフトウェアは、ある程度スレッドを用いているものでもメインで実行する大きな処理のスレッドは1つないし2つ程度であることが多いようです。特にユーザーの入力を契機として動作するワープロ、表計算などのソフトウェアにはこの傾向が強いのではないでしょうか。こういったソフトウェアではコア数を増やしたとしても、処理速度の向上は望めません。今後のソフトウェアの改良でスレッド化が進めば多少の効果はあるかもしれませんが、デュアルコアからクアッドコアになったとしても、体感できる高速化とはならないでしょう。
恩恵を受けるとすれば「ながら」で使う場合でしょうか。「DVDを再生しながら、ワープロソフトを使い、裏ではウィルススキャンソフトウェアが動作する」といったような場合です。常に別スレッド/プロセスで何かを実行する、という状況下でならばある程度恩恵を得ることができます。とはいえ、前述の80コアを使い切るということは実際には難しいのではないでしょうか。
OS からマルチコアへのアプローチ
Microsoft は Windows Vista において、マルチコア時代に最適化した OS のあり方というものをある程度検討しているように見えます。I/Oの優先度を設定できるようにした上で、メインの処理を邪魔することなく、多数の処理を平行して動作させるようにしているのも、マルチコア時代を見据えてのことでしょう。コアが複数あり、メイン処理を実行している裏でヘルパー的なタスクを OS が実行したとしても、目に見える影響は軽微に抑えることができるわけです。そして、その実行するタスクは、ハードディスクの最適化だったり、ファイルのインデックス作成だったりします。ハードディスクの最適化はシステム全体の安定的なパフォーマンス維持に効果をもたらしますし、ファイルのインデックス作成はファイルの検索を行う際のパフォーマンスを劇的に向上させるという効果をもたらします。そして、これらの恩恵を受けるためにユーザーがシステムに対して意識する必要がないということになります。
このように、従来はソフトウェアはユーザーの指示を待ち、指示されたタスクを高速に実行するということがメインでしたが、マルチコア時代ではユーザーがするであろうことを先回りして処理を済ませておくという方向で、マルチコアの性能を活用することになるのかもしれません。
非対称マルチプロセッサ
しかし、このような使い方になるとメイン処理とヘルパー処理で同じ処理速度を持つコアが必要ではないのではないか、ということになってきます。それが非対称マルチコアプロセッサの発想でしょう。現在は同一のプロセッサを複数搭載する、対称マルチコアプロセッサで、OS もコア対称であるということを前提にスケジューリングを行っています(AMD Opteron によるマルチプロセッサ環境ではメモリや I/O への距離が対称ではない ccNUMA という構成になりますが、ここではまとめて考えてしまいます)。これを、メインの処理は A コア、サブは B コア、その他のヘルパー処理は C 〜 Z コアに割り当てる、というようなスケジューリングに変更するわけです。これにより各コアが全て同一スペックである必要がなくなります。
ただ、これだけでは性能向上に限界があります。各コアがアクセスするメモリの帯域や、各プロセッサが処理する際の同期にかかる処理コストの問題です。
メニイコアにはローカルメモリがセット
これらの問題を解決するために、ソニーコンピュータエンタテインメント、東芝、IBM が共同開発した Cell というプロセッサでは、メイン処理を行うコアの配下にあるサブ処理用のコア(というのが適切であるかどうかはわかりませんが、このように表現します)には、独立した専用のメモリを設けています。このメモリは完全に独立しており、同期の必要はないメモリです。ただし、このようなローカルメモリを持つ設計では、ソフトウェアもそれを意識していなければならず、従来のソフトウェアを高速に動かすという路線からは外れることになります。前述の Intel が試作した80コアのプロセッサも Cell と同様にコアごとに独立したメモリを持っているとのことで、同じようなアーキテクチャなのかもしれません。これらはソフトウェアの互換性を問題にしなければこのように思い切った構成にすることもできるということを示す例であるといえます。
ではパソコン用のコアはどうなのでしょうか。
互換性をばっさりと捨ててしまって新たにパソコンを定義しなおすということは可能なのでしょうか。おそらくそれは難しいでしょう。そこで、これらの非対称マルチコアプロセッサおよび将来登場するであろうローカルメモリを持ったメニイコアプロセッサでは、仮想化というものがキーワードになってきそうです。
メニイコアを仮想ソフトウェアでラップし、各種コアに分離可能なレベルでそれぞれ投機実行をさせ、コンフリクトした処理を捨ててしまうようなアーキテクチャを作ることは論理的には可能でしょう。仮想化された環境のため、互換性を維持することもできます。反面、せっかく処理した結果を捨てることになり、無駄な演算による消費電力=熱の発生や、パフォーマンスの低下、要求するメモリ帯域の増加などの問題があるわけで、これらもどうにかしないといけなくなってきます。
まとめ
個人的にはほどほどの性能のコアを必要に応じて数個程度用意し、あとは特定用途向けのコアを数個搭載するだけでいいんじゃないかと思っています(具体的には CPU コア4程度に、GPU兼物理プロセッサ2つとか)。メニイコアなど必要ないんじゃないかと。単純に並列して実行できる処理を増やし続けても、常にその処理能力を満たすだけのタスクを発生することはないように思うのです。それよりは理論値によるピーク処理速度が下がることがあっても、ほどほどのコアを数個載せて、ほどほどの専用コアをこれまた数個載せた方が平均速度は案外速いんじゃないかと。そんな風に考えています。
Intel や AMD がメニイコアを目指して走るのは、自身が付加価値あるのプロセッサを設計して売り続ける経営モデルに沿っているからであり、それに全ユーザーが追従する必要はないのではないかとも考えています。
結局、ソフトウェアを高確率で並列実行させるという魔法を誰かが生み出さない限り、単一スレッド指向の高速化の方が理論値ではなく結果として得られる性能に寄与する気がしてなりません(並列で 70% の理論性能値のアップ、単一スレッドが一律 30% の性能アップでは、後者の方が結果として得られる性能が高いのではないかという推定もあるのではないかということです)。
以上のように、ソフトウェアしか知らない私は空想してみたりしているわけですが、実際はどうなるのでしょうか? 今から楽しみです。