Ich habe eine sehr CPU-intensive Thread-Aufgabe geschrieben, die auf meinem 2012 MacBook Pro Quad Core wie erwartet funktioniert. Ich drehe es locker mit 20 Threads und die Temperaturen erreichen ungefähr 100 ° C, gemessen mit Intel Power Gadget mit minimaler Drosselung.
Nehmen Sie die gleichen Programm- und Datendateien mit nach Hause zu meinem 2016 13 "MacBook Pro mit einem Dual-Core-Computer und starten Sie es. Ich würde erwarten, dass es auch die 3,3-3,4 GHz beibehält, bis die Temperatur die 100 ° C-Marke erreicht. Der obere Befehl zeigt die Aufgabe bei 350% (2 Kerne pro Dual-Thread), aber die CPU-Frequenz wird auf 1,6-1-8 GHz gesenkt, wobei die Temperatur nur bei etwa 60 ° C liegt und die Lüfter absolut leise sind Bei Single-Threaded-CPU-Aufgaben verhält sich die Maschine wie erwartet und behält 3,3 bis 3,4 GHz bei, bis die 100 ° C erreicht sind und die Lüfter anspringen. Die Frage ist, warum meine CPU gedrosselt wird.
Beide Maschinen sind auf dem neuesten Stand und führen die gleichen Versionen von gcc aus. Wenn ich die Binärdatei sogar von der Arbeitsmaschine nehme und sie auf den Mac 2016 lege, hat sie das gleiche Problem.
Wenn ich 3 oder 4 CPU-Einzelthreads ausführe, damit die Maschine mit voller Geschwindigkeit läuft, starte ich das Thread-Programm und verlangsame die Frequenz ebenfalls.
Beide Computer verfügen über 16 GB RAM.
Bearbeiten
Nachdem ich mit Code herumgespielt habe, vermute ich, dass er gedrosselt wird, wenn eine Aufgabe zu viele Threads erstellt. In diesem Programm nehme ich jeden Datensatz, den ich lese, und erstelle einen Thread dafür. Ich lasse nur ungefähr 20 Threads gleichzeitig laufen, sodass es zu keinem Zeitpunkt mehr als 21 Threads gibt, aber es gibt 14.400.000 zu verarbeitende Datensätze in den ungefähr 30 Minuten. Jeder dieser Datensätze wird von einem separaten Thread verarbeitet.
Ich habe ein triviales pthread-Programm erstellt, das die CPU-Zeit verschwendet und 10 davon zum Laufen gebracht hat. Das Problem Laptop lief und erwärmte sich auf 95C ohne Probleme.
Ich denke, ich werde meinen Code umschreiben, um denselben Thread wiederzuverwenden, anstatt sie zu zerstören und neu zu starten.
Update 13.05.17
Nach mehreren Stunden Arbeit werden nur noch n Threads erstellt und wieder verwendet, was nicht geholfen hat. Was verursacht, abgesehen von der CPU-Temperatur, ein Drosseln dieses Computers?
quelle
Antworten:
Dies mag ein langer Weg sein, aber vielleicht ist der Unterschied zwischen der Single-Core-Leistung und / oder der Cache-Leistung zwischen den CPU-Paketen von 2012 und 2016 groß genug, dass die Kerne nicht mehr ausreichen und gedrosselt werden, bis sie wieder funktionsfähig sind?
Ich nehme das an, weil Sie angeben, dass genügend Single-Thread-Prozesse auf allen Kernen mit voller Geschwindigkeit ausgeführt werden können und ein einfaches Multi-Thread-Programm auf allen Kernen mit voller Geschwindigkeit ausgeführt werden kann.
Das lässt mich glauben, dass das Programmdesign Ihrer tatsächlichen Auslastung im Vergleich zu der Test-Multithread-Auslastung etwas enthält, das die CPU nicht immer zum Laufen bringt
quelle
Die Kernel-Erweiterung /System/Library/Extensions/AppleACPIPlatform.kext steuert viele Temperatur- und CPU-Sicherheitsmaßnahmen. Es ist offensichtlich bereits auf Ihrem System kompiliert, aber es ist möglicherweise unter https://opensource.apple.com verfügbar (ich kann es nicht finden, habe es aber nur kurz betrachtet). Es würde mich nicht überraschen, wenn Apple sehr konservative Einstellungen für die CPU-Fähigkeit hätte.
quelle
Immer wenn das Betriebssystem Threads als unvorhersehbar erkennt und diese außer Kontrolle geraten, wird es gedrosselt, um Hardware- und Systemstabilität zu gewährleisten. Das Modell von 2012 verhält sich anders und blockiert möglicherweise im schlimmsten Fall. Ist mir mit schlecht umgesetzter Thread-Kontrolle passiert, meine Schuld. Führen Sie nur nicht so viele Threads auf einem Dual-Core.
quelle
Ist mir mit schlecht implementierter Thread-Kontrolle passiert, meine Schuld. Führen Sie nur nicht zu viele Threads auf einer Dual-Core-CPU aus.
quelle