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?
12
Antworten:
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.
quelle
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.
quelle
nice
.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.
quelle
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.
quelle
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.
quelle