web-dev-qa-db-ja.com

マルチタスク中の最適なスレッド数

同様の質問があったことは知っていますが、私の場合は少し違うと思います。

LinuxOSを搭載した8コアと無限メモリを搭載したコンピューターがあるとします。

マルチスレッドを利用できるGaussianという計算ソフトウェアがあります。そこで、最大速度を1回計算するために、スレッド数を8に設定しました。ただし、たとえば8つの計算を同時に実行する必要がある場合、どうすればよいかを実際に決定することはできません。その場合、ジョブごとにスレッド数を1(8プロセスで生成される合計8スレッド)に設定する必要がありますか、それとも8(8プロセスで生成される合計64スレッド)に保つ必要がありますか?それは本当に重要ですか?関連する質問は、OSがスレッドごとに異なるコアにコアパーキングを自動的に実行するかどうかです。

編集:ベンチマークが知るための最良の方法であることを私は知っています。実は、コンピューターは私の大学のものなので、いつも忙しいのです。言い換えれば、他の人が計算にこれらのコンピューターを使用していて、実験が不可能であるため、そのワークロードは私にとって制御できない方法で変化します。また、ソフトウェアは非常に高価で(1500ドル程度)、コンピューターごとにライセンスが付与されているため、パーソナルコンピューターでベンチマークを実行することはできません...

4
theGD

理想的には、すべてのジョブの合計スレッド数は、システムのコア数である必要があります。ただし、ハイパースレッディングをサポートするシステムでは、コア数の2倍である必要があります。したがって、システムにハイパースレッディングがない場合は、8つの計算が実行され、それぞれが1つのスレッドで実行される必要があります。

多くのIntelプロセッサにはハイパースレッディングが付属しているため、各コアは2つのスレッドをサポートできます。たとえば、ハイパースレッディングをサポートする8コアシステムでは、システムを完全に活用するために16のスレッドが必要です。

5
Ramchandra Apte

答えは、プロセスの実行内容とマルチスレッドのプログラム方法によって異なります。つまり、実験する必要があります。

プロセスが共通リソース(メモリなど)上のスレッド間の競合にセマフォやその他の除外メカニズムを使用する場合、プロセス内のスレッドの数が少なくなるほど、待機の原因となる競合の数も少なくなります。

待機中、スレッドは何も実行しないため、待機はスループットに悪影響を及ぼします。この場合、プロセス数が多く、プロセスあたりのスレッド数が少ないとスループットが向上するため、8x8の方が1x64よりもパフォーマンスが向上します。

一方、各スレッドが完全に分離されており、共有の共通リソースがない場合、オペレーティングシステムは、8x8または1x64の2つのケースを区別せずにスレッドをスケジュールします。この場合、合計スループットにとって重要なのはスレッドの合計数だけなので、どちらの場合も同じパフォーマンスになります。

3
harrymc

正しい数は、プロセスがIOでブロックされるのに費やす時間によって異なります。

「JVMでの同時実行性のプログラミング」という本には、これに関するいくつかの良い情報があります。

「スレッド数の決定」。大きな問題の場合、少なくとも使用可能なコアの数と同じ数のスレッドが必要です。これにより、プロセスで利用可能な限り多くのコアが問題を解決するために機能するようになります...

したがって、スレッドの最小数は、使用可能なコアの数と同じです。すべてのタスクが計算集約型である場合、必要なのはこれだけです。この場合、まだやるべきことがあるときにコアがスレッド間でコンテキストを切り替えるため、スレッドが増えると実際に問題が発生します。タスクがIO集中的である場合、より多くのスレッドが必要です。

タスクがIO操作を実行すると、そのスレッドはブロックされます。プロセッサはすぐにコンテキストを切り替えて、他の適格なスレッドを実行します。使用可能なコアの数と同じ数のスレッドしかない場合でも、実行するタスクがありますが、プロセッサが取得するスレッドでタスクをスケジュールしていないため、実行できません。

タスクがブロックされる時間の50%を費やす場合、スレッドの数は使用可能なコアの数の2倍になるはずです。ブロックに費やす時間が少ない場合、つまり計算量が多い場合は、スレッド数は少なくなりますが、コア数以上になるはずです。ブロックされるのにより多くの時間を費やす場合、つまりIO集中的である場合)、より多くのスレッド、具体的にはコア数の数倍が必要になります。

したがって、必要なスレッドの総数を次のように計算できます。

スレッド数=使用可能なコア数/(1-ブロッキング係数)

複数の計算を同時に実行する必要がある場合は、適切なサイズのスレッドプールを使用して1つのプロセス内でそれらを実行できるかどうかを確認してください。

それ以外の場合、1回の計算に最適なスレッド数があるが、一度に8つ実行すると、スレッド数が多すぎる可能性があります。

最善の解決策は、実験的にベンチマークすることです。

コアパーキングの意味は正確にはわかりませんが、CPUはキャッシュの理由で特定のコアで同じスレッドを実行し続ける傾向がありますが、熱/電力の理由が異なる場合もあります。 htopなどのツールを使用してこれを調査できます。

3
stephenbez

あなたは自分で質問に答えました。 「コンピューターは私の大学のものなので、いつも忙しいです」

実際には、プロセッサのスライスしか取得できません。最も効率的な方法でジョブを実行するには、タスクの切り替えとマルチプレックスのオーバーヘッド、および待機中のリソースを最小限に抑える必要があります。したがって、常にシングルスレッドで実行することを検討する必要があります。

マルチスレッドは、コンテキスト切り替えのオーバーヘッドのため、「処理能力」に基づいて計算すると常に効率が低下します。それは、すべての「無料の」空いているリソースを利用するための問題をスピードアップするだけです。アイデア:8台のコンピューターを使用して、問題をおそらく7.9倍速く実行します。これは、8を超えることはできません。

これらすべてがあなた専用の場合は、並行して実行してスピードアップします。そうでない場合は、シングルスレッドのままにして、残りのコアを他の作業に使用できるようにします。

ちなみに、利己的な方法で、キャンパス内のすべてのLinuxにジョブを分割できるグリッドを呼び出すRedHatツールがあります。 (> 200)。それはとても速く走ります、それは皆を遅くするので、ただ捕まらないでください。または、古いツールであるmathlabparallelを使用します。

1
user218473