CPU-intensive Aufgaben mit mehreren Threads drosseln die CPU weit vor den Temperaturgrenzen

Ich habe eine sehr CPU-intensive Thread-Aufgabe geschrieben, die wie erwartet auf meinem 2012er MacBook Pro Quad-Core funktioniert. Ich drehe mit 20 Threads locker und die Temperaturen steigen auf etwa 100 °C gemessen mit Intel Power Gadget bei minimalem Throttling.

Nehmen Sie das gleiche Programm und die gleichen 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 aufrechterhält, bis die Temperatur in die Nähe der 100 ° C-Marke kommt. Top-Befehl zeigt die Aufgabe bei 350% (2 Kerne mit jeweils zwei Threads), aber die CPU-Frequenz wird auf 1,6-1-8 GHz reduziert, bei einer Temperatur von nur etwa 60 °C und leisen Lüftern.Wenn ich 4 separate starte Single-Threaded-CPU-Tasks verhält sich die Maschine wie erwartet und hält die 3,3-3,4 GHz aufrecht, bis sie die 100 ° C erreicht und die Lüfter anspringen. Die Frage ist, warum wird meine CPU gedrosselt?

Beide Maschinen sind auf dem neuesten Stand und führen die gleichen Versionen von gcc aus. Wenn ich sogar die Binärdatei von der Arbeitsmaschine nehme und auf den 2016er Mac lege, tritt das gleiche Problem auf.

Wenn ich 3 oder 4 CPU-Single-Threads laufen lasse, damit die Maschine mit voller Geschwindigkeit läuft, und dann das Thread-Programm starte, verlangsamt es auch die Frequenz.

Beide Maschinen haben 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 jede Aufzeichnung, die ich lese, und erstelle einen Thread dafür. Ich lasse nur etwa 20 Threads gleichzeitig laufen, also gibt es zu keinem Zeitpunkt mehr als 21 Threads, aber es müssen 14.400.000 Datensätze verarbeitet werden, sodass jeder dieser Datensätze in den etwa 30 Minuten von einem separaten Thread verarbeitet wird.

Ich habe ein triviales pthread-Programm erstellt, das CPU-Zeit saugte, und 10 davon zum Laufen gebracht. Der Problem-Laptop lief so und wurde ohne Probleme auf 95 ° C aufgewärmt.

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 erstellt es jetzt nur noch n Threads und verwendet sie einfach wieder, das hat nicht geholfen. Was außer der CPU-Temperatur führt dazu, dass diese Maschine gedrosselt wird?

Ich liebe diese Frage! Wie wäre es, wenn Sie eine andere spezifische Multithread-Aufgabe ausführen? Ich würde vorschlagen, so etwas wie eine ffmpeg-Aufgabe auszuführen (auf einem 1080p- oder 4K-Video, um sicherzustellen, dass alle verfügbaren CPU-Ressourcen verwendet werden) und zu sehen, ob es gedrosselt wird. Dadurch kann das Problem entweder auf Ihr Programm auf diesem Computer oder auf alle Multithread-Programme auf diesem Computer eingegrenzt werden
Wenn ich den Cinebench R15-Benchmark ausführe, verwendet er die Thread-Aufgaben und läuft wie erwartet, die Temperatur steigt auf etwa 100 ° C und die Lüfter kommen hoch. Intel Power Gadget zeigt, dass die CPU-Frequenz immer noch nahe 3,3 GHz liegt. Es sieht also nicht nach einem Hardwareproblem aus. Der gesamte Code ist nur C-Code mit nichts Besonderem unter Verwendung von p_threads und minimalen Mutex-Sperren. Das Programm besteht hauptsächlich aus der Verarbeitung von DNA-Sequenzen, wobei ein Thread etwa 16 Gigabyte Daten einzieht und an n einzelne Threads weiterleitet, um die Zahlen zu verarbeiten.
Das sieht so aus, als könnten andere Programme die von Ihnen angestrebte Obergrenze erreichen? Wenn das Problem allein auf Ihren speziellen Code zurückzuführen ist, benötigen wir möglicherweise weitere Informationen zu diesem Code. Aber wo sollen Ihre Daten verarbeitet werden? Extern? Wie viel Arbeit meldet kernel_task? Andere Temperatursensoren?
Ihre CPU hat 8 logische Kerne, nicht 4, also würden 4 Threads als 50 % der gesamten CPU-Auslastung angezeigt. Ich frage mich, ob das die Lastschätzung Ihres Systems beeinflusst.
Ich weiß nicht, ob Sie sich die Mühe machen möchten, aber Sie könnten stattdessen versuchen, auf Kernelebene mit dem Debug-Kernel zu debuggen. Sie können es erhalten, wenn Sie auf der Apple-Entwicklerseite unter Downloads auf mehr klicken.
Hat jemand Beispielcode auf Github oder Gitlab, der dies demonstriert? Wenn ja, verlinken Sie bitte auf einen Stack-Overflow-Beitrag, da dies dort ein guter Beitrag wäre

Antworten (4)

Dies mag ein langer Schuss sein, aber vielleicht ist der Unterschied in der Single-Core-Leistung und/oder Cache-Leistung zwischen den CPU-Paketen von 2012 und 2016 groß genug, dass die Kerne datenlos sind und gedrosselt werden, bis sie wieder arbeiten können?

Ich vermute, 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 denken, dass es etwas im Programmdesign Ihrer realen Arbeitslast im Vergleich zur Test-Multi-Thread-Arbeitslast gibt, das die CPUs nicht die ganze Zeit arbeiten lässt

Die Kernel-Erweiterung /System/Library/Extensions/AppleACPIPlatform.kext steuert viele Temperatur- und CPU-Schutzmaßnahmen. Es ist offensichtlich bereits auf Ihrem System kompiliert, aber es ist möglicherweise auf https://opensource.apple.com verfügbar (ich kann es nicht finden, aber ich habe es nur kurz angeschaut). Es würde mich nicht überraschen, wenn Apple sehr konservative Einstellungen zur CPU-Kapazität hätte.

AFAIK die Apple Kexts sind nicht Open Source. (Seltsamerweise?) Die beste Quelle für Informationen dazu ist die Hackintoshing-Community, da Treiber injiziert werden müssen.
Überhaupt nicht seltsam! Die Tüftler geben den besten Rat, weil sie aus erster Hand viel mehr wissen, als sie sollten. Denken Sie bei den konservativen CPU-Einstellungen daran, dass das MBP einen großartigen Kühlkörper für Burst-Leistung hat, aber nicht so gut für anhaltende Zyklen. Es ist sehr wahrscheinlich, dass dieses Problem darauf zurückzuführen ist, dass Apple präventiv verhindern will, dass Ihre Beine gekocht werden. Ich habe von einigen Klagen darüber mit dem 2012MBP gehört.

Immer wenn das Betriebssystem Threads als unvorhersehbar und außer Kontrolle erkennt, wird es gedrosselt, um die Hardware- und Systemstabilität aufrechtzuerhalten. Das 2012er Modell verhält sich anders und kann im schlimmsten Fall abstürzen. Ist mir mit schlecht implementierter Thread-Steuerung passiert, meine Schuld. Führen Sie einfach nicht so viele Threads auf einem Dual-Core aus.

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