デュアルコアCPU、マルチスレッドプログラミング

ハイパースレッディング、マルチコアによる並列処理とマルチスレッド処理の可能性

CPUは、コードを読み込んで演算などの処理を行います。従来のCPUは、コードを一つずつ読み込んで一つずつ処理していましたが、最近は同時に2つ以上のコードを同時(並列的)に処理するCPUが普及してきています。
そのCPUで使われている技術が、実際にコードを実行する演算ユニットやレジスタなどは一つしか持たないものの、コードの解析・取り込みなどを複数のラインで行えるようにするハイパースレッディング(HT)、そして一つのCPUのパッケージの中に複数のCPU相当の機能を盛り込んだマルチコアCPUです。特に今年(2005年)は、インテルとAMDが相次いで一般向けマルチコア(CPU2つ分相当のデュアルコア)CPUを発売することから、本格的なマルチコアCPU時代の幕開けになるかもしれません。

ただし、CPUが「同時に複数のコードを処理できる」としても、ソフトの方がその機能を利用しなければ無意味です。
例えば、計算問題を100題解く場合を考えてみましょう。これまでのソフトウエアの多くは、この種の計算問題を「順番に一つずつ一人(1つの処理の流れ−スレッド)で」解いていました。これは、CPUの多くが同時に複数の計算を実行できない環境でしたから、当然といえば当然ですね。複数の計算を「同時に」やろうとしても、それを実現するハードがなかったわけで。このようなソフトウエアのプログラムをシングルスレッドのプログラムといいます。
このようなプログラムは、他に計算ができる仲間がいてもその仲間を無視してひたすら一人で計算を繰り返すようなものですから、「複数の計算を同時に処理可能」というハイパースレッディング対応CPUやマルチコアCPUの利点を活かすことはできません。

これに対し、ソフトウエアの方で計算処理を複数の人(スレッド)で「分担」するようプログラムすることもできます。例えば、1-50番の計算はスレッド1で、51-100番の計算はスレッド2で行うようにするのです。こうすれば、もし計算可能な人が2人いれば、一人で100題解くのに比べ2倍の効率(一人50題解けば良い)で計算問題を処理することができますね。そして、デュアルコアCPUは、この「計算する人」を2人持っているようなCPUなのです(ハイパースレッディングは、計算する人は一人だけど、他にいろいろお手伝いしてくれる助手が一人付く感じ)。
このように、処理の内容を複数のスレッドに分けるソフトウエアのプログラムはマルチスレッドのプログラムといいます。

つまり、マルチコア・ハイパースレッディング環境でその特長を活かして効率よく処理を行いたければ、ソフトウエアの方も「同時に複数の処理を行う」ようにする必要がある、ということです。まあ、実際にはソフトウエアを管理するOS自体が「同時に複数の処理」を行う仕組みになっていることが多いので、そのようなOSでシングルスレッドのプログラムを動かす場合でもハイパースレッディングやマルチコアCPUは有効(「重い」ソフトを動かしても、他のプログラムへの影響が少なくなったり、GUIの反応が良くなる)なんですけどね。

戻る