今更だけど、ハイパースレッディングとは

どうも、最近、久しぶりにWindowsアプリを作っている東京Kです。

昔は、「C言語はいいねぇ」と言いながら

__asm {
  PXOR MM1,MM1
   :
}

といったコードを書いていた人だったりしますσ(-_-;;;)

そんな私に、最近「ハイパースレッディング(HTT)は意味があるかわからない所詮コアは1つでしょ?」という話を振られたので、せっかくだからブログネタに。

結論から言うと「HTTはオンにすると普通は性能は上がるが、特定条件下では性能が落ちることもあるので、場合によってはOFFにしてもいいかも」です。

なお、本題に行く前に断っておきますが、この記事も「なんとなく仕組みを知ることができればいい」で書いていますので、細かいところは抜きにしています。

HTTの概要

放課後ティータイムHyper Threading Temporaryという、IntelのCPUに搭載されている機能です。。

端的に言うと、1コアを見かけ上2コアに見せかける技術です。

もう少し詳しく説明すると、コンピューターの中心にある演算装置としてCPUがありますが、昔のCPUはある一瞬において1つの計算しかできませんでした。
そこで、複数のCPUをコンピューターに搭載したら性能が上がる!(マルチCPU)という発想が生まれ、その後、1つのCPUに複数のCPUを封入したらいいよね!(マルチコア)という考えが生まれました。この封入されたCPUをコアと呼びます。

で、HTTはこのコアを見かけ上2つにして、2つの命令を1つのコアで無理矢理実行しようという機能です。

(まぁ、実際には、HTTの登場前に、スーパースカラとか、OoOとかの技術があり、それによって、1コアでも一度に2つの命令は実行する場合もあるので、HTTでは一度に4つとかの命令をこなせるわけですが、話がややこしくなるので割愛。)

なので、「見かけ上2コアになっているけど、実態は1コアなので1コアの性能しか出せないはず」というのが、冒頭で私に話題を振った方の認識となります。

・・・ところが、CPUのコアはそんな単純なものではありません。

HTTの仕組み

CPUのコアは最終的には電気回路(=ユニット)ですが、「整数演算をするユニット」とか「実数計算をするユニット」、「データをメモリーからとってくるユニット」といった形で、それぞれの担当分野ごとに何種類ものユニットの集合体です。

そのため、整数計算をしている間は、実数演算ユニットは暇だったりします。

であれば、空いているユニットを有効活用しよう!ということで生まれたのがHTTです。

HTTにより、見かけ上は2コアとなり2つの処理が同時進行します。そして一方が整数演算ばかりするプログラム、一方が実数演算ばかりするプログラムが動けば、それぞれCPUの別の空きユニットが処理をするので、CPUが暇をしているユニットが減り、性能がアップするというのが、HTTの基本的な考え方です。

HTTはオンの方がいいか?

一般のユーザーならばオンにしておいて損はないはずです。普通のパソコンを使っていると、多種多様なプログラムがバックグラウンドで動きますので。

万が一整数演算しかしていない場合でも、現行のCPUは1コアあたり、整数演算ユニットなどのよく使われるユニットを複数搭載しているので、ユニットの奪い合いがおきることなく、性能向上します。

ただ、オンが必ずしも良いとは限りません。

例えば、CPU内部のキャッシュメモリー(L1キャッシュ)は物理コアごとに存在しています。そのため、1物理コア内の仮想コアがそれぞれ別の領域のメモリーに大量にアクセスするようなことがあると、キャッシュヒット率が低下して性能が落ちる場合があり得ます。
(元々、CPUのコアの持つキャッシュは、「一度アクセスした主メモリーの情報とその周辺の情報は、短時間で再度アクセスされることが多いので、超高速なメモリーに一時的に置いておこう」という考えで存在している高速化の機能。しかし、超高速なメモリーは超高価で少ししか用意できないので、広い範囲のデータをキャッシュに保持することはできず、キャッシュがあふれれば古い情報から破棄される)

このように、特定の条件下での性能低下はあり得るので、安定性を重視したければ、オフにする選択肢は視野に入れると良いでしょう。