以前
AMDとIntelはなぜデュアルコア化を急ぐのか?
http://blogs.users.gr.jp/naka/archive/2004/11/05/5876.aspx
という記事を書いた。
マルチCPUの時代にはマルチCPUを前提としたプログラムがある。それがスレッディングプログラム。
まずは以下の図を見てほしい。

上から順番に
- モデルケース
- 1CPU1多重
- 1CPU2多重
- 1CPU4多重
- 2CPU2多重
- 2CPU4多重
となっている。
この例ではモデル処理として9秒掛かる処理を4回することを想定している。
単純に計算すると36秒かかる処理だ。
IO処理は同時に動くことができないから、多重度を上げてもIO待ちで処理は頭打ちになるというのが、1CPU2多重から4多重にした場合の説明だ。
2CPUの場合CPU能力的に倍になっているのだが、多重度が1だと1CPUの場合となんら変わらない。
正し多重度を2にするだけで複数のCPUを効率よく使うようになる。
スレッドはどのCPUに所属するか固定化されるためである。
また、このモデルの場合には2CPUで4多重にしても2秒しか縮まっていないことがわかる。
CPUの個数以上に多重化することは無駄とはいわないが(このモデルが正しい保証もないし)最低でもCPUの個数と同じだけの多重化を果たすと非常に効率よく動作することがわかる。
.Netの場合にはスレッドを簡単に利用できるようになっているので是非マルチスレッドを意識してプログラミングしてほしい。