実行するジョブのセットが多数(数千)あり、それぞれが1つのCPUで30分から数時間かかります。メモリ要件は小さいです(それぞれ数KB)。私は数十個のCPUを搭載した小さなLinuxクラスターに取り組んでいます。これまで、クラスターを手動でビジー状態に保とうとして、一度に数個実行して開始しました。
私の質問は、CPUの数よりはるかに多い数百または数千を一度に送信するとどうなりますか?各ジョブを個別に実行するのに時間がかかることは明らかですが、CPUごとに一度に1つのジョブを実行するのと比較して、この方法の全体的な効率について疑問に思っています。進行状況を監視し、各CPUを正確に1つのジョブで占有し続ける(Pythonでのマルチプロセッシングの使用など)、より複雑なメソッドを作成することもできますが、これにはコストのかかるプログラマーの時間がかかり、最終結果が本当になるかどうか疑問に思います。より速く。
速度的には、スレッドがスリープ状態に多くの時間を費やしていない限り、使用可能な物理スレッドよりも多くのスレッドを生成してパフォーマンスが向上する可能性はほとんどありません(その場合、他のスレッドに実行の機会が与えられます)。スレッドのスリープは、I / Oバウンドのプロセスやロックを競合するときに、暗黙的で非表示になる可能性があることに注意してください。
それは本当にあなたのスレッドが何かを待つことにほとんどの時間を費やしているかどうかに依存します(例:サーバーからより多くのデータが来る、ユーザーが何かをする、ファイルを更新する、ロックされたリソースにアクセスする)並行して可能な限り高速に。後者の場合、物理的に利用可能なスレッドよりも多くのスレッドを使用すると、速度が低下する傾向があります。タスクよりも多くのスレッドを持つことがスループットを向上させる唯一の方法は、それらのスレッドがスリープ時間を浪費し、他のスレッドがスリープ中に多くのことを実行する機会を生み出すことです。
ただし、これらすべてのタスクを生成して、オペレーティングシステムにスケジューリングを処理させる方が簡単な場合があります。
スレッドが大幅に増えると、(スループットの観点からも)速度が低下する可能性があります。スケジューリングとスレッドプールがどのように機能するか、およびそれらのスレッドがスリープに時間を費やすかどうかによって多少異なりますが、スレッドを構築するのは必ずしも安価なものではなく、その数のスレッドを使用するコンテキストスイッチは、独自のスケジューリングプロセスよりも高価になる可能性があります。実行する必要のある大量のスレッドを確認するだけのオペレーティングシステムよりも、正確に何をしたいのか、いつ適切なのかについて、より多くの情報があります。
Intelのスレッドビルディングブロックのような効率的なライブラリが、プール内のスレッドの数を物理ハードウェアに一致させるのには理由があります(それ以上でもそれ以下でもありません)。これは最も効率的なルートになる傾向がありますが、手動のスケジューリングや作業の盗用などの必要性を考えると、実装するのが最も厄介です。したがって、一度に大量のスレッドを生成するだけで便利な場合もありますが、通常は実行しません。他の回答で指摘されているようにI / Oバウンドであり、スレッドがほとんどの時間をスリープして入力を待っている場合を除いて、最適化としてこれを行います。
このようなニーズがある場合、それを最大限に活用する最も簡単な方法は、優れた並列処理ライブラリ(PPL、TBB、OMPなど)を見つけることです。次に、並列ループを作成し、ライブラリがスレッドを最も効率的に処理し、スレッド間の負荷を分散する方法に焦点を合わせます。このような場合、タスクが実行する必要があることに焦点を当てますが、必ずしもタスクが実行されるとは限りません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加