2010-12-03 17 views
3

私はC++で非常に最初の単純なマルチスレッドジョブキューを実装しましたが、ハードウェアスレッドごとに1つのワーカースレッドを使用することをお勧めします(私の場合は4となります)。基本的に私のアプリは、今すぐインターネットからたくさんの画像を読み込むだけです。私はワーカースレッドの数を4の代わりに8または16に増やしても大きなスピードアップを見ます。C++ Jobqueue:ワーカースレッドの数について経験則がありますか?

このようなジョブキューに使用するスレッド数の一般的なルールはありますか?私が推測しているのは、各フレームで新しいジョブを作成していた場合には4がgreate numberになり、ワーカースレッドは各フレームで一定のワークロードを持ちますが、それよりもスレッド数が多いとスピードアップにつながります。それでも、さまざまなシナリオで適切な数の経験則がありますか?

おかげ

答えて

2

ワーカースレッドの理想的な数は、システム内のCPUコアの数に等しいです。しかし、実際には、ネットワークやディスクI/Oなどでタスクがブロックされることがあるため、十分に活用されていないため、これは最適ではありません。それはここで起こっているように聞こえる。

多くの場合、スレッドプールはこれを補うために「スケジュールを超過する」ことがあります。時には、スレッドがブロックされたときに通知するためのカーネルサポートが組み込まれているので、別のもの(Win32の完了ポート)をスピンアップさせ、最適な数のアクティブワーカースレッドにヒットします。

0

は、いくつかのしばらく前に、私はその質問の答えを探していたと私はそれがコアあたり最大16スレッドを使用するのが最善であると述べMSDNの記事に出くわしました。残念ながら私はもう記事を見つけることができませんが、画像を読み込むためには、コア当たり16本のスレッドが意味を持ちます。

2

マイクロソフトでは、プロセッサの数の1.5倍から始まるスレッド数で、スレッドプールの実装(OSから利用でき、同様に.netで利用可能)を提供することを選択しました。そのアイデアは、ブロックされているスレッド(ディスクI/Oなど)が、ブロックされていない別のスレッドに対してスワップアウトできることです。スレッドプールは、2x、3x、またはそれ以上のスレッドが必要であると判断した場合、スレッドの最小数を要求できるように設定することもできます。

私はこのすべてがあなたの状況に当てはまると考えています。

+0

私はOSX(boost :: threadを使用しています)と言っていることを忘れてしまいました。 – moka

関連する問題