ハイパースレッディング(一般用語で言うとチップレベル・マルチスレッディング)は、そんなにコストがかからない割にはそれなりのパフォーマンス(スループット)向上効果はありますし、メモリのレイテンシが大きくなればなるほど効果が高くなるので、やらない手はないと思うのですけどね。まあ、いろいろと内部設計上の事情があるのでしょう。
栗原潔のテクノロジー時評Ver2
細かい話をすればいろいろあるが、実際は
ハイパースレッディングは無い方が有利(高速)でしょう(w
意外に思われるかもしれませんが、理由があります。
ただし、そんなCPU屋の理由よりも、ソフトウェア屋としての理由の方が個人的には深刻ですが(w
2つあって、1つは、CPU効率の話で、プロセッサ的にはHTは無いほうが有利という考え方がある。もう1つはプログラマ的な視点からも無いほうが安くプログラムが作れる。(w
まず、CPU的な話ですが、ハイパースレッディングというのは、
CPUのあいている場所をうまく使うことで、擬似的に利用効率を上げましょう。という技術。
そうなんです、言い換えれば、
無駄が多いプロセッサなので、無駄な部分を救済しましょうって考え方なんです。限界までCPUの内部構造がチューニングされていて、無駄がまったく無い、構造だとハイパースレッドが入る余裕なんて無いですよ(w
まぁ、実際は、パイプラインだ、予測だ、予測失敗のペナルティだといろいろ話はありますが・・・
初心者にもわかりやすく言うと、Intelのプロセッサは、AMDのプロセッサと比べて1クロックあたりの処理能力が当初より低いというのが問題になっていました。
ここらへんは、実際の処理能力が低くても表示上のクロック数2Gとか3Gとかが、高いほうが売れるということで、
1クロックあたりの、処理能力を下げても、クロック数を上げるという構造にしたんですね・・・Intelさんが。
なので、クロック数が低いAMDの方がIntelよりも処理能力が高いという逆転現象が起きていました。
さて、ここでかんがえてもらえれば、AMDと比べてIntelの方がCPU的に無駄な部分が多いということが、なんとなくわかってもらえますか?
AMDの方は限界までチューンしてあって、1クロックを限界まで使ってる。Intelの方はスカスカで1クロックの処理に空きがある
どっちのアプローチが正しいか?というのは、いろいろ議論がありますが、現象としては、ハイパースレッディングというのは、この空きを使った、物であり、言い方としては、
無駄をなくして元に戻す機能ということなんです。だから、必ずしも入れた方が速いとは限りません。
Intelがハイパースレッディングをやめるというのも妥当な話で、確かに処理能力だけを追い求めるなら、無駄を作って、そこをハイパースレッディングで埋めるという考え方もありますが、この無駄な部分も電気を消費しますので、電力効率が悪く=熱効率が悪く、設計が複雑になり=設計経費がかさむ。という問題がありパソコンには適さない技術ということになります。
つぎに、プログラマ的にハイパースレッディングがうれしくない理由があります。実は、ハイパースレッディングによるマルチスレッドは、マルチCPUによるマルチスレッドと比べて
デバッグがしずらいんです・・・
上記のように、CPUの開いた領域を無理やり使ってスレッド化していますので、実際に走行しているプログラムが予測に反した動きをしやすいのですT_T。
まぁ、プログラマのバグって言えば、バグなんですがね・・・バグってのはどうしても入ってしまうもので、いかに、それを取りやすいか?ってのは重要な要素です。
そんなときに、予測に反した動きをしていると、デバッグ効率は悪いです。とくに、最悪なので、
マルチCPUの場合はレジスタという装置が独立していますが、
ハイパースレッドの場合は、レジスタをある程度共有しているため、いままででは考えられなかったタイミングでレジスタの値が切り替わっていたりします。えぇ、泣きます。
昔、ハイパースレッディングの登場間もないころ、マルチCPUで動いていたプログラムがハイパースレッディングで動きませーん。なんて事件が多少ありましたが、全部ここらへんに起因してます。
とにかく、プログラマとしては、マルチCPUよりも、よっぽどハイパースレッディングの方が気を使います・・・
そんなわけで、パソコンという風に限定すれば、CPUの設計面からしても、プログラムの設計者からしても、ハイパースレッディングなんて無い方がうれしいわけですよ・・・
結論:
ハイパースレッディングを入れる余裕(無駄)があるならば、その分の余裕(無駄)をなくして、単純な処理能力を上げたほうがよい
ただし、発熱などに制限があるパソコンを基準とする
まぁ、あれば使いますが、ハイパースレッディングで速度を稼ぐくらいなら、その分の無駄をなくして、クロックあたりの処理能力を向上させてくれと(w
変な話ですが、こういうのはどんなプログラムを書くかというのにも大きく影響するのですが、パイプラインが当たりまくる=条件分岐が少ない=ユーザからの入力が少ないものほど、パイプラインを深くする=ハイパースレッディング有利ってなるわけですが・・・
現実のプログラムときたら、ifの嵐っていうか、ユーザ入力と、タイマ入力と、ネットワークからの入力と・・・って、やたら、変数が多くパイプラインはずしまくることが、もう、当たり前って感じなのです。(はずすのに、あたりとはこれいかに?)
ついでに、昨今流行のWeb系は、メモリアクセスしまくり、で、マルチスレッドにしても、そのほとんどのスレッドがメモリアクセスでウェイト状態っていう洒落にならん構造なんで・・・
パイプラインはなるべく浅くして、その分、消費電力を下げてくだちい・・・そしてデバッグしやすいように、レジスタをあまり汚染しないでくだちい・・・なんで、ハイパースレッディングよりかは、簡素なコアを複数つんでくだちいって感じです。ちぃ。
CPU屋さんは、パソコン用の場合はアプリを組むソフトウェア屋さんのことを考えて、CPUを作ってくれるとうれしいと思います。ちぃ。
※クロックあたりの処理能力という表現は必ずしも正しくありません。現在は、パイプラインなどの速度向上機能があり、1クロックあたりに何個の命令が実行されるかというのが厳密に表現しにくいからです。しかし、今回は説明のわかりやすさから、この表現を採用しました。