Wie viele Kerne soll ich für Berechnungen verwenden? #cores oder #cores -1?

12

Ich habe eine große Rechnung zu machen. Obwohl ich alle Kerne nutzen kann, dachte ich, gibt es einen Grund, 1 Kern wegzulassen und ihn nicht zu nutzen? (Berechnung CPU nur kein IO). Oder unterschätze ich das Betriebssystem, das es nicht handhaben und den richtigen Kontextwechsel durchführen kann, selbst wenn ich alle Kerne verwende?

Jas
quelle
8
Die Nutzung aller Kerne ist ein guter Anfang, und ein bisschen Aberglaube, dass sich das Betriebssystem mit "-1 Kernen" besser verhält, ist wahrscheinlich nur - Aberglaube, aber Sie sollten ihm tatsächlich ein Profil geben, wie es sich für Ihre Berechnung, Ihre Hardware und Ihr Betriebssystem verhält.
Doc Brown
In vielen Fällen ist die Verwendung von # Kernen + 1 sehr sinnvoll. Wenn Sie nur #cores verwenden, erzwingt jede unerwartete Blockierung (z. B. ein Seitenfehler) unnötigerweise, dass ein Core inaktiv ist.
David Schwartz

Antworten:

28

Wichtige Betriebssysteme sind ausgereift genug, um mit Prozessen umzugehen, die jeden verfügbaren Kern verwenden. Andere Prozesse sind möglicherweise (und häufig) betroffen, die Berechnung wird jedoch nicht langsamer, da Sie alle verfügbaren Kerne verwendet haben.

Die Wahl der Anzahl der Kerne hängt mehr von Ihrer Absicht ab, etwas anderes zu tun, während die Berechnung ausgeführt wird.

Wenn Sie auf einem Desktop-Computer in der Lage sein möchten, Ihren Webbrowser zu verwenden oder ein Video anzusehen, während die Berechnung ausgeführt wird, sollten Sie einen Core dafür freihalten. Wenn der Server zwei Aufgaben ausführt (z. B. Berechnungen und gleichzeitig die Verarbeitung und Berichterstellung seiner Metriken), ist es eine gute Idee, einen Kern für die Nebenaufgabe frei zu halten.

Wenn Sie dagegen vorrangig die Berechnung so schnell wie möglich durchführen möchten, müssen Sie alle Kerne verwenden.

Arseni Mourzenko
quelle
7
Moderne OS-Scheduler sind eigentlich ziemlich gut darin, interaktive Programme bei hoher CPU-Auslastung interaktiv zu halten, solange die interaktiven Programme nicht auch viel CPU verbrauchen (was
natürlich
Hinweis: Auch auf Servern kann es nützlich sein, wenn Sie in der Lage sein möchten, ssh auszuführen und eine schnelle Antwort zu erhalten, indem Sie Core 0 alleine lassen.
Matthieu M.
11

Es hängt davon ab, ob.

Wenn der Computer für diese Berechnung vorgesehen ist, sollten Sie alle Kerne verwenden - nicht verwendete Computerressourcen beschleunigen die Arbeit nicht .

Wenn Sie einen Echtzeit-Scheduler, einen nicht präemptiven Scheduler oder eine Prozessoraffinität verwenden, sollten Sie etwas vorsichtiger vorgehen, da es leicht ist, versehentlich andere Prozesse von allen Computerressourcen auszuschließen. Sie müssten diese Einstellungen jedoch manuell ändern, damit etwas schief geht. Daher gibt es hier auf den meisten Betriebssystemen standardmäßig kein Problem.

Wenn die Maschine nicht für die Berechnung vorgesehen ist, ist es möglicherweise nicht ideal, 100% für die Berechnung anzugeben. Zum Beispiel, wenn Sie einen Webbrowser verwenden, während die Berechnung ausgeführt wird. Da die Last Ihrer Maschine gelegentlich über 100% steigt, fühlt sie sich träge an. Durchsatzorientierte Aufgaben wie die Berechnung werden nicht wirklich verlangsamt, aber latenzempfindliche Aufgaben wie GUIs werden nicht so schnell reagieren. Es ist dann sinnvoll, nur NPROC-1-Threads / -Prozesse für die Berechnung zu starten. Alternativ könnte die explizite Verwendung einer niedrigeren Priorität für die Berechnung als für normale Aufgaben dieses Problem lösen. In diesem Fall sollte die Berechnung NPROC-Prozesse verwenden, um keine Ressourcen zu verschwenden.

amon
quelle
3
"Wenn Sie einen Webbrowser verwenden, während die Berechnung ausgeführt wird [...], fühlt es sich träge an. Durchsatzorientierte Aufgaben wie die Berechnung werden nicht wirklich verlangsamt, aber latenzempfindliche Aufgaben wie GUIs reagieren nicht so schnell. [ …] Eine explizite Verwendung einer niedrigeren Priorität für die Berechnung als für normale Aufgaben könnte dieses Problem lösen nice.
Jörg W Mittag
2
"ungenutzte Computerressourcen beschleunigen die Dinge nicht", technisch könnten sie. Die Verwendung von weniger Kernen kann eine höhere Taktrate ermöglichen und die Synchronisation verringern, was die Dinge möglicherweise beschleunigt oder nicht.
Davidmh
2
Zusätzlich zu @Davidmh werden die Anmerkungen auf der CPU-Seite L1 $ und L2 $ in gewissem Maße zwischen den Threads geteilt und L3 $ wird über den gesamten Socket geteilt, sodass die Verwendung von mehr Threads zu erhöhten Verlangsamungsverlusten führen kann. Insbesondere, wenn der Prozess speichergebunden statt prozessorgebunden ist.
Maciej Piechotka
WENN Sie die Thread- / Prozessprioritätsstufen entsprechend festlegen, können Sie die Auswirkungen der Hintergrundarbeit auf interaktive Prozesse verringern. Ich habe über ein Jahrzehnt lang verteilte Computeranwendungen auf meinem PC ausgeführt. und da CPU-Rechenaufgaben mit niedriger Priorität ausgeführt werden, ist meine Fähigkeit, Browser und andere normale Desktop-Apps zu verwenden, nicht beeinträchtigt. Die gemeinsame Nutzung von Ressourcen auf der GPU ist nicht so weit fortgeschritten, und ich habe gelegentlich Probleme mit GPU-beschleunigten HTML5-Videos (egal, Spiele), während ich GPU-Computing im Hintergrund ausführte. Multi-Thread-Spiele können selbst mit leichtem GFX problematisch sein. win starves threads 2+
Dan ist Fiddling von Firelight
1

Ich bin etwas umsichtig, wegen seiner negativen Stimmen mit @motoDrizzt unten übereinzustimmen :), aber das war in der Tat meine eigentliche Erfahrung - mehr ist besser, sogar über die tatsächliche Anzahl der Kerne hinaus (aber nicht Tausende). Schauen Sie sich zum Beispiel http://www.forkosh.com/images/avoronoi.gif an, wo jede 2D-Ebene dieses 3D-Voronoi-Diagramms unabhängig generiert werden kann. Das Programm verwendet das Attribut nfork = n query_string, um die Berechnungen für n Ebenen "gleichzeitig" abzweigen .

