WindowsプロセッサアフィニティはハイパースレッドCPUでどのように機能しますか?それぞれがハイパースレッド仮想コアを持つ4つのコアを持つシステムの例(写真)を使用してみましょう。
これはすべて非常に漠然としていて混乱しています。 HTはすばらしいですが、リソース割り当ての透明性が低下するようです。
以下の各「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つのコアに割り当ててもパフォーマンスは向上しません。とはいえ、何らかの理由で単一のプロセスが単一の物理コアでのみ実行されるようにしたい場合は、そのプロセスを任意の単一の論理プロセッサに割り当てます。
プロセスが「バウンス」する理由は、プロセススケジューラによるものです。これは正常な動作であり、プロセススケジューラは、強制された制限ですべてを機能させるためにより強力に動作する必要があるため、プロセスが実行できるコアを(スレッドの数に関係なく)制限することにより、パフォーマンスが低下する可能性があります。はい、ほとんどの場合このペナルティは無視できるかもしれませんが、これを行う理由がない限り、最終的にはです!
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トポロジを理解しています。
結局のところ、これは結局のところ、エンドユーザーがスレッドアフィニティを使用してパフォーマンスに大きな影響を与えることはほとんどなく、さまざまなビットを認識している最新のOSを実行していることを確認する以外に、あなたのシステム。
アフィニティを手動で割り当てることが大きな影響を与えるワークロードを見つけた場合は、それをバグとしてアプリケーション開発者に報告して、プログラムを修正できるようにします。