Schlechte Skalierbarkeit von Parallelcode
Kürzlich habe ich analysiert, wie meine parallelen Berechnungen auf 16-Kern-Prozessoren tatsächlich beschleunigt werden. Und die allgemeine Formel, die ich gezogen habe - je mehr Threads Sie haben, desto weniger Geschwindigkeit pro Kern erhalten Sie - ist mir peinlich. Hier sind die Diagramme meiner CPU-Auslastung und Verarbeitungsgeschwindigkeit:
Sie sehen also, dass die Prozessorlast zunimmt, die Geschwindigkeit jedoch viel langsamer. Ich möchte wissen, warum ein solcher Effekt auftritt und wie man den Grund für unskalierbares Verhalten findet. Ich habe dafür gesorgt, zu verwendenServer-GC-Modus. Ich habe dafür gesorgt, dass ich den entsprechenden Code parallelisiere, sobald der Code nichts weiter tut als
Lädt Daten aus dem RAM (Server hat 96 GB RAM, Auslagerungsdatei sollte nicht getroffen werden)Führt keine komplexen Berechnungen durchSpeichert Daten im RAMIch habeprofiliert Ich habe meine Bewerbung sorgfältig bearbeitet und keine Engpässe festgestellt - es sieht so aus, als würde jeder Vorgang langsamer, wenn die Anzahl der Threads zunimmt.
Ich stecke fest, was stimmt mit meinem Szenario nicht?
Ich verwende die .Net 4 Task Parallel Library.