Throttling in smartphone SoCs

Door VictordeHolland op zaterdag 3 februari 2018 01:12 - Reacties (9)
Categorie: -, Views: 2.065

Welkom bij mijn eerste blogje

Voordat ik begin even een huishoudelijke mededeling
Er is hier en daar wat basis kennis nodig over processors, maar ik zal het zo toegankelijk mogelijk proberen te houden. Een aantal termen heb ik door elkaar gebruikt, zoals:
- Rekenkern en core
- Kloksnelheid, clockspeed, clock rate, frequentie, frequency.
Sorry voor de grafieken en afbeeldingen spam :).

Meer rekenkernen?
De trend in Android smartphone land is de laatste jaren om System-On-a-Chip (vervolgens SoC) uit te brengen met steeds meer rekenkernen op hogere kloksnelheden/frequenties. Zo heeft Samsung zijn Exynos Octa’s serie, Qualcomm de 800-serie met quad- en octa-cores en MediaTek bracht zelfs een deca-core (10 cores!) uit in de vorm van de X20 (2 grote cores + 2 clusters van 4 kleine cores).

Apple doet het iets rustiger aan het met aantal rekenkernen. Na een lange geschiedenis van gebruik van ARM licenced processor cores, de eerste Iphone tot de Apple A5 (Iphone 4S) met dual-Cortex-A9 cores, begon het vanaf de Iphone 5 met eigen cores. In 2013 verraste Apple de markt door met een custom dual-core 64-bit processor voor ultra mobiele apparaten te komen (Apple A7 in de Iphone 5S en Ipad Air). Vanaf dat moment heeft Apple de Single-threaded prestatiekroon stevig in handen. Toch ging ook Apple bij de A10 (Iphone 7, 7 Plus) voor een quad-core ontwerp, met 2 performance cores en 2 (kleinere) efficiënte cores. Bij de A11 (Iphone 8 en X) kwamen daar nog 2 efficiënte cores bij voor een (2+4) ontwerp.

Heeft het wel zin om zoveel cores in een smartphone te stoppen?

Hogere kloksnelheden?
De originele Iphone en andere smartphones die tien jaar geleden werden uitgebracht hadden een enkele, simpele rekenkern op een lage kloksnelheid. De kloksnelheden lagen op een paar honderd Mega-Hertz (MHz), oftewel miljoenen operaties per seconde. Door de jaren heen werden de ontwerpen complexer en mede dankzij kleinere productieprocessen kon de klokfrequentie omhoog. Nu noteren fabrikanten frequenties van 2 Giga-Hertz (2000 MHz) of hoger voor de kernen in hun SoCs. Dit soort klokfrequenties waren voorheen alleen mogelijk bij computers en laptops vanwege de energie en warmte vereisten. Qualcomm heeft met zijn Snapdragon 810 bovendien laten zien dat het te royaal klokken tot oververhitting en ernstige throttling kan leiden. Apple was recentelijk nog in het nieuws dat het zijn SoCs op lagere snelheden laat lopen als de batterij minder wordt, doordat anders de kans bestaat dat de SoC teveel stroom van de batterij vraagt, waardoor het toestel uitvalt.

Kan een smartphone de door fabrikanten gespecificeerde kloksnelheden wel aan?

Om deze twee vragen te proberen te beantwoorden heb ik mijn Samsung Galaxy S6 uit de kast gehaald (gekocht september 2015). Het toestel is ongeveer anderhalf jaar dagelijks gebruikt, waarna het is vervangen door een Samsung Galaxy S7edge. De S6 heeft daarna ongebruikt in de kast gelegen. Voor de gelegenheid is het toestel uiteraard geupdate met de nieuwste beschikbare software voor het toestel (Android 7.0). Als ik tijd over heb zal ik eens kijken of ik de testen ook kan herhalen op mijn Galaxy S7edge om te checken of de uitkomsten hetzelfde zijn.

Even een kleine recap: De Samsung Galaxy S6 werd in maart 2015 geïntroduceerd. Voorheen was het gebruikelijk dat er zowel Samsung Exynos als Qualcomm Snapdragon varianten van de high-end S modellen toestellen kwamen voor de verschillende markten (Amerika kreeg vaak de Qualcomm varianten vanwege het gebruik van CDMA patenten). Echter vanwege de problemen met de Qualcomm Snapdragon 810 SOC (oververhitting/throttling) koos Samsung ervoor om bij de S6 alleen de eigen Exynos 7420 SOC te gebruiken.

