1

(特に)次のシナリオが与えられます:

  • コアごとに1つのスレッド、
  • 各コアには独自のキャッシュがあり、
  • キャッシュのヒット/ミス率が優れたパフォーマンスの中心となるプログラム(つまり、今日のほとんど)

マルチコアシステムでの作業をスケジュールするためのスレッドプールの利点についてよく読んでいます。マルチスレッドにはいくつかのアプローチがありますが、このようなよりスマートな負荷分散アプローチと、負荷分散がで処理されたと想定されるより単純な「タスクタイプによるスレッドの割り当て」アプローチとの間で比較が行われることがよくあります。実行時のシステム自体ではなく、開発時間。この例としては、あるスレッドでの専用の数値計算と別のスレッドでのレンダリングタスクがあります。

上記の条件下では、タスクタイプごとのスレッドアプローチは、コアのローカルキャッシュが、割り当てられた特定のタスクに対してはるかに効率的であるため、はるかに優れたパフォーマンスにつながる可能性があるように思われます。(待機はそれほど問題ではないと仮定します。つまり、両方のスレッドがフルスチームで実行されているか、フルスチームに近い状態で実行されています。)

また、負荷分散アプローチとナイーブアプローチで、スレッドセーフメカニズムがパフォーマンスにどのような影響を与える可能性があるのか​​疑問に思います。

4

2 に答える 2

2

上記の条件下では、タスクタイプごとのスレッドアプローチは、コアのローカルキャッシュが割り当てられた特定のタスクに対してはるかに効率的であるため、パフォーマンスが大幅に向上する可能性があるように思われます。

スレッド化されたプログラミングによる最大のパフォーマンスの向上は、フォークオフされるタスクのタイプではなく、その操作がどれほど非同期であるかということです。タスクが共有リソースと密接に関連している場合、つまり、メモリを頻繁にロックして同期する必要がある場合は、個別のプロセッサでキャッシュメモリのメリットを享受できません。

編集:ニックがどこに向かっているのかわかりました。負荷分散システム、定義上、いくつかの一般的なタスクキューから消費されるため、より多くの同期ポイントを持つ可能性があります。ただし、異なるタスクは、データベースを処理したり、ファイルシステムに書き込んだり、非同期で実行する機能を妨げる他のリソースをブロックしたりする場合があります。また、負荷分散アプローチではより多くの同期が必要になる場合がありますが、アプリケーションのスループットを大幅に向上させる最も簡単な方法です。

また、負荷分散アプローチとナイーブアプローチで、スレッドセーフメカニズムがパフォーマンスにどのような影響を与える可能性があるのか​​疑問に思います。

右。これが重要なポイントです。スレッドセーフとは、同期またはその他のロック、ダーティメモリの中央ストレージへの書き込み、および他のスレッドによって更新されたキャッシュメモリの無効化を意味します。スレッド化されたタスクがそのような操作を実行する必要があるほど、そのパフォーマンスは低下します。

繰り返しますが、これは必ずしもタスクのタイプ、負荷分散とタスクタイプに関するものではなく、タスクを実行するために必要なコードの詳細に関するものです。

最後に、ほとんどのスレッドプログラムでは、CPU /コアよりも多くのスレッドがあることを理解することが重要です。特に、バックグラウンドGC、ファイナライザー、およびCPUを競合する他のVMスレッド(VM上にいると仮定)が頻繁に存在することを考慮してください。資力。これにより、スレッド化されたプログラムを最適化して、質問で暗示されているように見えるスレッドとCPUの親和性を利用することがさらに困難になります。

于 2012-09-28T11:50:57.170 に答える
0

上記の条件下では、スレッドごとのタスクタイプのアプローチにより、はるかに優れたパフォーマンスが得られるように思われます [...]

ここでリンゴとオレンジを少し比較しているようです。明らかに、別個の異なる実行パターンを持ついくつかの異なるタスクがある場合は、そのようなタスク タイプごとに 1 つのスレッドを開始するのが最善の方法です。スレッドプールはこの種の作業用ではなく、どのスレッドが実行するかを気にしない同一のタスク用であり、これが最大の利点です。

ここで、アプリケーション レベルのスレッド プーリングと OS レベルのスレッド プーリングを区別する必要があります。アプリ レベルでは、負荷分散を確実にするために、タスクをスレッドによって匿名で実行する必要があります。それは完全に望ましいことです。しかし、OS レベルでは、スレッドはコアにマップされますが、OS は通常、実行中は最初のコアにスレッドを保持します。つまり、キャッシュの問題により、コアの負荷分散はアプリケーションの負荷分散ほど積極的ではありません。

于 2012-09-28T11:43:01.943 に答える