Windowsプロセッサアフィニティは、ハイパースレッドCPUとどのように機能しますか?


27

Windowsプロセッサアフィニティは、ハイパースレッドCPUとどのように機能しますか?それぞれがハイパースレッド仮想コアを持つ4つのコアを持つシステムの例(写真)を使用してみましょう。

  1. 以下の各「CPU」に対応するコアはどれですか?
  2. (たとえば)以下のCPU 6とCPU 7は1つのコアを表しますか?HTと実際のコア?
  3. たとえば、CPU 6が実際のコアを表し、CPU 7がHTコアを表す場合、CPU7だけに割り当てられたスレッドは、実際のコアのリソースだけを残しますか?(コアが他のタスクを実行していると仮定)
  4. ハイパースレッディングは、スレッドが内部でジャグリングされるように、プロセッサ内で完全に管理されていますか?その場合、それはCPUスコープまたはコアスコープですか?例:CPU 6と7が1つのコアを表す場合、CPUは実行中のスレッドに適切にリソースを割り当てるため、どのプロセスに割り当てられるかは問題になりませんか?
  5. 少なくともタスクマネージャーによれば、長時間実行されているシングルスレッドプロセスがコアの周りでかなり跳ね返っていることがわかります。これは、プロセスを単一のコアに割り当てると、パフォーマンスが少し向上することを意味しますか(コンテキストの切り替えやキャッシュの無効化などを回避することにより)?もしそうなら、「仮想コアだけ」に割り当てていないことを知ることができますか?

これはすべて非常に曖昧でわかりにくいものです。HTは優れていますが、リソース割り当ての透明性が低下するようです。

プロセッサアフィニティメニュー


ご存知のように、表示されるすべてのCPUコアは「仮想コア」です。それぞれがCPUに物理的に接続されており、「仮想」という用語は、ハードウェアハイパースレッディングの実装により、WindowsがこれらのCPUでプロセスをスケジュールする方法に由来します。詳細については私の答えをご覧ください。
ブレークスルー

また、最後のコメントもあります。「HTは優れていますが、確かにリソース割り当ての透明性を低下させるようです。」これは、100%真実であるが、少しあなたはそれについて行うことができますがあり、またそこに多くの理由であるため、あなたはそれについて何もします。最新のオペレーティングシステムはすべて、ハイパースレッディングとは何かを認識しており、ほとんどの場合、それを補うための高度なプロセッサスケジューラを備えています。
ブレークスルー

回答:


18

以下の各「CPU」に対応するコアはどれですか?

コア1、2、3、および4があると仮定すると、CPU4およびCPU5はコア3を表します。

(たとえば)以下のCPU 6とCPU 7は1つのコアを表しますか?HTと実際のコア?

2つの間に違いはありません-両方ともCPUへの物理ハードウェアインターフェイスを持ち、論理インターフェイスはハードウェアに実装されます(詳細については、Intel Core Processorデータシート、ボリューム1を参照してください)。基本的に、各コアには2つの個別の実行ユニットがありますが、それらの間でいくつかの共通リソースを共有します。これが、特定の場合にハイパースレッディングが実際にパフォーマンスを低下させる理由です。

たとえば、CPU 6が実際のコアを表し、CPU 7がHTコアを表す場合、CPU7だけに割り当てられたスレッドは、実際のコアのリソースだけを残しますか?(コアが他のタスクを実行していると仮定)

上記を参照。ONLY CPU6またはONLY CPU7に割り当てられたスレッドは、まったく同じ速度で実行されます(スレッドが同じ作業を行い、プロセッサ内の他のコアがアイドル状態であると仮定します)。WindowsはHT対応プロセッサについて知っており、プロセススケジューラはこれらのことを考慮します。

スレッドが内部でジャグリングされるように、ハイパースレッドは完全にプロセッサ内で管理されていますか?その場合、それはCPUスコープまたはコアスコープですか?例:CPU 6と7が1つのコアを表す場合、CPUは実行中のスレッドに適切にリソースを割り当てるため、どのプロセスに割り当てられるかは問題になりませんか?

両方。実際のハードウェア自体は、プログラムを実行するコアをスケジュールしません。それがオペレーティングシステムの仕事です。ただし、CPU自体が実際の実行ユニット間でリソースを共有する役割を担っています。Intelは、これを可能な限り効率的にするためのコードの記述方法を指示しています。

少なくともタスクマネージャーによれば、長時間実行されているシングルスレッドプロセスがコアの周りでかなり跳ね返っていることがわかります。これは、プロセスを単一のコアに割り当てると、パフォーマンスが少し向上することを意味しますか(コンテキストの切り替えやキャッシュの無効化などを回避することにより)?もしそうなら、「仮想コアだけ」に割り当てていないことを知ることができますか?

これは通常の動作であり、いいえ、単一のコアに割り当ててもパフォーマンス向上しません。そうは言っても、何らかの理由で単一のプロセスが単一の物理コアでのみ実行されるようにする場合は、単一の論理プロセッサに割り当てます。

