私はPOSIX互換システムとWindows(R)の両方のためにC ++でプログラムを開発していて、疑問に思っていました。
- 最高のOSポータブルスレッドプールライブラリは何ですか?それとも私は自分で作る必要がありますか?
- 物理プロセッサコアよりも多くのトレッドをプールするポイントはありますか?
私はPOSIX互換システムとWindows(R)の両方のためにC ++でプログラムを開発していて、疑問に思っていました。
可能であれば、スレッドを抽象化するライブラリを使用し、代わりにIntel TBB /MicrosoftPPLなどのタスクに集中するのが最善です。parallel_for
また、使いやすく強力な並列アルゴリズムも提供します。さらに、操作の削減、再帰的なものなど、他のさまざまな問題の負荷を解決する可能性を提供します...
一般に、スレッド間の過度のタスク切り替えとスレッドのスプワンはパフォーマンスを低下させる可能性があるため、これは適切ではありません。代わりに、タスクを盗むパターンを適用して、異なるスレッドで作業を分割することを試してみてください(TBBとPPLが実行します)(TBB wikiページを参照)。小さなオーバーサブスクリプションが適切な唯一の場所は、一部のスレッドが待機する必要があり、CPU処理時間を浪費する場合です。
1)私もBoostを使います。
2)たぶん。タスクにロックまたはI/Oブロッキングがある場合は、多数のスレッドが必要になる可能性があります。タスクがCPUにバインドされている場合、言うのはより困難です。タスクが大量のデータを読み取らず、特に書き込みを行わず、実行時にそれほど多くのキャッシュを無効にしない場合、スレッドの数が多いと、実際にはパフォーマンスがわずかに向上するようです。変数に追加するだけで、200スレッドが取得されます。大量のメモリを使用し、すべてのキャッシュをダーティにする傾向があるCPUバウンドタスクのより一般的なケースでは、多くのスレッド(たとえば、200)により、通常、スループットが20低下します。 -キャッシュフラッシュのために-50%。
dlibにはスレッドプールツールがあり、マシン上の処理コアの数を指定して、スレッドプールにジョブを送信できます。したがって、マルチコアCPUを効果的に使用しやすくするための何かを探している場合は、dlib::thread_poolが非常に便利です。
C++11ラムダ関数を含むさまざまなメソッドを使用してプールにジョブを送信するなどの方法を示すサンプルプログラムもあります。もう1つの優れた点は、インストールプロセスがないことです。このサンプルプログラムをダウンロードして、コンパイルするだけです。何もインストールまたは構成する必要はありません。あなたが言及したプラットフォームのいずれかで動作します。
Boostスレッドはクロスプラットフォームであり、C ++用です:http ://www.boost.org/doc/libs/1_49_0/doc/html/thread.html