goodgames
13-04
最終更新:
goodgames
-
view
HyperThreading 1
Intel製CPUに搭載された謎の機能HyperThreadingのお話。
発端
理由は至極単純で「測定しやすいから」に他なりません。
HyperThreadingが有効な環境では、
タスクマネージャやパフォーマンスモニタなどのCPU負荷測定ツールの表示が約50%になると、
実質的にCPU負荷はほぼ100%に達していることを意味します。
タスクマネージャやパフォーマンスモニタなどのCPU負荷測定ツールの表示が約50%になると、
実質的にCPU負荷はほぼ100%に達していることを意味します。
しかし、表示が50%で本当の負荷が100%であるなら、
表示が60%や70%になった場合はどのような状態なのか?
CPU負荷120%や140%と解釈すべきなのか?
表示が60%や70%になった場合はどのような状態なのか?
CPU負荷120%や140%と解釈すべきなのか?
もちろんNoなのですが、このあたりの解釈が非常に厄介なので、
業務でも性能測定の実施中などは可能な限りHyperThreadingを無効にしています。
業務でも性能測定の実施中などは可能な限りHyperThreadingを無効にしています。
そもそもHyperThreadingとは?
こちら(注、大音量の動画が再生されます)をご覧下さい。
これでは何もわかりませんね。(苦笑)
これでは何もわかりませんね。(苦笑)
(ここで絵を描いて説明してみようかと試みたものの、
私の能力では莫大な時間を費やす必要があることが判明し断念)
私の能力では莫大な時間を費やす必要があることが判明し断念)
■絵は描けなかったので文章(しかも半箇条書きで説明
・CPUは1つのコアの中だけでも様々な目的の回路が実装されています
・最も良く使われるのは整数演算回路
文字通り、1 + 1 = 2など整数の計算を行う機能です。
文字通り、1 + 1 = 2など整数の計算を行う機能です。
・次に良く使われるのは浮動小数点演算回路
「浮動」などと言われると少々難しく感じますが、
単純に少数を使った計算をするための回路だと思えば正解です。
つまり、1.1 + 1.1 = 2.2などの計算に使われます。
「浮動」などと言われると少々難しく感じますが、
単純に少数を使った計算をするための回路だと思えば正解です。
つまり、1.1 + 1.1 = 2.2などの計算に使われます。
・その他にも色々と目的別に様々な回路が実装されています
例えば、ゲームや動画再生に使われるSSE2/AVX2などのマルチメディア用機能など。
例えば、ゲームや動画再生に使われるSSE2/AVX2などのマルチメディア用機能など。
・これらの回路は本来、同時に稼働するものではありません
CPUが命令(プログラム)を実行する毎に必要な回路を選択し、
そのうちの一つを使用して命令を実行し結果を得ます。
CPUが命令(プログラム)を実行する毎に必要な回路を選択し、
そのうちの一つを使用して命令を実行し結果を得ます。
・つまり整数の計算をしている間は小数点用の回路やマルチメディア系の回路は動いていません
もったいないですね。
もったいないですね。
・そこでHyperThreadingの出番です
プログラムは「スレッド」と呼ばれる命令の集合体を一つの単位として実装されます。
単純なプログラムはシングルスレッドと呼ばれ、一つのプログラムに一つのスレッドしかありません。
プログラムは「スレッド」と呼ばれる命令の集合体を一つの単位として実装されます。
単純なプログラムはシングルスレッドと呼ばれ、一つのプログラムに一つのスレッドしかありません。
しかし、複数のプログラム(プロセス)が同時に実行されているケースや、
多数のスレッドが同時に稼働するよう設計された「マルチスレッド」のプログラムが実行されている場合、
余っている回路を使って同時に処理するための技術がHyperThreadingTechnologyです。
多数のスレッドが同時に稼働するよう設計された「マルチスレッド」のプログラムが実行されている場合、
余っている回路を使って同時に処理するための技術がHyperThreadingTechnologyです。
・しかし余っている回路しか使えません
つまり整数の計算を同時に実行することは出来ません。また小数点を含む計算も同時には行えません。
偶然、別々の回路を用いる命令が同時に実行されるような場合だけ、
2つの命令が同時に実行可能です。
つまり整数の計算を同時に実行することは出来ません。また小数点を含む計算も同時には行えません。
偶然、別々の回路を用いる命令が同時に実行されるような場合だけ、
2つの命令が同時に実行可能です。
・しかもほとんどの命令は整数演算だったりします
これはあくまでも一般論ですが、OSや業務用プログラムなど
一般的な文字、記号や単純な絵を使用する程度のプログラムは、
そのほとんどが整数系の命令で構成されています。
これはあくまでも一般論ですが、OSや業務用プログラムなど
一般的な文字、記号や単純な絵を使用する程度のプログラムは、
そのほとんどが整数系の命令で構成されています。
最近のデータではありませんが、命令の99%以上は整数系と言われていました。
例えば、ファイルのコピーを行うために小数点を用いた計算が必要になるケースは全く思いつきません...
例えば、ファイルのコピーを行うために小数点を用いた計算が必要になるケースは全く思いつきません...
WebBrowserについてもHTMLをレンダリングするためにはほとんどは整数で事足ります。
(但し、最近のブラウザはDirectXを使用してまでレンダリングを高速化しているため、
浮動小数点演算も多用されているかもしれません)
(但し、最近のブラウザはDirectXを使用してまでレンダリングを高速化しているため、
浮動小数点演算も多用されているかもしれません)
また、浮動小数点演算は非常に実行コスト(処理時間)が大きくなるため、
プログラマが意図的に整数演算で済ませようとする傾向があります。(これは妥当)
プログラマが意図的に整数演算で済ませようとする傾向があります。(これは妥当)
例えば、前述の1+1=2と1.1+1.1=2.2を比較すると、後者の方が約4倍の処理時間を要します。
(Intel Haswellアーキテクチャにて64bit整数と64bit浮動小数点演算を想定)
(Intel Haswellアーキテクチャにて64bit整数と64bit浮動小数点演算を想定)
しかもこれは計算処理のみを比較していますが、計算するための値をメモリからCPUへ転送したり、
計算結果をメモリへ書き戻したりするための時間も浮動小数点の方が時間を要する傾向があります。
(あくまでも傾向であり、常にこの通りとは限りませんが)
計算結果をメモリへ書き戻したりするための時間も浮動小数点の方が時間を要する傾向があります。
(あくまでも傾向であり、常にこの通りとは限りませんが)
・そのため滅多に複数のスレッドを一つのコアで同時に実行出来るチャンスはありません
整数系の命令を多用するプログラムと浮動小数点系の命令を多用するプログラムを同時に実行すると、
HyperThreadingの効果が得られますが、そのようなケースはまず無いでしょう...
整数系の命令を多用するプログラムと浮動小数点系の命令を多用するプログラムを同時に実行すると、
HyperThreadingの効果が得られますが、そのようなケースはまず無いでしょう...
・あくまでも回路は一組ですのでマルチコアとは全くことなります
HyperThreadingの有無による具体的な差はCPUへの入り口が1つか2つかの差だけと説明されています。
入り口が2つあるため、OSからは見るとCPUコアの数が2倍に見えますが、
前述の通りCPU内部は1組の回路しか存在しないため、マルチコアとは全く異なる技術です。
(実際にはマルチコアのCPUにHyperThreadingが実装されているのが現在のIntel製CPUですが)
入り口が2つあるため、OSからは見るとCPUコアの数が2倍に見えますが、
前述の通りCPU内部は1組の回路しか存在しないため、マルチコアとは全く異なる技術です。
(実際にはマルチコアのCPUにHyperThreadingが実装されているのが現在のIntel製CPUですが)
※2CoreのCPUなのにタスクマネージャのCPU負荷グラフが4つ表示されるのはこのためです
ではどのぐらい性能が上がるのか?
HyperThreadingはやや古い技術です。
Core i7から投入された技術かと思われる方もいらっしゃると思いますが、
Pentium4の時代ですから10年以上前に一度使われている技術になります。
Pentium4の時代ですから10年以上前に一度使われている技術になります。
しかし、Core2Duo/Core2Quadではなぜか一度姿を消してしまい、
またCore i7で復活した謎の技術だったりします。
またCore i7で復活した謎の技術だったりします。
さて、性能のお話ですが、Intel社が最近どのように宣伝しているのかは把握しておりませんが、
Pentium4時代の話では...
Pentium4時代の話では...
一般的なアプリケーションでは10~20%の性能向上が期待出来るが、極稀に5%程度の性能低下が生ずることもある。
こんなアナウンスでした。
そもそも、整数と浮動小数点のようにそれぞれ別の回路を使う命令が、
別々のスレッドから同時に発行されることは稀ですので、
それほど同時実行されることを期待するのは無理な話です。
別々のスレッドから同時に発行されることは稀ですので、
それほど同時実行されることを期待するのは無理な話です。
それでも10~20%と言われると
「もしかするとそのぐらいは同時に実行出来るものなのかも」と
思ってしまうところもあります。
「もしかするとそのぐらいは同時に実行出来るものなのかも」と
思ってしまうところもあります。
しかし...
これまたPentium4時代のお話で恐縮ですが、
あまりにも昔の話なのでGoogle先生に探してもらってもヒットしなかったのですが...
あまりにも昔の話なのでGoogle先生に探してもらってもヒットしなかったのですが...
現在、世界第3位のソフトウェアメーカであり、
大企業向けパッケージソフトでは圧倒的なシェアを誇るドイツのSAP社は
「HyperThreadingを搭載したマシンでは弊社のアプリケーションがその性能を発揮出来ない恐れがあります。
HyperThreadingを無効にしてお使い下さい」とアナウンスした事件がありました。
大企業向けパッケージソフトでは圧倒的なシェアを誇るドイツのSAP社は
「HyperThreadingを搭載したマシンでは弊社のアプリケーションがその性能を発揮出来ない恐れがあります。
HyperThreadingを無効にしてお使い下さい」とアナウンスした事件がありました。
性能低下は本当に「極稀」なのか...
そもそもそれほど性能が上がるわけのない技術なのですが、
せめて性能低下は避けて頂きたいところ。
せめて性能低下は避けて頂きたいところ。
長くなりすぎたのでここで一度ページをかえます。
( - )