Multithread-CPU-Intensivtask drosselt die CPU weit vor den Temperaturgrenzen


21

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?


1
Ich liebe diese Frage! Wie wäre es mit einer anderen spezifischen Multithread-Aufgabe? Ich würde vorschlagen, so etwas wie eine ffmpeg-Task auszuführen (auf einem 1080p- oder 4K-Video, um sicherzustellen, dass alle verfügbaren CPU-Ressourcen verwendet werden), und zu prüfen, ob es gedrosselt wird. Dies kann das Problem
eingrenzen

1
Wenn ich den Cinebench R15-Benchmark verwende, werden die Thread-Tasks verwendet und wie erwartet ausgeführt. Die Temperatur steigt auf ca. 100 ° C und die Lüfter werden aktiviert. Intel Power Gadget zeigt, dass die CPU-Frequenz immer noch in der Nähe von 3,3 GHz liegt. Es sieht also nicht nach einem Hardwareproblem aus. Der gesamte Code ist nur C-Code mit nichts, was Sie gerne mit p_threads und minimalen Mutex-Sperren hätten. Das Programm besteht hauptsächlich aus der Verarbeitung von DNA-Sequenzen, wobei ein Thread etwa 16 GB Daten einliest und an n einzelne Threads weiterleitet, um eine hohe Anzahl von Daten zu erhalten.
markatlnk

1
Sieht es so aus, als könnten andere Programme die von Ihnen angestrebte Grenze überschreiten? Wenn das Problem nur von Ihrem speziellen Code herrührt, benötigen wir möglicherweise weitere Informationen zu diesem Code. Doch wo sollen Ihre Daten verarbeitet werden? Extern? Wie viel Arbeit berichtet kernel_task? Andere Temperatursensoren?
LongLang

1
Ihre CPU verfügt über 8 logische Kerne, nicht über 4, sodass 4 Threads 50% der gesamten CPU-Auslastung ergeben. Ich frage mich, ob das die Lastschätzung Ihres Systems beeinflusst.
Sudo

Ich weiß nicht, ob Sie die Probleme lösen möchten, aber Sie könnten stattdessen versuchen, das Debuggen auf Kernel-Ebene mit dem Debug-Kernel durchzuführen. Sie können es bekommen, wenn Sie mehr in Downloads auf der Apple Dev Site klicken.
user3052786

Antworten:


1

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


0

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.


3
AFAIK die Apple-Kexts sind nicht Open Source. (Seltsamerweise?) Die beste Informationsquelle ist die Hackintoshing-Community, da Treiber eingespritzt werden müssen.
JMY1000,

Gar nicht komisch! Die Bastler geben den besten Rat, weil sie viel mehr wissen, als sie aus erster Hand wissen sollten. Denken Sie hinsichtlich der konservativen CPU-Einstellungen daran, dass der MBP über einen hervorragenden Kühlkörper für die Burst-Leistung verfügt, jedoch nicht für anhaltende Zyklen. Es ist sehr wahrscheinlich, dass dieses Problem auf Apple zurückzuführen ist, das vorbeugend verhindern möchte, dass Ihre Beine gekocht werden. Ich habe darüber mit dem 2012MBP von ein paar Klagen gehört.
user1901982

0

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.


-2

Ist mir mit schlecht implementierter Thread-Kontrolle passiert, meine Schuld. Führen Sie nur nicht zu viele Threads auf einer Dual-Core-CPU aus.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.