Wydajność i energooszczędność – te dwie cechy nigdy nie idą ze sobą w parze. Będąc producentem mobilnych układów SoC, można stworzyć wielki i wydajny rdzeń, ale będzie on konsumował masę energii. A jego zasoby są przecież w smartfonach czy innych urządzeniach przenośnych bardzo ograniczone. Można stworzyć mały, energooszczędny rdzeń, ale on nigdy nie zapewni wymaganej przez konsumentów wydajności. Szczególnie, gdy mowa o urządzeniach flagowych, kosztujących nieraz grube tysiące złotych. No to może pomnóżmy ilość rdzeni? Nie wszystkie zadania są możliwe do zrównoleglenia. A gdybyśmy połączyli duże rdzenie z małymi korzystając z najlepszych cech obu? Tak oto powstała technologia ARM big.LITTLE – nieodłączny element prawie każdego mobilnego układu SoC z wysokiej półki. 

Terminologia

  • Rdzeń – część procesora odpowiedzialna za wykonywanie operacji obliczeniowych, składająca się z wielu jednostek wykonawczych: przede wszystkim ALU (obliczenia na liczbach całkowitych), FPU (obliczenia na liczbach zmiennoprzecinkowych) oraz pamięci podręcznej cache. W nowoczesne procesory właściwie zawsze są wielordzeniowe.
  • Układ SoC – stosowany przede wszystkim w urządzeniach mobilnych układ, w skład którego wchodzą procesor odpowiedzialny za wykonywanie operacji obliczeniowych, układ graficzny, kontrolery pamięci, procesor sygnałowy DSP, procesor obrazów ISP, modem, układ sieci neuronowej NPU i wiele, wiele innych jednostek. Całość zintegrowana jest na pojedynczej płytce krzemowej w celu redukcji zajmowanego miejsca i zwiększenia energooszczędności.
  • Duży rdzeń – rdzeń o wysokiej wydajności, a przez to wysokim apetycie na energię. Wydajność osiągana jest poprzez zaawansowaną architekturę, w tym rozbudowane dekodery instrukcji, możliwość wykonywania zadań poza kolejnością, rozbudowaną obsługę wejścia i wyjścia danych, duże ilości pamięci podręcznej cache itd., a także poprzez wysokie taktowania wyrażane w mega- i gigahercach.
  • Mały rdzeń – rdzeń, w którym poprzez zmniejszenie zaawansowania architektury zwiększono energooszczędność kosztem wydajności.
  • ARM – może odnosić się zarówno do firmy ARM Inc. – twórcy architektury ARM, rdzeni Cortex i układów graficznych Mali, jak i do samej architektury stworzonej przez firmę.

Fizyki nie oszukasz.

W czasach pierwszych smartfonów nikt nie musiał przejmować się energooszczędnością ich układów SoC. Zarówno wydajność, jak i zapotrzebowanie na energię z akumulatora były względnie niskie. Dość dodać, że pierwszy iPhone był wyposażony w procesor ARM11 o częstotliwości 412 MHz, a Nokia N900 – 600 MHz. Szybko jednak do systemów operacyjnych zaczęto dodawać nowe funkcje, a deweloperzy pisali coraz bardziej rozbudowane, a przez to wymagające programy. Za tym wszystkim nadążyć musiał sprzęt – każdy użytkownik wymaga przecież, aby jego urządzenie działało sprawnie. Moc smartfonów zaczęła więc rosnąć w postępie wykładniczym. W 2010 roku mobilne SoC dosięgły lub nieznacznie przekroczyły poziom 1 Gigaherca, a rok 2011 należał już w całości do układów dwurdzeniowych.

NVIDIA Tegra 3 – protoplasta big.LITTLE

Kolejny rok przyniósł kolejny skok wydajności. Już wówczas wiedziano, że wydajne układy SoC stanowią coraz większą część zapotrzebowania energetycznego smartfona. Jak temu zaradzić? NVIDIA wraz z premierą Tegry 3 stworzyła coś, co miało zrewolucjonizować budowę mobilnych procesorów.

