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?
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.
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.
NoahL
markatlnk
LangLаngС
sudo
kumowoon1025
Fahrrad