質問: ハイパースレッディング(smt)の親和性と同等性 この質問は、私が知っているインテルの教祖に向けられています。物理cpu上の両方のスレッドは同等に扱われますか?ご存知のように、intel cpuのハイパースレッディングは、各物理コアが2つの仮想コアとしてosに提示されるシステムです。これらの2つの仮想コアにより、プロセッサは、osに認識されないイベント(ページフォールト、その他のcpu内部イベント)で2つの実行ユニット(スレッド@仮想コア)をコンテキストスイッチすることができます。その他ioイベント。デフォルトでは、osはハイパースレッディングを考慮する必要はありません。最終的にはすべてのコアが機能しますが、唯一の違いは、すべての可視/仮想コアが同じ速度で処理できるわけではないことです。同じ物理コア(vcpu0 + 1-> cpu 0)で2つのスレッドにスケジュールされた作業は、2つの異なるコア(vcpu0 + 2-> cpu 0 + 1)でスケジュールされた作業ほど速くはありません。私が調査したところによると、「ハイパースレッディング」対応のosは、「仮想コア」でのスケジューリングを2倍にする前に、物理コアごとに作業をスケジュールしようとします。私は通常、これを「偶数」のvcpuが最初にスケジュールされると見なします(1 +3の前にvcpu0 + 2を埋めます)。 「偶数」スレッドと「奇数」スレッドの両方が等しいですか? (実際には「ハイパースレッド」仮想cpuはありません)。言い換えれば、物理cpuのプライマリ/セカンダリ「スレッド」はありませんか? vcpu 1だけで作業をスケジュールした場合、vcpu 0でスケジュールした場合と同じように実行されますか?両方で同じ作業がスケジュールされているとすると、両方のスレッドが完了するまでに約2倍の時間がかかりますか?
回答: 物理cpu上の両方のスレッドは同等に扱われますか? はい。コアの実行リソースを1つのスレッドまたは他のスレッドに割り当てることには優先順位はありません。 (「実行リソース」とは何ですか?以下にリンクした記事を参照してください。ただし、例としては、アーキテクチャレジスタ(ip、sp、eaxなど)、算術などの特定の操作を実装する「実行ユニット」などがあります。) ご存知のように、intel cpuのハイパースレッディングは、各物理コアが2つの仮想コアとしてosに提示されるシステムです。 実際には、osがコアになると思われる2つのもの、またはwindowsが呼び出す2つの「論理プロセッサ」として提示されています。 (ramhoundが主張したことにもかかわらず。)htをオフにしている場合、各コアにはlpが1つしかないため、同じ用語が使用されます。htに対応していないosを使用している場合、htが有効になっているコアは2つのコアのように見え、osによってそのように列挙されて使用されます。実際、これはwindows 2000の場合であり、htをまったく認識していませんでした。 これらの2つの仮想コアにより、プロセッサは、通常はcpuの無駄なサイクルを待機させるosに認識されないイベント(ページフォールト、その他のcpu内部イベント)で2つの実行ユニット(スレッド@仮想コア)をコンテキストスイッチすることができます。その他ioイベント。 それは実際にはどのように機能するかではありません(そして、ページフォールトはosに最も確実に知られています!おそらくあなたはメモリアクセスの待ち時間を考えています)。 ht対応プロセッサは、スレッド間のosレベルのコンテキストスイッチのようなことは何もしません。 htコアは、実際には2つの異なる(論理)プロセッサとして列挙され、それぞれに独自のアーキテクチャレジスタのセットなどがあります。スレッドコンテキストスイッチでは、これらのレジスタの内容がメモリ(スレッドオブジェクト内)にコピーされ、レジスタは次のようになります。他のスレッドの保存されたコンテキストからロードされます。これらのレジスタ(および他の多くのリソース)は2つのlpによって複製されるため、これはhtでは発生しません。したがって、各lpの状態はcpu内で継続的に維持されます。しかし、複製されていない他のリソースがあります。 htを使用すると、プロセッサファームウェアは、2番目のlpのアクティビティをサポートするために、実行リソース(1つのlpだけが実行されている場合に浪費されるリソース)を使用できます。ここに本当に良い説明があります: http://arstechnica.com/features/2002/10/hyperthreading/ デフォルトでは、osはハイパースレッディングを考慮する必要はありません。最終的にはすべてのコアが機能しますが、唯一の違いは、すべての可視/仮想コアが同じ速度で処理できるわけではないことです。同じ物理コア(vcpu0 + 1-> cpu 0)で2つのスレッドにスケジュールされた作業は、2つの異なるコア(vcpu0 + 2-> cpu 0 + 1)でスケジュールされた作業ほど速くはありません。 すべて正しい。 windows 2000は、htをまったく認識していませんでしたが、htを有効にして単一のcpuコアで実行すると、2つのプロセッサを「認識」して使用しました。 (このようなプラットフォームの初期ファームウェアでの列挙順序により、2つのcpuのみをサポートするwin2kのエディションを実行している場合、残念ながら1つのcpuパッケージ内で2つのlpを使用します!これは後でファームウェア( "bios ")acpiテーブルでのlpの表示順序を変更した更新。) 私が調査したところによると、「ハイパースレッディング」対応のosは、「仮想コア」でのスケジューリングを2倍にする前に、物理コアごとに作業をスケジュールしようとします。 windowsは確かにそうします。彼らはコアごとに1つのlpのみを使用しようとします。たとえば、新しく準備ができたスレッドを実行するアイドルlpを探す場合、windowsスケジューラは最初に、bothのコアにあるアイドルlpを見つけようとします。 -)lpはアイドル状態です。 私は通常、これを「偶数」のvcpuが最初にスケジュールされると見なします(1 +3の前にvcpu0 + 2を埋めます)。 「偶数」スレッドと「奇数」スレッドの両方が等しいですか? まあ、それらは、一方のlpのコア内にもう一方のlpに対する組み込みのバイアスがないという点で同等です。一方で実行されているスレッドが他方よりも少ない実行リソースを必要とするため、一方が他方よりも速く作業を完了している可能性があります。ちなみに、ht対応のcpuが2つのlp間の優先順位の概念を実装していないのは、実際にはhtの欠陥のようなものです。 osにとって優先度の異なる2つのコンピューティングバウンドスレッドがあるとします。 osの規則により、論理プロセッサが1つしかない場合、優先度の高いスレッドが実質的にすべてのcpu時間を取得します。しかし、代わりに、同じコアにたまたま2つの無料のlpがあるとします。コアファームウェアは、osが実際に望んでいるものではない場合でも、それらをほぼ等しく実行しようとします。 (少なくとも、私がこれらの詳細を最後に見たとき、これは事実でした。) (実際には「ハイパースレッド」仮想cpuはありません)。言い換えれば、物理cpuのプライマリ/セカンダリ「スレッド」はありませんか? 正しい。存在しない。ちなみに、cpuとcpuコアには「スレッドがありません」。論理プロセッサはスレッドを実行できます。 lpが多いほど、同時に「計算」できるスレッドも多くなります。 vcpu 1だけで作業をスケジュールした場合、vcpu 0でスケジュールした場合と同じように実行されますか? はい。 両方で同じ作業がスケジュールされているとすると、両方のスレッドが完了するまでに約2倍の時間がかかりますか? うーん、ダメ。 htの要点は、コアには通常、1つのスレッドが使用できるよりも多くの実行リソースが利用できるということです。コアを2つのlpとして提示することにより、2つのスレッドを「同時に」実行し、アイドル状態の実行リソースを減らすことができます。ほとんどのスレッドでは、2つのスレッドが1つだけの場合の1.4倍から1.7倍の時間で完了することが期待できます。極端な場合は、スレッドの1つがほぼすべての整数演算を実行し、他のほとんどすべての浮動小数点演算を実行している場合です。それでも、共有l3キャッシュとメモリ帯域幅の問題により、2つのスレッドが2つの異なるコアで実行されている場合と同じパフォーマンスが得られる可能性はほとんどありません。ただし、両方のスレッドがメモリを大量に消費する作業を行っていない場合は、かなり近づく可能性があります。