web-dev-qa-db-ja.com

ハイパースレッディングでいくつのCPUを使用する必要がありますか?

ハイパースレッディングがオンになっている18コアのサーバーCPUがあるとします。これは、htopに36 CPUが表示されることを意味します。

CPUを十分に活用し、シングルスレッドのパフォーマンスに影響を与えないようにするには、36個の「コア」すべてを100%で実行することを目指していれば、HTコアは処理が少なく、100%と報告されますか、それとも「フル」コアは、「HTコア」のタスクによってすでに中断されているため、シングルスレッドの作業が少なくなっていますか?

HTのパフォーマンスに影響を与える多くの変数があることを知っています。HTを処理するときのCPUメーターの意味を知りたいだけです。

23
Tassadar

2番目の仮想コアが最初のスタックでスタックする可能性があるときに貢献できる場合、それはnotよりも優れているため、(少なくとも)少し余分な作業が行われます。

問題は次のとおりです。2つの異なるスレッドがあると、1つのスレッドのパフォーマンスが低下するのはいつですか。分岐予測と命令間の依存関係は変更されません。今メモリアクセスを待機しています... 2つのスレッドは、キャッシュ使用率と帯域幅の両方でメモリアクセスをめぐって競合しています。

HTで実行しているCPUとそうでないCPUがある場合、それはまた、特定のスレッドをいずれかのタイプに割り当てることを意味しますか?私はそうは思いません:あなたのプログラムはランダムな仮想コア上でスレッドを実行します。では、構成の分割はどのように役立ちますか?各CPUには独自のキャッシュがあるため、唯一の影響はメモリ帯域幅とキャッシュコヒーレンシの負担によるものです。

一般に、havingとなると、一部のCPU実行ユニットをアイドル状態にするよりもコストがかかります。これは、スレッドの数に直接依存するのではなく、スレッドの実行内容と、さまざまなコンポーネントの詳細なメモリアーキテクチャとパフォーマンスニュアンスに依存します。

簡単な答えはありません。特定のプログラムを念頭に置いても、マシンは、自分の経験を関連付ける人々のマシンとは異なる場合があります。

あなたはそれを自分で試して、測定その正確なマシンでの特定の作業で、何が最も速いかを知る必要があります。それでも、ソフトウェアの更新や使用状況の変化に伴って変化する可能性があります。

Angerのボリューム3 magnum opus をご覧ください。特定のプロセッサを注意深く見ると、コードの実行に必要な多くのステップの深いパイプラインの間でリソースが制限されていることがわかります。余計な仕事をせずに、オーバーコミットメントによって実行が遅くなるケースを見つける必要があります。一般に、これはある種のキャッシングを意味します。リソースがスレッド間で共有される場所。


CPUメーターの意味:アイドルスレッドの実行に費やされていないすべての時間を報告します。コアに割り当てられた両方の論理スレッドは、それらの1つで行われた実際の作業が小さい場合でもアイドル状態になることはありません。結果の準備が整い、メモリがフェッチされ、アトミック操作がフェンスされるまで、パイプラインがスタックしたままの時間。同様に、スレッドが「準備ができていない」と棚上げされないため、アイドル状態になりません。時間はまだ使用中と表示されます。待機中RAMはアイドルとして表示されません。I/ Oのようなものだけがスレッドをブロックし、スレッドへの充電時間を停止します。オペレーティングシステムのミューテックスは通常、そうします=マルチコアシステムの台頭により、「スピンロック」が[not)スレッドをシェルフに戻すため、もはや確実ではありません。

したがって、CPUメーターが100%であっても、CPUがメモリを待機していることが多い場合、すべてがスムーズに航行しているわけではありません。 finishes処理中の数であり、現在ディスクで待機しているため、90%を示す論理コアの数が少ないほど、より多くの作業を実行できます。

したがって、CPUメーターについて心配する必要はありません。 onlyの実際の進捗状況を確認します。

14
JDługosz

