4

n個のコアでいくつのスレッドを実行する必要があるかをよりよく理解しようとしています。私はこれが複雑な質問であることを知っています。その答えは、共有状態がどれだけあるか、各スレッドがリソースをどれだけスリープして待機しているかなど、多くの要因に依存します。

簡単にするために、2 つのコアと、その作業を共有状態のないスレッドに分割できるプロセスが 1 つだけあるとします。各スレッドが、スリープもリソースの待機もせずに、計算の後に計算を実行するとします。この場合の理想的なスレッド数は 2 でしょうか?

少し複雑にして、スレッドが何らかのディスク I/O を実行する必要があるとしましょう。これは私たちの答えをどのように変えますか? この場合、2 つ以上のコアを持つことができると思います。

または、リソースのスリープや待機を行わず、代わりに、両方がアクセスできるメモリがあり、同期が必要だとします。これは私たちの答えをどのように変えますか? この場合、どの程度の同期が必要かにもよりますが、実際には 2 スレッドよりも 1 スレッドを好むかもしれません。

4

2 に答える 2

2

これは、一般論で答えるのが難しい質問です。それは実際には、ケースの詳細に依存します。覚えておくべきことは、コンテキストスイッチを行うにはコストがかかるということです.計算だけを行う場合、1つのコアで2つのスレッドを実行するのは無駄です(実際には何も得られないため、コンテキストスイッチでのみ失われます)。一方、リソースを待っていて、同時に他の計算を続行できる場合は、それらのリソースを待機するスレッドを用意して、実行全体が遅れないようにすることをお勧めします。

于 2013-03-03T20:19:03.973 に答える
2

IO に関しては、コアあたりのスレッド数については考えません。物理デバイスごとのスレッドの観点から考えます。個々のデバイスごとに最適な DOP が異なります (磁気ディスク = 1、SSD は少なくとも 4、ネットワークはそれよりはるかに高い)。

CPU バウンドの作業の場合、最適な数は 1 (コアあたり) です。

混合ケースまたはそれよりも複雑なケースでは、一般的な答えを与えることはできません. システムは驚くべき方法で動作する可能性があります (負荷がかかると崩壊するなど!)。ここでのアプローチは、さまざまな DOP をテストし、最良のものを使用することです。一般に、最適な値は 1 つだけですが、1 と無限大の両方のパフォーマンスははるかに悪くなります。したがって、非常に簡単な単一の最大値を見つけるだけで済みます。

于 2013-03-03T20:30:21.117 に答える