2017-09-28 9 views
0

コンテキストスイッチの特定の最悪のシナリオがどのように起こるかを理解したいと思います。 1つのプロセスを実行するCPUコアが10個あるとします。すべてがCPUを大量に消費し、スレッドがスリープしていない(I/Oを待っている)コンテキストスイッチ:最悪のシナリオではどうなりますか?

(私が主流の現代のパーソナルコンピュータアーキテクチャやシステム、WindowsやLinuxで一般的にx64のを主としています...)私が間違っている場合

が私を修正:10 CPU/RAM集中的な独立したスレッドを実行することはほとんどあり多くの場合、ほぼ最適な状況です。コンテキスト切り替えに費やされる時間は、ごくわずかです。 RAMキャッシュのリセットを引き起こすラウンドロビン方式で異なるコアにスレッドを再属性することを時々決定することがありますが、ほとんどの場合、各スレッドが単一の固定コアで実行されているかのように動作します。

すべてのスレッドが共有するため、メインRAMバスだけが制限される可能性がありますが、ここで私が興味を持っているポイントではありません。スレッドの数を減らしても、スループットは向上しません。

ここではまだコアが10個ありますが、1000個のスレッドが実行されているとします。スケジューラは理論的には、1秒間に10スレッドを実行し、次に10スレッドを実行することはまれに(1秒ごとに)切り替えることになりますが、全体としては最適なパフォーマンス(スループット)に近いものになります。

しかし、そうではないようであり、スレッドが集中的に切り替えられ、強く最適ではないパフォーマンス(スループット)を引き起こすようです。私はそれについて正しいですか?この準最適なパフォーマンスの主な原因は何ですか?たとえば、1秒あたりのスイッチ数、切り替えによるパフォーマンス低下などの大きさの目安がある場合は、数があればいいと思います...

+0

WindowsのようなOSでは、プロセッサを別のプロセッサに切り替える前に3クロックティックでスレッドを実行できます。だから約47ミリ秒。コンテキストスイッチの実際のコストは、プロセッサキャッシュ内のデータをいかに悪いかに大きく左右されます。最近の最悪のケースは約15,000サイクルです。したがって、約0.01%のオーバーヘッドである3 GHzコアでは、何千ものスレッドを積極的に実行することはスループットにとって決して良いことではなく、計算サイクルは有限のリソースです。 –

答えて

0

私は自分の質問に答えるつもりです)。 Windows上で

、コンテキストスイッチの数は、パフォーマンスカウンタで測定することができます。https://technet.microsoft.com/en-us/library/cc938606.aspx

私は私のマシン(コアi7の/ Windowsの10)でそれを測定したときの大きさの順序は、コアによって1000 /秒程度であります実行中のスレッドの数はコアの数を超えています(これらのスレッドは完全なCPUです)。

コンテキストスイッチに要する時間は、に応じてかなり変化:

FPUレジスタは
  • 保存する(当然の)プロセッサモデルが必要な場合
  • を保存するために必要なレジスタ

    あなたは読むことができます:https://www.quora.com/How-long-does-a-context-switch-takeまたはhttp://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html

    少し悲観的な平均。大きさのオーダーは1000nsと思われる。したがって、各コアのすべてのコンテキストスイッチの合計時間は、毎秒1ms、つまり0.1%です。

    これはスレッドの数に依存しません。スレッドを100または1000にすると、スイッチの数は変更されません。結論として、コンテキストの切り替えに費やされる時間はいくらか無視できる程度です。

    この理由は、スレッドが少数のローカル変数のような小さなメモリの読み書きしか持たない純粋なCPUであれば正当です。私は完全なCPUスレッドでテストを実行し、数千と1000のスレッドの違いは目立たない。

    しかし、RAMを使用すると状況が変わり、スイッチによってCPU(メモリ)キャッシュの効率が低下します。

    • 計算が
    • データの各部分がちょうどコア
    • それぞれのメモリ・キャッシュ(たとえばL1又はL2)に嵌合
    • 千の独立した「データ」の部分に分割することができる:悪い場合はいつであります部分を何度も読み取る必要があります

    このような状況では、10個のスレッドを完了してから10個のスレッドを実行すると、キャッシュを最大限に活用し、一度に1000個のスレッドを実行するとキャッシュが1msの間だけ有効です。

    しかし、複数のスレッドのデータがキャッシュに収まる場合、またはスレッドが共通のデータをある程度読み込んだ場合、または各スレッドがデータを1回だけ読み取る場合は、 100回のスレッドは同様のスループットを持ちます。

    これは、メモリアクセスに対する適応並列性の問題です。そして、それはメモリがアクセスされる必要がある方法に非常に依存します。

    コンテキスト切り替えにかかる時間はごくわずかですが、メモリのアクセスと共有の仕方によっては、キャッシュの誤った使用により失われる時間が問題になることがあります。

  • 関連する問題