Otóż tak naprawdę Tegra 3 była układem pięciordzeniowym. Do czterech rdzeni Cortex-A9 o częstotliwości 1,3 GHz dołączono piąty, towarzyszący rdzeń (tzw. companion core). Rdzeń ów także był Cortexem-A9, ale zbudowano go w innym, znacznie bardziej energooszczędnym procesie, a taktowanie ograniczono do 500 MHz.

nvidia tegra 3 big.LITTLE na zdjęciu układu
Kolorem żółtym zaznaczono rdzenie Cortex-A9.

Dzięki temu rozwiązaniu możliwe było oszczędzanie znacznych ilości energii podczas wykonywania podstawowych zadań – przykładowo synchronizacji w tle. Zamiast uruchamiać klaster czterech rdzeni, możliwe było wykonanie ich na rdzeniu towarzyszącym, którego apetyt na prąd był znacznie niższy.

Moc tego rdzenie nie była jednak wystarczająca, a rozruch klastra dużych rdzeni musiał być dokonywany względnie często. Należy również przypomnieć, że pomimo zastosowania tej technologii, Tegra 3 przeszła do historii jako niezbyt energooszcżędny i gorący układ. Z uwagi na 45-nanometrowy proces nie mogła ona się równać pod tym względem z 28-nanometrowymi Snapdragonami S4 od Qualcomma.

ARM podchwyciło pomysł

Pomysł NVIDII wcale jednak nie umarł. Firma ARM, twórca architektury o tej samej nazwie, podchwyciła pomysł. Zaprezentowano dwa rdzenie Cortex-A15 oraz Cortex-A7 oraz big.LITTLE – nowy pomysł na zwiększenie energooszczędności układu. Przede wszystkim zwrócić uwagę trzeba na pierwszy z zaprezentowanych rdzeni – Cortexa-A15. W porównaniu do swojego poprzednika, powszechnie stosowanego wówczas Cortexa-A9, był on układem o znacznie, znacznie większej wydajności i zaawansowanej architekturze. Pociągnęło to za sobą wzrost zapotrzebowanie na energię. Sam rdzeń był nawet początkowo przeznaczony do stosowania nie w smartfonach, ale w serwerach opartych o architekturę ARM. Drugi z rdzeni, Cortex-A7, był słabszy od Cortexa-A9, ale oferował jednocześnie o wiele niższe zapotrzebowanie na energię.

Cortex-A15 był więc bardzo wydajny, ale i łasy na prąd. Cortex-A7 oferował wysoką energooszczędność, ale był zbyt słaby dla wydajnych, flagowych urządzeń. Co gdyby połączyć te rdzenie ze sobą? Tak oto powstało big.LITTLE.

Technologia big.LITTLE – łącząc wydajność z energooszczędnością na jednym krzemie

Geniusz big.LITTLE polegał na możliwości połączenia dużych, wydajnych rdzeni z tymi energooszczędnymi tworząc układ, który z jednej strony dzięki rdzeniom dużym będzie bardzo wydajny, z drugiej zaś energooszczędny dzięki rdzeniom małym. Jednym z pierwszych układów, które wyposażono w to rozwiązanie był Samsung Exynos 5410 – i na nim też przedstawię działanie pierwotnej wersji big.LITTLE.

Przełączanie klastrów (clustered switching)

arm big.little - technologia clustered switching
Clustered switching w ARM big.LITTLE

Gdy zapotrzebowanie na moc było małe, przykładowo podczas pisania tekstu lub przeglądania zdjęć, scheduler (programowy zarządca) przekazywał zadanie do wykonania rdzeniom małym. Takim, jak Cortex-A7 lub jego bezpośredni następca, Cortex-A53. Są one dość wydajne by poradzić sobie z zadaniem zużywając minimalne ilości energii. Jednak gdy użytkownik zechciał zagrać w wymagającą grę 3D lub wyrenderować wideo, scheduler przerzucał zadanie na klaster dużych rdzeni, które podołałyby zadaniu.

