スレッド数が論理CPUの数より多い場合、MCSロックのスループットが悪いのはなぜですか
-
21-12-2019 - |
質問
スレッド数が論理CPUの数より多い場合、MCSロックのスループットが悪いのはなぜですか。 CPU上の場所に対する競合が増えているためである可能性がありますか?
解決
私はこれで100%ではありませんが、MicrosoftライブラリはSleep()
関数のこの定義を示します。
スリープ間隔が渡されたら、スレッドを実行する準備ができています。 0>ミリ秒を指定した場合、スレッドはそのタイムスライスの残りの部分を放棄しますが、[準備完了]のままになります。すぐに実行することはできないスレッドが保証されていないことに注意してください。その結果、>スレッドは、スリープ間隔が経過してからある程度まで実行されない可能性があります。
MCSロックを使用している場合は、データ構造とデータ構造を更新し、それを実行しているスレッドの数を更新します。 16個のスレッドに(あなたがただスレッド数を2倍にしていると仮定)はかなり大きいです。スループットが1つのスレッドの後に約3分の1に低下し、使用されているスレッドの数がCPUの数に近づくにつれてゆっくり低下します。明らかにロックを使用している場合は、ロックを取得しようとしているスレッドが多いほど、CPUが実行するためのキャッシュキャッシュコヒーレンシーが多くなります。
原子命令を使用する場合(もう一度想定)遅いスレッドを追加すると、これが遅くなります。
「問題は原子業務がそれ自体が長くなるということであるとは思わない。本当の問題は、原子運用が他のプロセッサでバス操作をブロックすることができる可能性があるかもしれません(たとえ非原子動作を実行しても)。 "
これは、類似の問題についてのスタックオーバーフローの他のメンバーから取られました。 Sleep()
を使用しても、スレッドが眠っているか眠らない可能性があるという事実で、スループットが重大な損失を引き起こす可能性があります。また、対処するためのバストラフィックの増加もあります。