プロセスが「跳ね返る」理由は、プロセススケジューラが原因です。これは通常の動作であり、プロセススケジューラーは、すべての制限が課せられた状態で動作するようになりますので、プロセスが実行できるコアの数を制限することで(スレッドの数に関係なく)パフォーマンスが低下する可能性が高くなります。はい、ほとんどの場合、このペナルティは無視できますが、最終的な理由は、これを行う理由ない限りです


5

CPUレイアウトは、すべてのCPUを認識できないオペレーティングシステムが最大限のパフォーマンスを発揮できるように編成されることになっています。つまり、物理コアの2番目の仮想コアがリストされる前に、各物理コアの1つの仮想コアがリストされます。

たとえば、A、B、C、Dという4つのハイパースレッドコアがあるとします。AとBがL2キャッシュを共有し、CとDがL2キャッシュを共有すると仮定すると、順序は次のようになります
。 A1 1 = C1 2 = B1 3 = D1 4 = A2 5 = C2 6 = B2 7 = D2

これにより、2つのCPUのみを取得するオペレーティングシステムは、すべてのL2キャッシュを使用できます。また、4つのCPUのみを取得するオペレーティングシステムは、すべての実行ユニットを使用します。

繰り返しますが、これが本来の方法です。

もちろん、CPUトポロジを理解するオペレーティングシステムを使用している場合は、問題ではありません。BIOSは、どのコアが実行ユニットを共有するか、キャッシュを共有するかなどを説明する表に記入します。CPUを完全にサポートする最新のオペレーティングシステムはすべて、完全なCPUトポロジを理解しています。


1
  1. それらがどのように対応するかは、CPUとマザーボードがどのようにコアを列挙して識別するかに依存します。起こるのは、物理ソケットが最初に列挙され、次に論理コアが列挙され、仮想コアが最後に列挙されるということです。あなたの場合、コア0〜3は物理コアであり、4〜7は仮想HTコアである必要があります。これの主な理由は、利用可能なすべての実行ユニットを処理できないOSを実行する場合、共有ユニットの前に最も独立したユニットを最初に取得する可能性が最も高いためです。仮想の2 CPUのみのOSが2つの異なるコアの代わりにシステムでHTペアを検出した場合、それは良くありません。(これは、新しいCPU用にカーネルスケジューラを更新できるようになる前の、初期のHTシステムにとっては本当の問題でした。)
  2. いいえ。1を参照してください。
  3. いいえ。HTはそれよりも複雑です。多くの場合、2つの仮想コアはいくつかのリソースを共有しますが、他のビットは分離されますが、一度に実行できるのはどちらか一方だけです。
  4. 並べ替え。あなたの例(仮定が与えられた)は、一般的に正しいです。ただし、アプリケーションが実行しているワークロードの種類を把握できれば、OSがスレッドを適切にスケジュールするのに役立ちます。
  5. コアホッピングには非常に正当な理由があります。熱負荷を分散させることです。多くの場合、より高いレベルのキャッシュ(L2、L3)はすべてのコアで共有されるため、コアホッピングはパフォーマンスに大きな影響を与えませんが、「ホットスポット」がないため、熱の影響は大きくなります。 1つのコアは常に実行され、他のコアはアイドル状態です。現在、マルチソケットシステム(特にNUMAシステム)でのソケットのクロスは、パフォーマンスに大きな影響を与える可能性があります。ほとんどのスケジューラはこれを認識しており、考慮に入れています。

最終的に、これは最終的に、(エンドユーザーとして)スレッドアフィニティを使用してパフォーマンスに大きな影響を与えることはほとんどありませんが、さまざまなビットを知っている最新のOSシステム。

アフィニティの手動割り当てが大きな影響を与えるワークロードを見つけた場合、プログラムを修正できるように、アプリケーション開発者にバグとして報告してください。


4
「コア0〜3は物理コア、4〜7は仮想HTコアでなければなりません」実際、コア0とコア1は同じ(単一の)物理コアに対応しています。各「ハイパースレッドコア」にはCPUへの2つの物理接続があるため、Windowsは文字通り8つの物理コアを認識します。CPUにハイパースレッディングがあることを知っているだけです。興味のある方は、Intel Coreデータシートをご覧ください。
ブレークスルー

@Breakthroughこれは、4つのコアのみをサポートする素朴なOSが物理コアの半分のみを使用してしまうため、良いトポロジではありません。物理コアの2番目の仮想コアがリストされる前に、各物理コアの1つの仮想コアが仮想コアリストに表示されます。
デビッドシュワルツ

@DavidSchwartz良いトポロジかどうか、それが論理プロセッサの列挙方法です。したがって、LP、コア、物理CPUパッケージを適切に列挙しない初期のOS(Windows 2000以前など)では、ハイパースレッディングを無効にすることをお勧めします。
ジェイミーハンラハン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.