Działanie clustered switching opierało się właśnie na przełączaniu klastrów. Jeśli moc chociażby jednego rdzenia małego była niewystarczająca, włączano klaster dużych rdzeni, przerzucano na niego zadanie i wyłączano klaster rdzeni małych. Układ wykorzystujący clustered switching, w którym fizycznie znajdowało się 8 rdzeni nie był więc układem ośmiowątkowym. Był układem czterowątkowym ponieważ niemożliwe było łączenie działania klastrów, tylko jeden mógł być jednocześnie aktywny.

Przełączanie za par rdzeni (in-kernel switching / CPU migration)

in kernel switching arm big.little
Działanie mechanizmu in-kernel switching.

Szybko jednak okazało się, że konieczność włączania całego klastra dużych rdzeni, gdy tylko zapotrzebowanie na moc jednego małego rdzenia zostanie przekroczona, jest bardzo nieekonomiczna. Dodatkowo generowało to kolejne spowolnienia wynikające z konieczności przeniesienia danych między klastrami poprzez pamięć podręczną poziomu drugiego (L2). Apple, producent najwydajniejszych dziś układów SoC, zastosował takie podejście znacznie później niż konkurencja, bo dopiero w A10 znanym m.in. z iPhone 7. Użytkownicy tego smartfona narzekali na drobne spowolnienia, których nie zauważali na teoretycznie słabszym poprzedniku – modelu 6S z dwurdzeniowym układem A9. Wynikały one bezpośrednio z konieczności przerzucania zadań między klastrami rdzeni.

Wprowadzono więc kolejną generację big.LITTLE – tym razem działanie polegało na grupowaniu rdzeni w pary po jednym dużym i małym. Nie przełączano już całych klastrów, ani nie przenoszono między nimi zadań. Przełączanie zachodziło w parach rdzeni – gdy tylko moc małego rdzenia się wyczerpała, włączany był jego duży kompan. Gdy zapotrzebowanie na moc minęło, ponownie przenoszono zadania do rdzenia małego. Taki sposób przełączania sprawiał, że możliwe było działanie zarówno dużych, jak i małych rdzeni – zależnie od zapotrzebowania na moc danego wątku.

Ponownie jednak układy wykorzystujące in-kernel switching, w których fizycznie znajdywało się 8 rdzeni, były jednostkami widzianymi przez system jako 4-wątkowe. Rozwiązanie nie zdobyło znacznej popularności.

Globalne przydzielanie zadań (heterogeneous multiprocessing)

globalne przydzielanie zadań arm big.little
Globalne przydzielanie zadań.

Jest to najnowszy i dziś jedyny wykorzystywany sposób działania big.LITTLE. Ośmiordzeniowy układ jest jednocześnie układem ośmiowątkowym, a system może przydzielić zadanie do dowolnego rdzenia zależnie od tego, jak dużej mocy to zadanie wymaga. Możliwe są dowolne kombinacje działających rdzeni: cztery małe i jeden duży, dwa duże i trzy małe itd. Przydzielanie jest dostosowywane do wymaganej mocy tak, by zadanie można było możliwie szybko wykonać pożytkując na to jak najmniejsze ilości energii.

Pseudo big.LITTLE – tworzenie klastrów z identycznych rdzeni

