2017-01-03 10 views
-1

IOで50%を費やすプログラムにコアを追加することで何かを得ることはできますか?私は完全にIOバウンドとCPUバウンドの簡単なケースを得ますが、各スレッドがIOを待っている時間の一部を費やすシナリオでは完全にはわかりません。スレッド数が50%のIO競合が発生しているプログラムの実行時間が増加すると、コア数が増加しますか?

私の直感は、コアを追加することによって、各スレッドがIOの競合を増やすということです。だから今、各スレッドは、IOを待っている時間の60%を費やしているかもしれません。その結果、純中性または正味ネガティブネガティブです。

EDIT
Threads: Fast IO - Slow CPU
Threads: Balanced IO and CPU

これらは私がスレッド/コアを追加すると、IO待ち時間にどのように影響するかを理解しようとしています簡単な状況のいくつかの例の図です。

私が見ることは、タスクIO時間とタスクCPUの比率が、追加のスレッドの有用性を決定することです。たとえば、IO = 10ms、CPU = 40msの場合、合計タスク時間は50msです。 50ms/10ms = 5であるため、この状況は5つのスレッドの恩恵を受ける可能性がありますが、パフォーマンスが向上しない可能性があります。

これは間違いありませんか?

+0

プログラムがI/Oで50%を費やしているスレッドを1つ持っている場合、別のスレッドを追加すると2倍の速さになります。 IOの待機時間は、もう一方の計算時間と重複します。 3番目のスレッドを追加してもそれが速くなるわけではありません。 –

+0

@HansPassant私は少し混乱しています。 10スレッド/コアが稼働していて、IOの待機時間の50%を費やした場合はどうなりますか?スレッド/コアを20倍にすると、実行時間が半分になりますが、それ以上のコアは役に立たないでしょうか? – nathan

+0

次に、適切な結論はベンチマークにバグがあるか、誰かが宿題を完成しようとしていることです。あなたは宿題をしていることを自分で考えなければなりません。 –

答えて

0

です。あなたは "I/O競合"をどのように定義しますか?現在のスレッドがすべて共有I/Oデバイス/メディアを使用しようとしていて、それを使用するために「並行して待機」しなければならないということを意味する場合:はい、それにはを追加することが望ましいでしょう。スレッドを同じキューに入れると、待機時間の割合が増えます。

このように見てください。共有I/Oが非常に予測可能な場合はどうでしょうか。共有メディアでI/O要求を行うたびに、10ミリ秒かかると言います。次に、すべてのスレッドで最大100のI/O要求を毎秒行います。もしあなたが10個のスレッドを持っていれば、各スレッドは平均して10個/秒の要求を出します。 CPUをそれに合わせてスケーリングすると、そのCPU使用量が要求を中心にしていると仮定しましょう。つまり、I/O要求ごとに格納される計算を実行するのに50msかかると仮定します。あなたは現在、 "I/O競合"にあなたの時間の50%を費やしています。 1秒ごとに[要求を準備する(50ms)+ I/O(50ms)を行う]の10サイクルが得られます。

ここで、10個のスレッドを20個に増やすと、同じ制限付き100個の要求/秒リソースを使用しようとするスレッドの数が2倍になります。現在、各スレッドは平均して1秒あたり5回のリクエストしか作成できません。これは、要求を準備するCPU時間で1秒あたり250ms(5 x 50ms)を費やしており、I/Oキューで750ms待機していることを意味します。だから、スレッド数を2倍にすることで、スレッドごとの時間の75%を共有リソースの競合に費やしています。

スレッドを追加すると、I/Oの競合が増え続けます。常にスレッドが進行しているため、平均で100%になることはありませんが、近づけることができます。スレッド数が100の場合、1秒ごとに1回のリクエストしか完了しません(したがって、50ms CPU +待機時間950ミリ秒=競合率95%)。 1000スレッド/コアの場合は、毎秒10分の1の要求で完了します(99.5%の競合、各スレッドは50msで動作し、I/O時には9.95秒待機します)。

+0

これは感謝します、ありがとう。私は実際に私の質問を編集し、あなたが何を記述しているかの図を追加しました(わずかに異なる数字で)。より多くのスレッドの競合がパフォーマンスが悪化すると思って自分自身を混乱させると思います。私が物事を正しく理解しているなら、まとめてより多くの処理が行われている限り、個々のスレッドがより多くの競合を持っていても、スレッドを追加すると役に立ちます。最終的に、スレッドを追加することは、私が物事を正しく理解しても役に立ちません。 – nathan

+0

うん。私はそれがあなたのスレッドが何をしているのか正確に依存していると言いたい。 *実行されているI/Oが達成しようとしている最終結果*である場合、I/Oリソースが一度飽和してしまえば、新しいスレッドを追加することはほとんどありません。 –

+0

I/Oの動作にも違いがあります。たとえば、現代のOSでI/Oを書いている場合(つまり、ハードディスクに)、通常は瞬間的です(キューがいっぱいになるまで*少なくとも)*つまりOSは「そうですI/Oが実際にキューに入れられているにもかかわらず、「完了」されます。一方、I/Oの読み込みはシリアル/同期の傾向があります。通常、終了するまで続行できません。 –

関連する問題