マルチスレッドの効率(1)

最近マルチスレッド化を行ったところ、シングルコアのハイパースレッディング(HT)にもかかわらず、2スレッドより4スレッドの方が速かった。
それより驚いたのは、2コアよりシングルコアのHTのほうが、マルチスレッド化によるスピードアップ率が高かったことだ。

HTについてはおいといて(HT役に立たないという記事が多いのはなにか政治的な圧力でも働いているのか?)、
なんでもいいから論理CPUが2つがあるとして、スレッド数がいくつなのが効率がよいか考える。


スレッドには、まとまった処理(タスク)がいくつかスタックされ、スレッドは一斉にタスクの処理を行う。
全てのスレッドが全てのタスクの処理を終わるのを待つ。
1つのタスクを1つのCPUが処理すると1単位時間かかる。
2つのタスクを2つのCPUが処理すると1単位時間かかる。
3つのタスクを2つのCPUが処理すると1.5単位時間かかる。
例えば、2つのスレッドにそれぞれ4つのタスクと2つのタスクがスタックされているとすると、まず2つずつのタスクが処理するのに2かかり、残りの片方の2つのタスクを処理するのに2かかるので、合計4かかる。
4つのスレッドにそれぞれ、2,2,1,1タスクがスタックされているとすると、まず1つずつのタスクを処理するのに2かかり、残りの1つずつを処理するのに1かかるので、合計3かかる。


このように、スレッドのオーバーヘッドを無視した理想的な条件の下ではスレッド数が多いほうが効率がよいことがうかがえる。
次回以降は、具体的にどの程度の効率なのかを計算する。