2. マルチコアプロセサの出現

ダイナミック電力も漏れ電流によるリーク電力もおおむねトランジスタ数に比例して増加する。前に述べたように、トランジスタの増加に対する性能改善効果は飽和してきており、トランジスタを多く必要とするアーキテクチャの複雑化は、電力が増える割には性能の改善が小さく効率が悪くなってきた。このため、プロセサコアを複雑化するより、その分のトランジスタでプロセサコアを複数個作ってしまおうという方向になってきた。

Pollackの法則で、性能がトランジスタ数の平方根に比例すると考えると、4倍のトランジスタを使って、やっと2倍の性能である。同数のトランジスタを使って、以前と同じ複雑度のプロセサコアを4個作れば、最大では性能は4倍になり、こちらの方が性能/電力比が良い。これが、業界揃ってマルチコアに舵を切った理由である。

このように言うと、プロセサコアの進歩は止まってしまったという印象を持たれるかも知れないが、現在でもマイクロアーキテクチャの進歩は続いており、コアの性能向上やマルチメディア処理や暗号化などの新たな用途に対応する命令の追加が行われている。しかし、クロックや1サイクルに実行できる命令数という点では、2005年ころまでの進歩のペースからは大きくスローダウンし、コア数の増加と、ビデオ処理などの専用回路の組み込みで性能を上げるという方向に移っているという状況になっている。

マルチコアをどう使うのか?

コンピュータの中では、それぞれの処理はプロセス(あるいはスレッド)という単位で実行される。プロセスは命令とデータ、それらを置くメモリ空間を持っている。Windowsで言えば、それぞれのウインドウでは別個のプロセスが動いており、図2.1に見られるように、この原稿を書いているMS Wordやバックブラウンドのメディアプレーヤなどが動いている。また、Windowsのログオンアプリなどのシステムプロセスやカメラモニタなどの待ち受けプロセスも、起動条件が整えば動作できる状態にある。ただし、大部分のプロセスのCPU欄は0になっており、これらのプロセスは起動待ちの状態で、CPU時間を使っていない。そして、この例では、Windowsのタスクマネージャが1%、メディアプレーヤのオーディオ再生が4%のCPU時間を使って動いているという状態である。

図2.1 Windowsのタスクマネージャによるコンピュータ上で動いているプロセスの表示例

OSは、これらのプロセスの中の実行条件が整ったプロセスを選択して、空いているプロセサコア(あるいはハードウェアスレッド)に実行させる。それぞれのプロセスは、図2.1に見られるように、メモリ領域を持ち、そこに命令やデータが格納されているので、実行を開始する命令の番地にジャンプすれば、そのプロセスの実行を開始することができる。

このように、OSは、実行すべきプロセスを次々と空いているコアに割り当てて行くので、マルチコアを有効に利用することができる。

短時間で終わるプロセスが多数ある場合は、このように次々と空きコアに実行可能になったプロセスを割り当てて行けば良いが、科学技術計算のように1つのプロセスが長時間実行されるようなケースでは、そのプロセスを割り当てられたコアは100%稼働するが、その他のコアは、実行するプロセスが無くて遊んでしまい、マルチコアが有効に活きないということが起こる。

例えば、

Do i=1、64384
  C(i)=A(i)*B(i)
End do

というプログラムでは、iを順次増やしながらA(i)*B(i)を64K回計算する。これを1つのプロセスとして実行すると長時間を要するが、プロセス0はi=1,8192、プロセス1はi=8193,16384のように、プロセスnはi=8192*n+1、8192*(n+1)の範囲の繰り返しを実行するというように8個のプロセスに分割し、メインのプロセスからこれらの8個のプロセスを呼び出して実行すれば、2コアのシステムなら各コアが4プロセス、4コアなら各コアが2プロセスずつ実行することになり、コア数に比例した性能向上が得られる。これは簡単な例であるが、並列に実行できるように計算法(アルゴリズム)やプログラムを変更することが、マルチコアプロセサを効率的に使用するためには必須となる。

なお、ソフトウェア的には、プロセスはそれぞれ自分のメモリ空間を持って動作するが、親のプロセスのメモリ空間を共用して動作する子プロセスはスレッドと呼ばれる。しかし、ハードウェア的にはプロセスもスレッドも独立の命令列を実行するという点では同じである。一方、ハードウェアでマルチスレッド(Intelの用語ではHyperThread)という場合は、物理的には1つのプロセサコアを、ハードウェアの切り替え機構によって時分割で複数の命令列を並列に実行することを指す。このハードウェアのスレッドは、ソフトウェアから見るとプロセサコアと同じであり、ソフトウェアでいうプロセスでもスレッドでも実行することができる。