Mit einem Vierkernprozessor verringert sich die (Benutzer-) Zeit zum Vervollständigen des Diagramms mit nfork nahezu linear, bis zu etwa nfork = 8 (vier Kerne mit Hyperthreading). Aber nach 8 verringert sich die Zeit immer noch, wenn auch langsamer. Und über ungefähr 16 hinaus keine weitere merkliche Verbesserung. Ich habe dieses Verhalten überhaupt nicht analysiert, schreibe es aber naiv den Jonglierprozessen des Betriebssystems (in diesem Fall Linux Slackware 14.2x64) zu, um die Gesamtleerlaufzeit noch weiter zu reduzieren.

John Forkosh
quelle
0

Die beste Wahl ist systemabhängig. Sie möchten also beide Versionen auf einem realen System ausführen und dann überprüfen, wie das System reagiert. Können Sie weiterhin Browser, Texteditor und andere Dinge auf Ihrem System verwenden? Und ist die Leistung besser, wenn n Threads und nicht n-1 verwendet werden? Was passiert, wenn Sie die App zusammen mit einer anderen App ausführen, die versucht, alle CPUs zu verwenden?

Und dann müssen Sie Hyperthreading in Betracht ziehen. Mit vier Kernen plus Hyperthreading könnten Sie 8 Kerne oder 7 Kerne verwenden. Probieren Sie erneut die Reaktionsfähigkeit des Systems und die Zeit bis zum Abschluss aus.

Und schließlich sollten Sie Ihre Arbeit in mehr Blöcke als Threads aufteilen. Der Grund dafür ist, dass unterschiedliche Threads den Job zu unterschiedlichen Zeiten abschließen und Sie möchten, dass etwas Arbeit den schnelleren Threads überlassen wird. Andernfalls müssen Sie warten, bis der letzte Thread beendet ist.

PS. "Hyperthreading kann bei FPU - intensivem Code nicht helfen, da es nur eine FPU gibt". Absolut falsch Selbst mit FPU-intensivem Code ist es aufgrund von Latenzen unglaublich schwierig, die FPU voll auszunutzen. Hyperthreading hilft, da doppelt so viele unabhängige Operationen für die Planung verfügbar sind.

gnasher729
quelle
-4

Ich weiß nicht, wie ich das so schreiben soll, dass es nicht "schlecht" klingt, also nimm es einfach als freundliche Bemerkung, ok?

Wenn man bedenkt, dass ein durchschnittlicher PC normalerweise bereits tausend oder mehr Threads hat, was lässt Sie denken, dass die Verwendung von 8 vs 7 einen Unterschied macht? :-)

Verwenden Sie so viele Threads wie möglich. Und wenn Sie sich nicht um die Reaktion des Betriebssystems kümmern müssen und Ihre Threads längere Zeit (mehr als eine Sekunde) laufen, können Sie sogar mit der doppelten Anzahl von Kernen experimentieren.

motoDrizzt
quelle
3
Aber die meisten dieser Tausenden von Threads verbrauchen nicht 100% der CPU, oder?
Andreas Rejbrand
1
Die Verwendung der doppelten Anzahl von Kernen verbessert im Allgemeinen die Rechenzeiten nicht. Tatsächlich ist es im Allgemeinen nicht vorteilhaft, mehr als die Anzahl der physischen Kerne zu verwenden, selbst wenn Sie über mehr logische Kerne verfügen (über HyperThreading usw.; dies hängt jedoch möglicherweise von der genauen Aufgabe ab, die Sie ausführen). Quelle: Erfahrungen aus der Vergangenheit mit MATLAB Parallel Processing.
Sanchises
1
@Sanchises Dies liegt daran, dass Hyperthreading quasi-parallele Befehlsverschachtelung nutzt - dies ist effektiv für verzweigten und speicherintensiven Code. Matrixberechnungen sind sehr FPU-intensiv und es gibt nur eine FPU pro physischem Kern, sodass Hyperthreading nicht hilfreich ist.
J ...