big.LITTLE bez rdzeni dużych i małych? Wszystko jest możliwe! Niekiedy zamiast łączyć ze sobą dwa rodzaje rdzeni wykorzystywany jest jeden rodzaj, z którego tworzone są klastry o różnej maksymalnej częstotliwości działania. Przypomina to działanie omawianej już Tegry 3, w której rodzaj rdzeni był identyczny, ale rdzeń towarzyszący miał znacznie obniżone maksymalne taktowanie. Przykładem takiej technologii jest MediaTek MT6750 zastosowany m.in. w LG K10 2017. Nie jest to jednak big.LITTLE, które rozumiemy przez możliwość łączenia różnych rdzeni i przydzielania im odpowiednich zadań – w MediaTeku wykorzystano osiem identycznych rdzeni Cortex-A53. Różnią się one jednak taktowaniem: cztery mogą rozpędzić się do 1,5 GHz, kolejne cztery zaś do 1 GHz. Jest to jedynie ograniczenie programowe, które ma na celu redukcję spożycia energii przy najwyższych obrotach. 

Podobne rozwiązanie zastosował Qualcomm w układzie Snapdragon 820. Model ów złożony został z czterech rdzeni, z których dwa mogły działać z częstotliwością do 2,2 GHz, kolejne dwa – 1,5 GHz. Rdzenie różniły się jednak nie tylko częstotliwością, lecz także ilością przydzielonego im cache L2: pierwszy, wydajniejszy z klastrów miał go 1,5 MB, drugi zaś – 512 KB. Snapdragon 820 był następcą nieudanego ze względu na problemy termiczne Qualcomma 810 i charakteryzował się bardzo dobrą kulturą pracy oraz wydajnością. Qualcomm zrezygnował jednak z wykorzystanego w modelu 820 rozwiązania już w następnym roku, prezentując Snapdragona 835 i wracając do standardowej w segmencie flagowym konfiguracji czterech dużych rdzeni i czterech małych. Rdzenie te, pomimo nazwy, nie są kontynuacją architektury Kryo znanej z modelu 820 – są jedynie zmodyfikowanymi jednostkami Cortex.

DynamiQ – rozwinięcie technologii big.LITTLE

arm big.little dynamiq

Prawie dwa lata temu ARM zaprezentowało rozwinięcie technologii big.LITTLE o nazwie DynamiQ. Nie zmienia ono powszechnego dziś modelu działania big.LITTLE czyli omawianego wcześniej globalnego przydzielania zadań, lecz wprowadza znacznie większe możliwości w zakresie różnych konfiguracji rdzeni w jednym układzie. Przede wszystkim, dzięki DynamiQ możliwe jest umieszczanie różnego rodzaju rdzeni w jednym klastrze, co pozytywnie wpływa zarówno na wydajność i energooszczędność dzięki przeprojektowanemu podsystemowi pamięciowemu, który zapewnia szybszy dostęp do danych poprawiając gospodarkę energetyczną tej części układu, jak i konstrukcję SoC w rozumieniu rozłożenia elementów na krzemie. Maksymalną ilość rdzeni w pojedynczym klastrze ograniczono do ośmiu, przy czym rdzenie mogą być właściwie dowolnie konfigurowane: od jednego dużego i siedmiu małych, aż po siedem małych i jeden duży.

Duże, małe, po co to komu?

No właśnie. Dlaczego nie można po prostu stworzyć procesora złożonego z mniejszej ilości, ale bardzo wydajnych rdzeni? Tak to przecież działa w komputerach czy laptopach! Niestety, to nie takie proste. Rozbudowany, wydajny rdzeń nigdy nie będzie tak energooszczędny, jak ten o prostszej konstrukcji przy wykonywaniu identycznych zadań. Wynika to z fizyki, a dokładniej z wycieków prądu, które nie są możliwe do prostego, albo nawet jakiegokolwiek, wyeliminowania. Takie utraty energii miałyby znaczne odbicie w codziennym czasie działania na akumulatorze. Warto zauważyć, że już Intel tworząc wiele lat temu jednostki serii Atom przeznaczone dla najmniejszych i najlżejszych urządzeń zdał sobie z tego sprawę: zamiast zmniejszyć po prostu taktowania i nieco przyciąć zwyczajne rdzenie Core, koniecznym okazało się opracowanie zupełnie nowej architektury rdzeni. Rdzeni takich, jakie dziś nazwalibyśmy małymi.

