0

ハイパースレッディング (物理コアごとに複数の論理コア) がさまざまな状況で実際のパフォーマンスにどのような影響を与えるかを考えていました。Intel はこれが実行スレッドが I/O を待機している場合に有効であると宣伝していますが、メモリ集約型のアプリケーションでは、論理コア間で切り替えが発生するとプロセッサ キャッシュで局所性が失われるため、効果がない可能性があります。2 番目のアプリケーションのデータがキャッシュに読み込まれ、最初のアプリケーションのメモリが強制的にキャッシュから取り出されます。最初のアプリケーションに戻ると、その参照はすべてキャッシュ ミスであり、パフォーマンスが失われます。私は何人かのスーパー コンピューター マネージャーを知っていますが、彼らはハイパースレッディングをオフにした方が効率的であると主張しています。「普通」はありますか?ハイパースレッディングを無効にする方が効率的なユーザー ケースはありますか? ゲームはメモリを大量に消費する可能性があります。ハイパースレッディングを使用しない方がよいでしょうか?

4

2 に答える 2

3

まず、ハイパースレッディングは、Switch-on-Event MultiThreading (Itanium の場合) および Simultaneous MultiThreading (x86 の場合) に分類される Intel のマーケティング用語であることを認識しておいてください。SoEMT は主に、最終レベルのキャッシュ ミスなどの高レイテンシ イベントを隠すのに役立ち、実装が簡単で、VLIW のようなスケジューリングに適しています。また、SoEMT は SMT よりも小さな L1 (やや高速な L2 の場合) に適しています。これは、キャッシュの競合が L2 または L3 (スレッド スイッチ間の数千回のアクセス) に移動するためです。SMT は、分岐解決の遅延や L2 キャッシュ ヒットなどの小さなレイテンシを隠すのに役立ち、命令レベルの並列処理を提供しますが、リソースの競合がより激しくなります。

(ハイパースレッディングを無効にすることと、ハイパースレッディングを使用しないことにも違いがあります。ハイパースレッディングを無効にすると、一部の共有可能なリソースが、非アクティブであるが有効になっているスレッドによっても使用され、一部のパーティション化されたリソースが依然として少量の電力を使用する可能性があるという点で、わずかなパフォーマンス上の利点が得られる場合があります。ただし、主な利点は、OS が混乱を招くようなスケジューリングの決定を行わないようにすることです)。

「通常の」コードの場合、使用可能なスレッド レベルの並列処理は、使用可能なコア数よりも少ない場合があります。その場合、最新の OS は通常、ハードウェア マルチスレッドを使用しません。これは、完全なコアが複数のスレッドで共有されるコアよりもパフォーマンスが高いことを認識するためです。(コアを共有すると、L1 を使用してスレッド間で通信することが非常に役立つ特殊なケースで、理論的にパフォーマンスを向上させることができます。さらに、アクティブなコアで非アクティブなスレッドをウェイクアップすることは、コアをウェイクアップするよりもはるかに高速で、必要なエネルギーが少ないため、マルチスレッドを使用すると、いくつかの特殊なケースでは、エネルギー効率に役立ちます。)

HPC コードは、SMT にとって最悪のケースになる傾向があります。HPC コードは、静的スケジューリングに適している可能性が高くなります。これは、SMT のレイテンシ隠蔽の利点が最小限に抑えられる傾向があることを意味します。(同様に、HPC コードは、順不同で実行することによるメリットが少ない傾向にあります。) HPC コードは、メモリ レイテンシではなく、メモリ帯域幅によっても制約を受ける傾向があります。SMT は、(キャッシュ ミスを増やすことによって) 実行単位あたりの帯域幅の需要を増やすことができます。メモリ コントローラでの競合によって、実際に達成されるメモリ帯域幅が減少します。(DRAM はランダム アクセスに適していないため、過剰なリフレッシュおよび行アクティブ サイクルが発生します。) SMT により、アクティブなデータ ストリームの数が、ハードウェアのプリフェッチのサポートを超える場合もあります。HPC コードは、コアあたり 1 つのスレッドを想定したキャッシュ サイズに応じてブロックされる可能性も高くなります。このような場合、SMT は重大なキャッシュ スラッシングを生成します。

ハイパースレッディングを無効にすると、HPC で一般的なギャング スケジュール操作にも適している場合があります。一部のコアのみがマルチスレッドを使用している場合、それらのコアはコアあたりのパフォーマンスが高くなる可能性がありますが、スレッドあたりのパフォーマンスは低くなります。これにより、他のコアは遅くなったスレッドが完了するまで待機することになります。(HPC システムは、OS アクティビティが 1 つのコア/スレッドの速度を低下させ、他の何百ものコアを待機させたり、16 スレッド ギャング スケジュール プログラムなどの原因となるような問題を回避するために、専用の OS コアとスペア コアを備えている場合があります。 15 スレッドを実行してから 1 スレッドを実行すると、実行時間が 2 倍になります。)

(理論的には、SMT を HPC で使用して、一部の最適化されたループでレジスタ プレッシャーを軽減することができます。これは、デュアル スレッド コアでの FMADD などの操作の実効レイテンシが約半分になると見なされるためです。コンパイラは通常、スケジューリングに固定レイテンシを使用するため [SMTは透過的な機能として扱われます]、この機能を利用することは、有益な場合でも一般的には実用的ではありません。)

順不同の実行と同様に、SMT は不規則なコードに対して最も有益です。(OoO は、命令レベルとメモリ レベルの並列処理のために単一のコード ストリームを先読みします。SMT は、そのような並列処理のためにスレッド全体で「横方向」に検索します。) 分岐予測ミスとキャッシュ ミスが一般的である場合、SMT は、既存のスレッド レベルの並列処理を使用して、そのようなレイテンシを隠すことができます。 (分岐予測ミスのコストは、主に解決の待ち時間にあります)。

SMT のメリットは、ワークロードや特定のハードウェアによって異なります。初期の Intel Atom のような深くパイプライン化されたインオーダー マイクロアーキテクチャは、浅いパイプライン化された OoO マイクロアーキテクチャよりも SMT からより多くの恩恵を受けます (レイテンシ、特に分岐解決のレイテンシは、パイプラインが長くなると一般に高くなり、OoO は、さもなければ SMT のスレッドによって使用される並列処理を提供します)。 -レベルの並列性)。

ハイパースレッディングを有効にすると、アプリケーションで使用されるスレッドの数が増えるという欠点もあります。スレッド数の増加によるパフォーマンスのスケーリングは、ハイパースレッディングによるスレッドあたりのパフォーマンスの低下がパフォーマンスの純損失につながるほど十分にサブリニアです。たとえば、コアあたり 2 スレッドのハイパースレッディングでコアあたりのパフォーマンスが 30% 向上し、スレッド数が 2 倍になるとパフォーマンスが 50% 向上した場合、合計パフォーマンスは 2.5% 低下します。

「疑わしい場合は測定する」という標準的なアドバイスが当然当てはまります。

于 2014-03-11T21:04:25.317 に答える