1. なぜプロセサはマルチコアになったのか

ちょっと古い方は、2000年頃まではシングルコアであったが、世代ごとにプロセサのクロックが上がり、キャッシュの増加やOut-of-Order実行などの採用でプロセサの性能がぐんぐん上がってきたことをご記憶であろう。この時代は、昔作ったプログラムそのままでも、プロセサハードウェアの進歩で実行時間が短くなっていくという素晴らしい時代であった。

それが、現在ではマルチコアが主流で、サーバ用プロセサでは8コアを超えるマルチコアプロセサが販売されている。ということで、なぜ、シングルコアを止めてマルチコアに移行することになったのか?、マルチコアで性能が上がるのか?、マルチコアを実現するのに必要なマイクロアーキテクチャにはどのようなものがあるのかを見ていこうと思う。

マルチコア化の最大の問題は、古いプログラムが自動的に実行時間が短くなるわけではなく、マルチコアを使いこなすようにプログラムを変える必要があるという点である。科学者の中には、「プログラムを作るのは本来の研究ではない。引き続き、プロセサのクロックを上げて高速化して欲しい」という方もおられるが、後に述べるように、残念ながら、もう、これは出来ない相談である。

そして、業界はシングルコアのプロセサの性能を上げるよりも、1チップに搭載するプロセサコア数を増やすことでチップあたりの性能を改善するという方向に舵を切った。サーバやハイエンドPCのプロセサはもちろん、最近ではスマホのプロセサも4コアというものが出てきており、マルチコアでないプロセサの方が珍しいという感じになってきている。

図1.1 4+1コアを採用したNVIDIAのスマホ向けTegra3チップの構成。中央の4個が高性能コア。その上のCompanionコアは省電力用コア(出典:NVIDIAのTegra White Paper)

なぜ、このようなことになってきたのであろうか?

シングルコア性能の飽和

初期のコンピュータは、1つの命令を読み、それを解釈(デコード)し、命令が指示する演算などを実行して、結果をメモリに格納するという動作を順に実行し、一連の動作が終わると、次の命令を読むという図1.2の上側の図のような動きをしていた。

図1.2 順次実行(上)とパイプライン実行(下)

パイプライン処理では、これを図1.2の下側の図のように、これらの一連の処理を流れ作業的に実行する。第1の命令を読み、次のサイクルに命令を解釈するのは同じであるが、第1の命令の解釈と並行して第2の命令を読む。その次のサイクルでは、第1の命令の実行、第2の命令の解釈、第3の命令の読み込みを並列に実行する。

命令読み込みハードウェア、命令解釈ハードウェア、データ読み込みハードウェア、演算ハードウェア、結果格納ハードウェアがベルトコンベアに沿って並んでおり、ベルトコンベアで命令が流れていくうちに命令の処理が終わるというイメージである。このようにすれば、理想的には1サイクルに1命令を実行できるようになり、順次実行に比べて性能は数倍に向上する。

パイプライン処理の場合、例えば、命令の解釈の途中で、次の命令が読まれて、サイクルの途中で解釈すべき命令が変わってしまっては困るので、それぞれの処理ステージの入力データを記憶しておくレジスタが必要になるなど、順次処理の場合より多くのハードウェアを必要とする。しかし、このハードウェア量の増加は倍増というほどの大きな追加ではなかった。また、演算器も1サイクルに1ビットずつの処理から、複数ビット、あるいは1ワード全体を1サイクルで演算する構成が採られるようになり、ある程度のハードウェアの追加で大きく演算性能を大きく改善することができた。このような効率的な性能改善により、1960年代後半には、性能は値段(≈トランジスタ数)の2乗に比例するという「グロッシュの法則」が成り立っていた。

その後、キャッシュの採用や複数命令を1サイクルに実行するスーパスカラ方式、前の命令の結果に依存しない命令は先にやってしまうOut-of-Order実行、分岐予測と投機実行などのマイクロアーキテクチャの改善により、1サイクルに実行できる平均命令数は増加していった。しかし、これらの複雑な機構を実現するには多くのトランジスタを必要とする。

1999年のMicro32という学会の基調講演において、IntelのFred Pollack氏は、テクノロジの違いを補正したチップ面積を2~3倍(トランジスタ数も同比率で増加)にしても性能は1.5~1.7倍にしかならず、「2乗則の反対側(Wrong Side of Square Law)にいる」と述べた。この、性能はトランジスタ数の1/2乗に比例するという関係「はPollackの法則」と呼ばれる。

図1.3 面積が2~3倍で性能は1.5~1.7倍(出典:Micro32でのPollack氏の発表資料)

これは1960年代と1990年代の間のどこかで2乗から1/2乗と傾向が急変したという訳では無く、必要なトランジスタ数にくらべて性能改善の度合いが大きい機構から早い時期に採用されていくので、時代が下がるにつれて改善の度合いが下がって行ったということであろう。

マイクロアーキテクチャの改良は現在も続けられており、今後も、良いアイデアが出て、少ないトランジスタの追加で大きく性能が上がるということが絶対に無いとは言えないが、全体的なトレンドとしては、注ぎ込むトランジスタ数の割には、性能向上は減り、1つのプロセサの性能向上は飽和する傾向にあると思われる。

トランジスタ数はムーアの法則で増えてきたので、1990年代には、どんどんトランジスタを注ぎ込んで性能を上げるという考えであったが、2000年代に入ると、次に述べる消費電力の制約からプロセサコアの複雑化には急ブレーキがかかった。