Samsung Exynos 7420 Octa
Instruction set: ARMv8-A (‘64bit’)
Process: Samsung 14nm LPE (Low Power Early) met FINFETs
Microarchitecture: big.LITTLE 4x Cortex-A57 + 4x Cortex-A53 (GTS)
Max Frequency: 2,1GHz (A57 cluster) 1,5GHz (A53 cluster)
Memory: 3GB 64-bit (2x32bit) dual-channel LPDDR4 @1553MHz (24.88 GB/s bandwidth)
GPU: Mali-T760 MP8 @772MHz

De 7420 is een octa-core processor (8 kernen), maar niet alle 8 kernen zijn hetzelfde. Ze zijn opgedeeld in 2 clusters. Het ene cluster heeft grote cores (big cores, A57) die hoge prestaties kunnen leveren, maar wel meer stroom verbruiken. Het andere cluster heeft 4 kleinere efficiëntere cores (LITTLE, A53 cores). Door middel van GTS (Global Task Scheduling), ookwel heterogeneous multi-processing genoemd (heterogeen want niet alle cores zijn identiek), kunnen alle cores tegelijk aan het werk. Het A57 cluster heeft een hogere maximum frequentie (2,1GHz) dan de A53 cores (1,5GHz). De kleine cores hoeven die niet extreem hoog gekolkt te worden, de intensievere taken worden automatisch gemigreerd naar een grote core. Het toestel heeft verder 3GB LPDDR4 aan werkgeheugen, met voor smartphone maatstaven riante bandbreedte (bijna 25GB/s).

Het toestel heeft verder een 5,1” Super AMOLED scherm met een resolutie van 1440 x 2560 pixels een 2550mAh batterij en ik heb de 32GB opslag variant.

Als eerst maar eens kijken hoe de batterij er aan toe is na 2,5 jaar (waarvan 1,5 jaar gebruik). Accubattery app meet het aantal mA tijdens het laden en ontladen en gooit er dan wat mooie statistieken uit:

https://i.imgur.com/nEVI79Nl.png
https://i.imgur.com/GpAFWtkl.png

Nog 79% van de originele capaciteit voor een geschatte capaciteit van een krappe 2000mAh, valt mij niet tegen. In standby (enkel WiFi, zonder SIMkaart) verbruikt het toestel net iets meer dan 1% batterij per uur. In gebruik 13,4%/h, dus een normale dag zou het toestel nog prima uit moeten houden.

https://i.imgur.com/TaSvCNrl.png
Met CPU-Z zijn de actuele kloksnelheden, temperaturen en nog wat andere statistieken uit te lezen. Af te lezen is dat de eerste 4 cores (CPU0-3) de A53 (.LITTLE) cores zijn en CPU4-7 de A57 (big) cores. Bij normaal gebruik, zoals apps en websites openen springen de big cores naar 2100 MHz. Tot dusver goed nieuws, nog geen indicaties dat de snelheid wordt beperkt, maar misschien is de batterij nog niet ver genoeg achteruit gegaan daarvoor.

