厳密なアフィニティを使用する場合、特定のスレッドはそのプロセッサ (またはプロセッサのセット) で実行する必要があります。完全に独立して動作する多くのスレッドがあり、それらが数キロバイトよりも大きなメモリ チャンクで動作する場合、特定の 1 つのコアで実行しても多くのメリットが得られる可能性は低いです。この特定の CPU で他のスレッドが実行されている可能性が非常に高いからです。 L1 キャッシュを破棄し、おそらく L2 キャッシュも破棄していたでしょう。パフォーマンスにとってどちらがより重要ですか? 一部の CPU は常にアイドル状態ですか、それともすべてのコアで CPU 負荷が 100% ですか?
ただし、スレッドが何を行っているかを知っているのは (あなたが教えてくれるまで) あなただけです。実行するたびに「ワーキング セット」 (メモリ - コードとデータの量) はどれくらい大きくなりますか? 各スレッドの実行時間はどのくらいですか? 他のスレッドとの相互作用は何ですか? 「この」スレッドと共有データを使用している他のスレッドはありますか? 分かち合いのパターンと量は?
最後に究極の答えは「何が速く走るのか?」- 適切な (現実的な) ベンチマークを用意し、さまざまな可能なオプションを試すことによってのみ見つけることができる答え。コードのすべての行、各スレッドの実行時間の測定値などを提供したとしても、多かれ少なかれ洗練された推測しかできませんでした-これらが(さまざまな使用パターンで)試行およびテストされるまで、ほとんど不可能です知る。
一般に、多くのスレッドを持つことは、各スレッドが (CPU に関して) あまりビジーではないことを示唆するか、「間違ったことをしている」ことを示唆することをお勧めします... スレッドがすべてフラットに実行されている場合、より多くのスレッドは良くありませんout - その場合は、スレッドが互いに競合するため、スレッド数を少なくすることをお勧めします。