15

複数のスレッド(またはプロセス)を同時に生成する場合、タスクがCPUにバインドされていると仮定して、物理プロセッサーの数または論理プロセッサーの数と同じ数を生成する方がよいでしょうか?それとも、その間に何かをする方が良いですか(たとえば、3つのスレッド)?

パフォーマンスは、実行される命令の種類に依存しますか(たとえば、非ローカルメモリアクセスはキャッシュヒットとは大きく異なります)?もしそうなら、どの場合にハイパースレッディングを利用する方が良いですか?


アップデート:

私が尋ねている理由は、仮想プロセッサの数と同じ数のタスクがある場合、同じ物理コア上のタスクが一部のCPUリソースを枯渇させ、相互に必要な数のリソースを取得できなくなる可能性があることをどこかで読んだことを覚えています。パフォーマンスが低下する可能性があります。そのため、仮想コアと同じ数のスレッドを使用するのは良い考えかどうか疑問に思っています。

4

6 に答える 6

5

パフォーマンスは、さまざまな要因によって異なります。すべてのデータがメモリ内にある場合でも、通常はプロセッサキャッシュに搭載されていないため、ほとんどのタスクは厳密にはCPUにバインドされていません。メモリアクセスパターンが特定の「並列」プロセスのパフォーマンスプロファイルを劇的に変化させる可能性がある例(この例のような)を見てきました。

要するに、すべての状況に完全な数はありません。

于 2011-01-22T23:13:58.087 に答える
4

ハイパースレッディングを有効にしてコアごとに2つのスレッドを実行すると、パフォーマンスが向上する可能性があります。通常、完全にCPUにバインドされているように見えるジョブはそうではなく、ハイパースレッディングは、時折発生する割り込みまたはコンテキストスイッチからいくつかの「余分な」サイクルを抽出できます。

一方、Turbo Boostを搭載したコアiXプロセッサを使用すると、実際には、CPUがオーバークロックするように、コアごとに1つのスレッドを実行する方が適切な場合があります。

職場では、フルCPUでメニーコアサーバーを日常的に実行し、一度に数日間さまざまな種類の計算を実行しています。しばらく前に、HTを使用した場合と使用しない場合のパフォーマンスの違いを測定しました。平均して、ハイパースレッディングを使用し、一度に2倍の数のジョブを実行すると、ハイパースレッディングを使用しない場合よりも約10%速く同じ量のジョブを完了できることがわかりました。

2×コアから始めるのが良いと仮定しますが、要点は次のとおりです。

于 2011-01-22T23:44:24.310 に答える
2

ハイパースレッディングによってパフォーマンスが最大30%向上するという情報を覚えています。一般に、それらを4つの異なるコアとして扱う方がよいでしょう。もちろん、特定の状況(たとえば、同じ長時間実行タスクが各コアにバインドされている場合)では、一部のコアが単なる論理コアであることを考慮して、処理をより適切に分割できます。

ハイパースレッディング自体の詳細については、こちらをご覧ください

于 2011-01-22T23:09:49.657 に答える
2

ハイパースレッディングを使用して同じコアで2つのスレッドを実行する場合、両方のスレッドのメモリアクセスパターンは似ているが、データ構造にアクセスできない場合は、それぞれが半分のキャッシュを持つ2つの別々のコアで実行するのとほぼ同じです。キャッシュの半分がスラッシングを防ぐのに十分であるようなメモリアクセスパターンである場合、パフォーマンスは良好である可能性があります。キャッシュを半分にするとスラッシングが発生するようなメモリアクセスパターンの場合、パフォーマンスが10倍低下する可能性があります(ハイパースレッディングがなければ、パフォーマンスが大幅に低下する可能性があります)。

一方で、ハイパースレッディングが大きな成功を収める状況もあります。多くのスレッドがすべてロックフリーデータ構造を使用して同じ共有データを読み書きし、すべてのスレッドがデータの一貫したビューを確認する必要がある場合、ばらばらのプロセッサでスレッドを実行しようとすると、一度に1つのプロセッサしか実行できないため、スラッシングが発生する可能性があります。任意のキャッシュラインへの読み取り/書き込みアクセス権があります。このようなスレッドを2つのコアで実行すると、一度に1つだけ実行するよりも時間がかかる場合があります。ただし、単一のコア上の複数のスレッドによってデータにアクセスする場合は、このようなキャッシュアービトレーションは必要ありません。そのような場合、ハイパースレッディングは大きなメリットになります。

残念ながら、可能な場合は一部のスレッドがコアを共有し、他のスレッドは可能な場合は別々に実行する必要があることを示唆する「ヒント」をスケジューラーに与える方法がわかりません。

于 2012-01-18T20:27:47.737 に答える
1

HTを使用すると、追加の仮想コアを使用するほとんどのCPUバウンドタスクで約10〜30%のブーストが可能になります。これらのタスクはCPUにバインドされているように見えるかもしれませんが、カスタムメイドのアセンブリでない限り、通常、RAMとローカルキャッシュ間のIO待機に悩まされます。これにより、物理HT対応コアで実行されている一方のスレッドが、もう一方のスレッドがIOを待機している間に動作できるようになります。ただし、これには欠点があります。2つのスレッドが同じキャッシュ/バスを共有するため、それぞれのリソースが少なくなり、IOの待機中に両方のスレッドが一時停止する可能性があります。

最後のケースでは、単一スレッドを実行すると、最大同時理論処理能力が(10〜30%)減少し、一部のアプリケーションで非常に重要になる可能性があるキャッシュスラッシングの速度低下なしに単一スレッドを実行することになります。

使用するコアを選択することは、実行するスレッドの数を選択することと同じくらい重要です。各スレッドがほぼ同じ期間CPUにバインドされている場合は、ほとんど異なるリソースを使用するスレッドが異なる物理コア上にあり、共通のリソースを使用するスレッドが同じ物理コア(異なる仮想コア)にグループ化されるようにアフィニティを設定するのが最適です。その共通リソースは、余分なIO待機なしで同じキャッシュから使用できます。

各プログラムには異なるCPU使用特性があり、キャッシュスラッシングは大きな速度低下になる場合とそうでない場合があるため(通常はそうです)、最初にプロファイリングせずに理想的なスレッド数を決定することは不可能です。最後に注意すべきことは、OS/カーネルにもCPUとキャッシュスペースが必要になるということです。キャッシュ/CPUリソースの共有を回避するために、CPUバウンドスレッドでリアルタイムのレイテンシが必要な場合は、通常、OS用に単一の(物理)コアを確保しておくことが理想的です。スレッドがIOを頻繁に待機していて、キャッシュスラッシングが問題にならない場合、またはアプリケーション用に特別に設計されたリアルタイムOSを実行している場合は、この最後の手順をスキップできます。

http://en.wikipedia.org/wiki/Thrashing_(computer_science)http://en.wikipedia.org/wiki/Processor_affinity _

于 2013-12-12T15:14:40.293 に答える
0

他のすべての答えはすでに多くの優れた情報を提供しています。ただし、もう1つ考慮すべき点は、SIMDユニットが同じダイ上の論理コア間で共有されていることです。したがって、SSEコードを使用してスレッドを実行している場合、4つの論理コアすべてでスレッドを実行しますか、それとも2つのスレッドを生成しますか(2つのチップがあると仮定)?この奇妙なケースでは、アプリでプロファイリングするのが最適です。

于 2012-01-18T20:36:48.360 に答える