web-dev-qa-db-ja.com

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

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はすばらしいですが、リソース割り当ての透明性が低下するようです。

Processor affinity menu

27
Charles Burns

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

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

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

2つは区別されません。どちらもCPUへの物理ハードウェアインターフェイスを備えており、論理インターフェイスはハードウェアで実装されています(詳細については Intel Core Processor Datasheet、Volume 1 を参照)。基本的に、各コアには2つの個別の実行ユニットがありますが、コア間でいくつかの共通リソースを共有します。これが、特定の状況でハイパースレッディングが実際にパフォーマンスを低下させる可能性がある理由です。

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

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

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

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

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

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

プロセスが「バウンス」する理由は、プロセススケジューラによるものです。これは正常な動作であり、プロセススケジューラは、強制された制限ですべてを機能させるためにより強力に動作する必要があるため、プロセスが実行できるコアを(スレッドの数に関係なく)制限することにより、パフォーマンスが低下する可能性があります。はい、ほとんどの場合このペナルティは無視できるかもしれませんが、これを行う理由がない限り、最終的にはです

18
Breakthrough

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

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

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

繰り返しますが、これは本来あるべき姿です。

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

5
David Schwartz
  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を実行していることを確認する以外に、あなたのシステム。

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

1
afrazier