3

オペレーティング システムとして Linux を使用するマルチプロセッサ システム (たとえば 8 コア) で実行されているマルチスレッド アプリケーション (たとえば ~40 スレッド) があるとします。このオペレーティング システムでは、さまざまなスレッドがより本質的にカーネルによってスケジュールされている LWP (軽量プロセス) です。

CPU アフィニティを使用する利点と欠点は何ですか? スレッドをコアのサブセットにローカライズしてキャッシュ共有/ミスを最小限に抑えることで、CPU アフィニティが役立つかどうか?

4

3 に答える 3

2

厳密なアフィニティを使用する場合、特定のスレッドはそのプロセッサ (またはプロセッサのセット) で実行する必要があります。完全に独立して動作する多くのスレッドがあり、それらが数キロバイトよりも大きなメモリ チャンクで動作する場合、特定の 1 つのコアで実行しても多くのメリットが得られる可能性は低いです。この特定の CPU で他のスレッドが実行されている可能性が非常に高いからです。 L1 キャッシュを破棄し、おそらく L2 キャッシュも破棄していたでしょう。パフォーマンスにとってどちらがより重要ですか? 一部の CPU は常にアイドル状態ですか、それともすべてのコアで CPU 負荷が 100% ですか?

ただし、スレッドが何を行っているかを知っているのは (あなたが教えてくれるまで) あなただけです。実行するたびに「ワーキング セット」 (メモリ - コードとデータの量) はどれくらい大きくなりますか? 各スレッドの実行時間はどのくらいですか? 他のスレッドとの相互作用は何ですか? 「この」スレッドと共有データを使用している他のスレッドはありますか? 分かち合いのパターンと量は?

最後に究極の答えは「何が速く走るのか?」- 適切な (現実的な) ベンチマークを用意し、さまざまな可能なオプションを試すことによってのみ見つけることができる答え。コードのすべての行、各スレッドの実行時間の測定値などを提供したとしても、多かれ少なかれ洗練された推測しかできませんでした-これらが(さまざまな使用パターンで)試行およびテストされるまで、ほとんど不可能です知る。

一般に、多くのスレッドを持つことは、各スレッドが (CPU に関して) あまりビジーではないことを示唆するか、「間違ったことをしている」ことを示唆することをお勧めします... スレッドがすべてフラットに実行されている場合、より多くのスレッドは良くありませんout - その場合は、スレッドが互いに競合するため、スレッド数を少なくすることをお勧めします。

于 2013-01-05T10:28:10.380 に答える
1

スレッドをコアのサブセットにローカライズして、キャッシュの共有/ミスを最小限に抑えます

必ずしも、キャッシュコヒーレンスも考慮する必要があります。2つ以上のスレッドが共有メモリバッファにアクセスし、それぞれが異なるCPUコアにバインドされている場合、1つのスレッドが共有キャッシュラインに書き込む場合は、キャッシュを同期する必要があります。他のキャッシュを無効にするための大きなオーバーヘッド。

于 2013-01-05T09:02:46.340 に答える
1

スケジューラーはすでに同じコアでスレッドを維持し、移行を回避しようとします。これは、次の場合を除いて、スレッドアフィニティを手動で管理することにはおそらく多くのマイレージがないことを示唆しています。

  • 何らかの理由で、カーネルが特定のアプリケーションに対して悪い仕事をしていることを示すことができます。また
  • アプリケーションについて、効果を上げるために活用できる特定の知識がいくつかあります。
于 2013-01-05T08:56:10.247 に答える