De throttling bij iPhones kwam pas echt aan het licht door middel van Geekbench resultaten.
Voor de zekerheid maar even checken dan. Geekbench 4.2.0 op de S6 resulteert in score van 1456 voor Single en 4464 voor Multi. Dit is hoger dan het gemiddelde resultaat van de S6 in de Geekbench database van (1264 en 3940) (https://browser.geekbench.com/android_devices/207)

https://i.imgur.com/PMgWWWxl.png

Om de CPU clockspeed, CPU load en batterij gebruik tijdens applicaties te meten is er een mooie app beschikbaar in de Google Playstore genaamd Trepn Profiler. Ironisch genoeg wordt die beschikbaar gemaakt door Qualcomm Innovations Center Inc, maar het werkt ook uitstekend op mijn S6 en S7edge. De data kan live weergegeven worden (ook in de vorm van grafieken), maar kan ook worden opgeslagen in een database bestand, maar ook als .csv (Comma-Separated Values) tekst bestand. Voor het laatste heb ik gekozen, deze zijn namelijk makkelijk in bijvoorbeeld Excel te importeren om zelf grafieken ervan te maken. Meerdere screenshots van grafiekjes met een paar honderd datapunten van een telefoon is niet echt prettig kijken.

Als eerste een Geekbench run ge-profiled met intervallen van 1 second (ik had eerst 100ms, maar dat genereerde grafieken die niet af te lezen waren door de vele datapunten).

De .csv data geimporteerd in Excel ziet er dan zo uit:

https://i.imgur.com/x0TSbzjl.png

Na wat opruiming van de data:
10+ kolommen met de tijd van waarneming, enkele milliseconden na elkaar voegen weinig toe
Exynos kan niet per core de frequency veranderen, enkel per cluster, dus daardoor kunnen er ook weer 6 kolommen verwijderd worden
kHz geconverteerd naar MHz voor betere leesbaarheid, Batt Power van uW naar Watt en load genormaliseerd per cluster aan de hand van (maximale frequency*max load).

Nu begint het wat te worden:

https://i.imgur.com/F5Jpzlhl.png

Hier dan de frequenctie van de grote en kleine clusters uitgezet tegen de tijd (in seconden):
https://i.imgur.com/n5j4YIEl.png

En de CPU load op de verschillende cores uitgezet tegen de tijd (seconden)
https://i.imgur.com/DhDhsMbl.png
https://i.imgur.com/THtXbZBl.png
De 3 grafieken kunnen ook gecombineerd worden als percentage van de maximale frequentie*maximale load per cluster:
https://i.imgur.com/JL4sC9gl.png
Er is duidelijk te zien welk deel van Geekbench test Single-threaded is en welk deel Multi-threaded. In de eerste twee minuten tikt de frequentie van het A57 cluster constant het maximum aan (2100MHz) als er 100% load op één core gezet wordt. Het kleine cluster blijft netjes rond de 800MHz hangen met een paar procent belasting (waarschijnlijk van het besturingssysteem en achtergrond taken). In het tweede deel van de test (Multi-Threaded) nemen de big cores het gross van het werk voor hun rekening, maar ook de kleine cores worden zo nu en dan belast. Na een seconde of 30-40 in het MT deel van de test halen de big cores hun maximale frequency niet meer, maar blijven ze steken op de 1700MHz. De belasting is er voornamelijk in de vorm van pieken met een paar seconden rust ertussen. De SoC kan daardoor in die paar seconden net genoeg afkoelen om de frequentie niet verder terug te hoeven schroeven.
https://i.imgur.com/XEf4ASWl.png
Als we naar de geschatte stroomverbruik kijken, dan is het ook wel duidelijk waarom. Een enkele A57 core op 2100MHz vraagt ongeveer 1,5Watt dus als de SOC alle 4 de A57 cores op maximale frequentie wil laten werken schiet het benodigde vermogen naar 6W.
A: de batterij moet zoveel vermogen ook wel kunnen leveren (dit kan een probleem worden als de batterij ouder wordt)
B: de telefoon moet de warmte kwijt kunnen. De voor- en achterkant zijn van glas dat niet goed warmte geleid/afvoert.

(het is mij niet 100% duidelijk hoe Trepn precies het verbruik/vermogen meet, dus gebruik de Power grafieken alleen als indicatie, niet als exacte wetenschap).

Om de throttling beter in kaart te brengen, zocht ik naar iets wat een constantere belasting kan genereren. Aangezien ik al jaren thuis mee doe aan vrijwillige distributed computering (het bekendste DC project is waarschijnlijk Folding@home), leek het mij leuk om ook nog iets nuttigs met de CPU cycles te doen.

BOINC
Berkeley Open-Infrastructure for Network Computing (BOINC) is een open-source distributed computing-platform op initiatief van de universiteit van Berkeley. Via de client die op een PC (of in dit geval tefefoon) geïnstalleerd wordt, kan er aan diverse projecten meegedaan worden.
Voor informatie: https://boinc.berkeley.edu/
App in playstore: https://play.google.com/s...ils?id=edu.berkeley.boinc

Niet alle projecten hebben een applicatie voor ARM, dus de keuze is uiteindelijk gevallen op:
TheSkyNet POGS.
https://i.imgur.com/EAMIXV1l.png
Een korte beschrijving van het project op hun site:
TheSkyNet POGS is een astronomie project dat 16 verschillende eigenschappen van sterrenstelsels bestudeerd, zoals helderheid, massa, hoeveelheid stof en hoe snel sterren worden gevormd. Wij maken gebruik van jouw rekenkracht om pixel-voor-pixel berekeningen in beelden van verschillende golflengten (zoals ultraviolet, optisch en nabij-infrarood licht) van sterrenstelsels uit te voeren om een atlas te produceren die zal helpen astronomen een beter inzicht in het verre heelal te geven.
https://pogs.theskynet.org/pogs/

De taken van POGS zijn gelukkig niet zo groot/lang, de files die gedownload moeten worden zijn redelijk klein en het geheugengebruik (75MB per taak) moet ook haalbaar zijn voor een moderne smartphone.


https://i.imgur.com/uX8vssMl.png
BOINC op een PC (Intel i5 2500K @4,0GHz)

Baseline
Voordat we verder gaan leek het mij handig om een baseline run te doen zonder belasting.
(horizontale as, seconden)
https://i.imgur.com/7k1K9Tul.png
https://i.imgur.com/JrMn4lkl.png
https://i.imgur.com/FOwTrnTl.png

De big cores blijven netjes het grootste gedeelte van de tijd in slaapstand en de .LITTLE cores doen hun ding voornamelijk op 400MHz.


1 Core Load

https://i.imgur.com/Iqy6Siql.png
https://i.imgur.com/I1mOehhl.png
https://i.imgur.com/V2p1Gyal.png

POGS weet een strakke 100% belasting op een enkele core te plaatsen. Het grote cluster houdt het bijna 3 minuten uit op 2100MHz, daarna schommelt de frequentie de rest van de meting tussen 1700 en 2100MHz. Zie ook hoe de scheduler de thread na een minuut of 6 verplaatst van core8 naar core6 (of van core7 naar core5 als je met core0 begint). Op een uitschieter na blijft de telefoon net onder de 1,5W. De temperatuur van de Exynos processor loopt op tot bijna 60C.

https://i.imgur.com/8fmqT8Pl.png

2 Core Load

https://i.imgur.com/o48yQ2Vl.png
https://i.imgur.com/OLh1TNpl.png
https://i.imgur.com/BBkalR6l.png

Twee taken zorgen al eerder voor warmte/throttling problemen. Na ongeveer een minuut kan het cluster de maximale snelheid niet meer aan. In stappen loopt de frequentie hard terug naar 1200MHz. De SoC lijkt een beetje zoekende naar een goede balans. Soms probeert het cluster de frequentie weer op te schroeven tot het maximum, om er na enkele seconden achter te komen dat het niet houdbaar is. De SoC kan duidelijk zijn warmte niet goed kwijt, CPU-Z meet 73C. De taken worden constant verplaatst, waarschijnlijk om de warmte binnen de SoC goed te verdelen. Waarbij het verbruik bij 1 core redelijk constant op 1,4W lag, schommelt het nu tussen de 2,5W (bij 2100MHz) en 1W (bij 1200MHz). Een lineaire regressie lijn laat zien dat de SoC beter een frequentie zou kunnen kiezen die past bij een vermogen van ongeveer 1,5W.

https://i.imgur.com/tJ5h9Ell.png

3 Core Load

https://i.imgur.com/HrC4uNJl.png
https://i.imgur.com/yj9UTL8l.png
https://i.imgur.com/ThTSR8Sl.png

Met drie taken kan de Exynos 7420 het beter vinden. Na minder dan 3 minuten wordt er een stabiele frequentie van 1200MHz gevonden bij een vermogen van, jawel 1,5W! De taken worden amper verplaatst, core 6 (of core 5 als je begint met tellen bij core 0) is in dit geval niet bepaald favoriet. De temperatuur blijft hangen op 72C.

https://i.imgur.com/MW7g9Mtl.png

4 Core Load

https://i.imgur.com/Xb9jlnkl.png
https://i.imgur.com/hDzZFg2l.png
https://i.imgur.com/jDyCSsbl.png

Vier taken is een logische belasting bij een processor die 2 clusters van 4 cores heeft. Elke taak heeft dan een eigen A57 core ter beschikking. De processorload op de A57 cores is als gevolg dan ook constant 100%. Het A57 cluster lijkt een voorkeur te hebbben voor 1700 en 1200MHz. Na een soort cooldown periode van een paar minuten op 1200MHz, clockt het cluster weer naar 1700MHz om na één minuut weer terug te zakken naar 1200MHz. Temperaturen lopen nog iets meer op naar 76C. Boven de 3W is duidelijk niet houdbaar, laat staan de 5W waar de SoC op begint. 2W lijkt prima houdbaar, zelfs na 12 minuten voelt het toestel maar een klein beetje warm aan.

https://i.imgur.com/7fabM9ql.png

Powersaver (1 core)
Samsung biedt ook een powersave functie aan. Daarin kunnen snel scherm helderheid, achtergrond netwerk gebruik en schermresolutie aangepast worden. Ook kan de CPU snelheid gelimiteerd worden tot 70%.

https://i.imgur.com/Eps8JPVl.png

https://i.imgur.com/L0fTEKvl.png
https://i.imgur.com/MpiIFpal.png
https://i.imgur.com/qLDiEK8l.png

De functie doet exact wat het zegt. De maximale frequentie wordt gelimiteerd tot 1500MHz (= 71% van 2100MHz) en het cluster blijft daar bij belasting op 1 core dan ook constant op lopen.

Powersaver (4 cores)

https://i.imgur.com/igWTp0Zl.png
https://i.imgur.com/KXyoI7xl.png
https://i.imgur.com/W8J14dfl.png

Interessanter is de powersave functie bij een belasting van 4 cores. Het cluster kan langer de de frequentie van 1500MHz aanhouden voordat het in stapjes van 100MHz teruggaat naar de 1200MHz. Ondanks de powersave functie wordt de SoC bij deze (onrealistische) belasting alsnog 70C.

https://i.imgur.com/XSMrChVl.png

Onrealistisch? Jazeker!
Tot dusver heb ik eigenlijk alleen gekeken hoe een moderne SoC omgaat met een onrealistische (hoge) belasting. Toch ga ik er voor nu een eind aan breien, want met alle grafieken en screenshots erbij wordt het anders erg lang en onoverzichtelijk. Ook moet ik nog even gaan nadenken hoe ik een wat realistisch scenario kan simuleren om het processor gebruik te meten (zowel het gebruik van het aantal cores, de frequentie en de thread migraties tussen de LITTLE en big cores).

Conclusie (so far)
De 2,5 jaar oude Samsung Galaxy S6 (met Exynos 7420 SoC) vertoont nog geen performance degradatie, de Geekbench resultaten zijn nog als nieuw en hoger dan het gemiddelde in de Geekbench database voor de S6. Dit zegt natuurlijk niets over de gehele populatie aan S6 toestellen, maar het is hoopgevend. De batterij is wel een stuk minder geworden, maar het toestel is nog bruikbaar in het dagelijks leven, mits je geen acht uur per dag fimpjes wilt kijken.

De belasting die Geekbench genereert op de CPU is er één met veel pieken en korte pauzes tussendoor. In die pauzes kan de 7420 net genoeg afkoelen, waardoor zowel in de Single- als Multi-threaded test bijna constant de maximale frequentie van 2100MHz gehaald wordt door het A57 cluster in de 7420. Bij een (onrealistische) contante belasting van 100% op één core verlaagt de SoC na drie minuten de snelheid naar 1700MHz, maar probeert daarna toch weer de 2100MHz aan te tikken. Bij een belasting van twee cores is de 7420 erg zoekende naar de juiste balans. Een minuut lang wordt het maximum gehaald, vervolgens afgebouwd naar 1200MHz. De belasting wordt constant verschoven tussen cores en telkens probeert de CPU weer op 2100MHz te lopen, maar na enkele seconden wordt het toch te warm en moet het cluster teruggeklokt worden. 100% belasting van drie of vier cores lijkt de 7420 beter af te gaan, na tien seconden geeft de SoC het op om op 2100MHz te lopen. Bij drie core belasting blijft er een constante 1200MHz over. Bij vier core belasting schommelt het wat meer, maar ook hier lijkt de 1200MHz de magische ondergrens. Met de PowerSave functie kan de maximale snelheid van de CPU worden verlaagt naar 1500MHz. Bij één core load heeft dit een lager verbruik tot gevolg. Bij meerdere cores load wordt het max vermogen beperkt, maar er is nog steeds throttling al duurt het wat langer voordat deze begint. De load blijft overigens in alle scenario’s wel op het big cluster (A57 cores) en wordt niet gemigreerd naar het LITTLE cluster (wat in theorie wel een mogelijk zou zijn als de SoC te heet wordt). De temperatuur van de Exynos loopt aardig op tijdens de testen met hoge load (soms >70C), maar het toestel zelf wordt amper warm. Mogelijk dat de glazen voor- en achterkant hier een rol bij spelen.

De maximale frequentie van de Samsung Exynos7420 in de Samsung S6 moet dus eigenlijk als een soort als Boost frequentie gezien worden. Prima voor het laden van een app of een website, wat binnen een paar seconden gebeurd is, maar deze kan niet permanent vastgehouden worden bij hoge belasting.

Ik moet nog even nadenken hoe ik het beste het aantal cores en frequentie ga meten bij het normaal gebruik van een telefoon. Er komt dus mogelijk nog een deel 2 ;) .

Tweakers vormt samen met Tweakers Elect, Hardware.Info, Autotrack, Nationale Vacaturebank en Intermediair de Persgroep Online Services B.V.
Alle rechten voorbehouden © 1998 - 2018 Hosting door True