Nawet Apple, które w linii Ax tworzy najwydajniejsze dziś układy SoC, musiało się w pewnym momencie poddać. Aż do układu A9 włącznie, przez kilka lat procesory Ax składały się z dwóch, bardzo wydajnych rdzeni. Zmieniło się to wraz z A10, w którym zastosowano konfigurację 2+2 oraz implementację big.LITTLE polegającą na przełączaniu klastrów. Wraz z nadejściem układu Apple A11 z 2017 roku, konfigurację zmieniono na dwa rdzenie duże i cztery małe, przy czym wszystkie z nich mogą działać jednocześnie dzięki globalnemu przydzielaniu zadań. Ciekawym faktem jest to, że małe rdzenie od Apple nie są wcale takie „małe” – ich moc jest podobna do Cortexów-A73, które zbudowano przecież jako rdzenie do wykorzystania w wysokowydajnym klastrze. Obsługują one także wykonywanie zadań poza kolejnością (out-of-order execution) w przeciwieństwie do małych rdzeni od ARM.

No to może zamiast wykorzystywać kilka dużych rdzeni, użyjmy zamiast nich wielu małych! Niestety – to również nie odniosłoby skutku. Nie wszystkie zadania są możliwe do zrównoleglenia, część zwyczajnie wymaga obecności silnego, pojedynczego wątku.

Dlatego właśnie big.LITTLE jest najlepszym możliwym dziś rozwiązaniem – łączy w sobie moc i ekonomię.

Tylko dwa klastry? To już niemodne.

Snapdragon 855 big.little

Przez kilka ostatnich lat standardem było umieszczanie we flagowych (i nie tylko) układach SoC dwóch klastrów różnych rdzeni. Dzięki DynamiQ znacznie ułatwiono jednak inne konfiguracje i to w jednym klastrze. Producenci nie boją się korzystać z dostępnych nowinek, tak więc zarówno Exynosa 9820, który z pewnością trafi do nadchodzącego Samsunga Galaxy S10, jak i Snapdragona 855 zbudowano w oparciu aż o trzy klastry.

Zaczynając od Exynosa, jest on układem typu 2+2+4. Dwa pierwsze rdzenie to bardzo wydajne, własne konstrukcje Samsunga o nazwie M4. Rdzenie te zajmą się najbardziej wymagającymi zadaniami. Kolejne dwa rdzenie to o wiele bardziej standardowe Cortexy-A75 od ARM – ich rolą będzie wykonywanie średniozaawansowanych zadań. Dla najprostszych zadań przeznaczono zaś cztery energooszczędne rdzenie Cortex-A55.

Jeszcze ciekawszym układem jest natomiast Snapdragon 855. W tym przypadku jest to konstrukcja typu 1+3+4. Pierwszy, najwydajniejszy rdzeń Kryo Gold 485 nazywany jest wiodącym i charakteryzuje się taktowaniem 2,84 GHz oraz 512 KB pamięci L2. Kolejne trzy rdzenie to także Kryo Gold 485, ale z taktowaniem ograniczonym do 2,42 GHz oraz o połowę mniejszą ilością cache poziomu drugiego. Ostatnie cztery rdzenie to energooszczędne jednostki Kryo 485 Silver o taktowaniu 1,8 GHz i 128 KB pamięci L2. Wykorzystane rdzenie Kryo 485 Gold i Kryo 485 Silver są zmodyfikowanymi jednostkami odpowiednio Cortex-A76 i Cortex-A55.

Wydawać by się mogło, że producenci mobilnych SoC przesadzają z tymi wszystkimi kombinacjami. Pamiętać jednak należy, że zapewnienie wydajności i niskiego poboru energii jest bardzo trudną sztuką. A tego chcą przecież klienci, prawda?