CPUメーターは、ハイパースレッドCPUからどれだけ多くのパフォーマンスを引き出すことができるかを示すのに非常に適していません。そのためには、さまざまな物理コアのオーバーサブスクリプション率で独自のベンチマークを実行する必要があります。 HTを完全にオフにしたときに最適に機能するワークロードがいくつかあるので、テストにもそのケースを含めてください。 1:2(36並列ワーカー)、1:1.5、または1:2.5の場合もあります!それはワークロードに依存します。

より詳細には、HTは、コンテキストの切り替えが必要な場合や分岐予測が失敗した場合にプロセッサがアイドル状態になる時間を短縮する方法でシリコンに実装されます。これにより、純粋なオペレーティングシステムのトリックよりも実行ユニットの使用率を100%に到達することが容易になります。 HTはその導入以来進化しており、現代のチップには、10年前に使用していたものよりも多くの並列処理があります。

最適なオーバーサブスクリプションポイントがどこにあるかに影響を与える2つの実行プロファイルがあります。

  • 実行時間が長い。大規模なレンダリングジョブや環境モデリングなど、ワーカーがリサイクルする前に数分または数時間実行すると、ワーカーあたりのシングルコアパフォーマンスがより効率的になります。これはあなたの比率を下げます。
  • 実行時間が短い。ワーカーが数秒または数分でサイクルする場合(Webアプリのスレッドなど)、新しいプロセスをオンにすることに伴うオーバーヘッドは、比率が高くなることを意味します。
23
sysadmin1138

36個のコアすべてが100%で実行されているのがわかります。ソフトウェアがそれを実行できると想定します(これは簡単ではありません。その数のコアではスケジューリングが難しいため、100%未満の低下は許容されます)。

明らかに、ハイパースレッディングで鉱石を「分割」した場合、それらの200%の意味は「2x100%-作業完了」ではありません。しかし、これは測定結果からは見えません(CPU使用率に由来し、作業の概念はありません)。これがどの程度の作業を行うかは、作業内容によって異なります。1.5倍を超えると、ほとんどの場合、ハイパースレッディングなしの作業が予想されます。

4
TomTom

ハイパースレッディングの実装方法は、特定のCPUアーキテクチャによって異なります。 NehalemからSkylakeまで、Intelはパイプラインの固定比率(つまり、50/50)の共有部分を大幅に削減し、動的に共有される構造に向かいました。

とにかく、一般的に言えば、HTを有効にするとシングルスレッドの実行がわずかに遅くなりますが、Linuxスケジューラの動作により、これは、スレッド数または実行中のスレッドがよりも高い場合にのみ発生します物理コアの数。このような状況(スレッド>コアの場合)では、通常、最大スループットの合計スループットを重視しますが、ハイパースレッディングは正味の利益となります。

これはどのように可能ですか?理解しておくべき重要な点は、CPUが物理コアと仮想コアを同等のコアとして提示するのではなく、他の物理コアが使用可能な場合にLinuxスケジューラーがそれらのスケジューリングを回避できる方法で後者を公開することです。つまり、最初にすべての物理コアを使用し、、次に仮想コアを使用し始めます。

つまり、一般的に、ハイパースレッディングは非常に価値のある機能であり(Power8などの他のプロセッサーはさらに深いSMT技術を使用します)、スループットを最大化するには、仮想コアまたは物理コアごとに少なくとも1つのスレッドでCPUをロードする必要があります。実際の例として、18コアCPUから完全なパフォーマンスを引き出すには、少なくとも36スレッドを使用する必要があります。

2つの例外があります。

  1. スレッドの制限されたセット(スレッド<物理コア)からの待ち時間を最小限に抑えたい場合は、HTを無効にできます
  2. 非常に古いCPU(Pentium4、およびはるかに小さい方法ではNehalem)には、CPUに2番目のスレッドのステータス/負荷とは無関係に50/50の比率で多くの主要なリソースを分割するよう強制する柔軟性のないパーティションルールがあります。この場合、追加されたスループットがシングルスレッドのパフォーマンスを大幅に低下させる価値があることを確認するために、ユースケースをベンチマークする必要がありました。
3
shodanshok