Warum ist der Durchsatz der MCS-Sperre schlecht, wenn die Anzahl der Threads größer ist als die Anzahl der logischen CPUs

StackOverflow https://stackoverflow.com//questions/20036216

Frage

Warum ist der Durchsatz der MCS-Sperre schlecht, wenn die Anzahl der Threads größer ist als die Anzahl der logischen CPUs.Könnte es an einer erhöhten Konkurrenz um Plätze auf der CPU liegen, die dazu führt, dass viele Threads vorweggenommen werden?

War es hilfreich?

Lösung

Ich bin nicht zu 100% dabei, aber die Microsoft-Bibliothek gibt diese Definition der Sleep() Funktion:

Nach Ablauf des Ruheintervalls ist der Thread betriebsbereit.Wenn Sie 0> Millisekunden angeben, gibt der Thread den Rest seiner Zeitscheibe auf, bleibt aber> bereit.Beachten Sie, dass die sofortige Ausführung eines fertigen Threads nicht garantiert ist.Folglich wird der > Thread möglicherweise erst einige Zeit nach Ablauf des Ruheintervalls ausgeführt.

Wenn ich meiner Erfahrung nach eine MCS-Sperre verwende, um beispielsweise eine Datenstruktur zu aktualisieren, und die Anzahl der Threads, auf denen ich sie ausführe, 16 beträgt, beträgt der Abfall (mit Ausnahme des massiven Abfalls von 1 - 2 Threads) von 8 auf 16 Threads (vorausgesetzt, Sie verdoppeln nur die Anzahl der Threads) ist ziemlich groß.Der Durchsatz sinkt nach einem Thread auf etwa ein Drittel und sinkt dann langsam auf, wenn sich die Anzahl der verwendeten Threads der Anzahl der CPUs nähert.Wenn Sie eine Sperre verwenden, haben Sie natürlich umso mehr Threads, die versuchen, die Sperre zu erlangen, mehr Cache-Cache-Kohärenzarbeit für die CPU zu erledigen.

Wenn Sie atomare Anweisungen verwenden (wieder vorausgesetzt, Sie sind), je mehr Threads Sie hinzufügen, desto langsamer wird dies.

"Ich glaube nicht, dass das Problem darin besteht, dass atomare Operationen selbst länger dauern werden.";das eigentliche Problem könnte sein, dass eine atomare Operation Busoperationen auf anderen Prozessoren blockieren könnte (selbst wenn sie nicht-atomare Operationen ausführen)."

Dies wurde von einem anderen Mitglied von Stackoverflow über ein ähnliches Problem übernommen.Verbinden Sie das mit der Tatsache, dass ein Thread schlafen kann oder nicht, sogar mit der Verwendung von Sleep(), und kann oder kann nicht sofort aufwachen, was zu einem ernsthaften Verlust des Durchsatzes führen könnte.Sie haben auch den erhöhten Busverkehr zu bewältigen...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top