Architektura Skylake, część 1.
Skylake x86 – dwie wersje rdzenia
Mikroarchitektura Skylake to pierwszy od czasów Nehalema przypadek, kiedy Intel odszedł od strategii converged core – stosowania jednego, identycznego rdzenia x86 w procesorach przeznaczonych do zupełnie innych zastosowań. Rdzenie Skylake mają dwie wersje, oparte na tym samym ogólnym projekcie, ale różniące się w szczegółach. W procesorach mobilnych i desktopowych (między innymi tych, które już są w sklepach) jest prostsza wersja. Druga, bardziej złożona, obsługuje AVX-512 – zestaw dodatkowych instrukcji wektorowych operujących na liczbach 512-bitowych. AVX-512 to ogólna nazwa kilku grup instrukcji, z których nie wszystkie muszą być zaimplementowane w jednym procesorze; inny, częściowo pokrywający się ze Skylake podzbiór AVX-512 pojawi się też w akceleratorach obliczeń równoległych Knights Landing (następna generacja Xeon Phi). Serwerowe procesory Skylake zostaną wprowadzone do sprzedaży za parę miesięcy i nie wiadomo jeszcze, jak zrealizowano obsługę AVX-512 w sprzęcie i jak daleko sięgają zmiany. Zajmiemy się tym, kiedy dowiemy się szczegółów; na razie dość powiedzieć, że Skylake z AVX-512 jest fizycznie innym rdzeniem od tego, który jest stosowany w procesorach desktopowych. Różnica w funkcjonalności jest wyjątkowo prawdziwą różnicą techniczną; nie chodzi o zablokowanie lub odblokowanie czegoś ze względów marketingowych.
Skylake – ulepszony Haswell
Rdzenie Skylake są kolejnym ewolucyjnym ulepszeniem mikroarchitektury Haswell. Inżynierowie wypowiadali się wprost: „Haswell on steroids”. Plotki o sekretnych technikach – z odwrotną wielowątkowością na czele – są właśnie tylko plotkami. Architektura Skylake jest projektowana od ponad 5 lat, ale nie od początku miała wyglądać tak, jak wygląda teraz. Założenia architektoniczne bardzo mocno się zmieniły na jednym ze wczesnych etapów prac, kiedy to ustalono, że Skylake ma się nadawać do wykorzystania w bardzo szerokiej gamie procesorów, od niskoenergetycznych i zapakowanych w malutkie obudowy do serwerowych i tych dla „entuzjastów”.
To czysta spekulacja, ale jeśli w Skylake kiedykolwiek planowano zastosować którąś z rewolucyjnych technik przetwarzania, jakie nauka zaproponowała w ostatnich latach, to właśnie wtedy ten plan został porzucony.
Rdzenie x86
Zmiany w Skylake względem Haswella polegają głównie na powiększeniu różnych wewnętrznych buforów, drobnych usprawnieniach jednostek wykonawczych oraz udoskonaleniu podsystemu pamięci podręcznych.
Front-end
Front-end procesora nieco się rozrósł: kolejny raz powiększono pulę instrukcji możliwych do przekolejkowania. Skylake wybiega dalej w przód ze śledzeniem kodu w poszukiwaniu instrukcji możliwych do wykonania z wyprzedzeniem.
Przy powiększaniu buforów korzystano w dużym stopniu z symulacji i modelowania wydajności realnych programów (to standardowa praktyka). Stąd na przykład dziwna szerokość schedulera, 97 instrukcji, niebędąca żadną wielokrotnością potęgi dwójki. Po prostu symulacje wykazały, że przy założeniach, które przyjęto, właśnie taki jest złoty środek między zyskiem wydajności a kosztem w tranzystorach.
Jednostki wykonawcze
W Skylake zwiększono liczbę jednostek wykonawczych, choć Intel nie podaje, jak bardzo i jakiego rodzaju są to jednostki. O ile wiemy, jednostek arytmetycznych jest tyle samo co w Haswellu, a podwojono liczbę tych zajmujących się zapisywaniem i pobieraniem danych z pamięci: Skylake może pobierać 128 bajtów w cyklu zegara (z pamięci L1).
Wykonywanie wielu instrukcji arytmetycznych, szczególnie dzielenia i pierwiastkowania, zostało przyspieszone; na wynik niektórych instrukcji czeka się ponad dwa razy krócej niż w przypadku Haswella. Do tego wiele z tych instrukcji może być połączonych parami w jedną mikrooperację i wykonanych jednocześnie w jednym cyklu zegara. Wiele z tych usprawnień zostało wcześniej wprowadzonych w procesorach Broadwell. Trudno ocenić, jaki to ma wpływ na wydajność istniejących narzędzi. Kompilatory, wiedząc, które instrukcje są wykonywane powoli, mogły ich unikać; przyspieszenie ich wykonania nie zawsze daje oczywiste korzyści.
Poprawiono (jak zwykle) układ przewidywania skoków i pobierania danych z wyprzedzeniem. Zwiększono też liczbę instrukcji, które mogą zakończyć dwa wątki prowadzone przez jeden rdzeń w jednym cyklu zegara. Każdy z nich może zapisać wynik czterech operacji w cyklu, co nie poprawia wydajności w scenariuszach jednowątkowych, ale w niektórych przypadkach może powiększyć zysk z zastosowania Hyper-threadingu.
Techniki związane z bezpieczeństwem
W Skylake dodano dwie istotne techniki sprzętowe, które mają zwiększyć bezpieczeństwo danych i wykonywanych programów. Oczywiście, wciąż bezpieczny jest tylko wyłączony komputer, ale oba te rozwiązania są pewnym krokiem naprzód w łatwości programowania lub bezpieczeństwie kodu.
Memory Protection Extensions – Intel MPX
MPX to technika mająca zapobiegać atakom (lub błędom) przepełnienia bufora. Przepełnienie bufora polega na niepożądanym dostępie do obszaru pamięci, w którym program nie powinien operować. Czasem może to powodować zwykłe błędy, ale niekiedy pozwala wykonać złośliwy kod ze zwiększonymi uprawnieniami.
Działanie MPX polega na sprawdzaniu, czy adresy wskaźników do pamięci mieszczą się w określonych z góry granicach. Granice te są wyznaczane programowo podczas kompilacji przez kompilator, na podstawie algorytmów zdefiniowanych w bibliotece podstawowych procedur języka (w tej chwili MPX jest dostępna tylko w C i C++). Podczas działania programu każdy nowy wskaźnik jest sprawdzany w tablicy granic, przechowywanej przez procesor w kilku specjalnych rejestrach. Jeśli jakiś kod spróbuje uzyskać dostęp do pamięci poza dozwolonym obszarem, procesor wygeneruje błąd dostępu do pamięci.
Wykorzystanie MPX wymaga co najmniej skompilowania narzędzia od nowa. Oprócz zwiększenia bezpieczeństwa MPX może teoretycznie ułatwić programowanie, bo programista ma mniej do debugowania – część rzeczy sprawdzą za niego kompilator i sam procesor. Ale kod skompilowany z MPX jest kompatybilny wstecz z procesorami bez obsługi MPX, a dla nich i tak trzeba programować i debugować starannie.
Oczywiście, testowanie każdego wskaźnika wiąże się z pewną utratą wydajności. Intel nie podaje, jak dużą, ale sugeruje użycie MPX tylko w ważnych dla bezpieczeństwa częściach kodu albo wbudowanie i domyślne wyłączenie MPX. Wtedy można włączyć MPX w przypadku odkrycia luki bezpieczeństwa, dopóki luka nie zostanie załatana aktualizacją oprogramowania.
Technika MPX jest obsługiwana w Windows 10 i Linuksie (kernel 3.19 lub nowszy). Przygotowanie kodu chronionego przez MPX jest możliwe w GCC (wersja 5.0 i nowsze), będzie też możliwe w Microsoft Visual Studio w nieokreślonej przyszłości.
Software Guard Extensions – SGX
SGX jest drugą, bardziej rewolucyjną, techniką związaną z bezpieczeństwem w Skylake. Polega na możliwości utworzenia i sprzętowego ochronienia „odwrotnego sandboksa” – pewnego rodzaju enklawy w pamięci, w której narzędzie może przechowywać swój kod i dane. Do enklawy w pamięci nie ma dostępu żaden inny program, system operacyjny, ani nawet nadzorca maszyn wirtualnych.
Jeśli chodzi o stronę sprzętową, działanie SGX polega na instrukcjach umożliwiających stworzenie enklawy w pamięci, zapełnienie jej zaszyfrowanymi danymi i zamknięcie.
Teoretycznie SGX pozwala utworzyć chroniony obszar i bezpiecznie wykonać kod nawet pod kontrolą niezabezpieczonego systemu operacyjnego. Nawet jeśli złośliwe oprogramowanie ma kontrolę nad systemem operacyjnym, nie może wpłynąć na zawartość enklawy i wykonywanie zamkniętego w niej kodu.
To funkcja przydatna przede wszystkim w środowiskach obliczeń w chmurze, gdzie na jednym komputerze nieraz jest uruchomionych wiele maszyn wirtualnych i wiele narzędzi należących do różnych stron. Enklawy pozwalają ochronić program przed złośliwymi użytkownikami chmury, lub nawet operatorem serwerów. Poza środowiskami serwerowymi SGX można użyć do ochrony haseł i sekretnych danych w przeglądarce internetowej, a nawet do zablokowania dostępu do kodu gry komputerowej, co uniemożliwiłoby działanie większości znanych mechanizmów wykorzystywanych w cheaterskich programach.
Oczywiście, SGX nie jest bez wad. Zasadniczym problemem z każdą taką techniką jest wprowadzanie i wyprowadzanie danych z enklawy do niezabezpieczonych stref. Na przykład, nawet jeśli narzędzie przechowujące hasła jest chronione enklawą i odporne na ataki, malware ciągle może skanować wpisywane z klawiatury dane albo odczytać sekretne dane z wyjścia obrazu. Można się przed tym uchronić przez umieszczenie sterownika klawiatur i sterownika wideo w enklawie – ale skąd będziemy wiedzieć, czy nie wprowadziliśmy do chronionej enklawy złośliwego sterownika? Im więcej elementów wewnątrz chronionej strefy, tym mniejsza z niej korzyść. To samo dotyczy pakietów danych, które gra transmituje przez sieć do serwera: nawet jeśli program jest chroniony, to wychodzące z niego pakiety danych dalej nie są. Znamy przykłady takich ataków: niektóre ze słynnych botów do Diablo II czy World of Warcraft nie miały nawet klienta gry, a wyłącznie fabrykator fałszywych pakietów dla serwera.
Drugim problemem jest możliwość wykorzystania SGX przez twórców złośliwego oprogramowania. Cheat, keylogger albo inny malware sam może być chroniony wewnątrz enklawy, tak by oprogramowanie antywirusowe lub antycheaterskie nie mogło go przeskanować. Eksperci od bezpieczeństwa nie mogliby przeanalizować zaszyfrowanego malware'u, bo do enklawy nikt oprócz samego malware'u nie miałby dostępu.
A gdyby jednak ktoś miał dostęp, na przykład sam Intel (klucze do szyfrowania i deszyfrowania enklaw są generowane przez procesor, którego twórcy mogą wiedzieć to i owo o użytych algorytmach), „autoryzowane” przez Intela narzędzia antywirusowe (McAfee) albo agencje rządowe? To trzeci problem z SGX: zaufanie do każdej techniki opiera się na zaufaniu jej dostawcom.
Jak to się ma do TrustZone?
Być może pamiętacie o technice ARM TrustZone, zaimplementowanej w większości nowoczesnych procesorów w architekturze ARM oraz w najnowszych APU AMD (Beema, Mullins, Carrizo). Oba te rozwiązania są podobne w założeniach. Zasadnicza różnica jest taka, że TrustZone tworzy dwie strefy: chronioną i niechronioną. Strefa chroniona jest niedostępna z niechronionej, ale jest wspólna dla części systemu operacyjnego i wszystkich programów, które chciałyby z niej skorzystać. Intel SGX pozwala utworzyć nie jedną, ale wiele stref chronionych, osobną dla każdego programu. TrustZone udostępnia za to mechanizm bezpiecznego wprowadzania danych (np. PIN-u). Obie techniki są przeznaczone do wykorzystania w nieco innych środowiskach, choć niskoenergetyczne procesory Skylake, które znajdą się w tabletach, oraz serwerowe procesory z TrustZone zaczynają zacierać tę granicę.
Podsystem pamięci
Zmiany w mikroarchitekturze wymuszają pośrednio zmiany w ogólnej budowie układu SoC. Najdłużej niezmienianym elementem SoC Intela jest magistrala pierścieniowa, którą wprowadzono w procesorach Nehalem. W tamtych czasach miała większe możliwości, niż było potrzeba; wraz ze wzrostem wydajności procesorów i interfejsów pamięci stopniał jej zapas wydajności. W Skylake wprowadzono nieujawnione zmiany w protokole komunikacji po magistrali pierścieniowej. Wraz z powiększeniem buforów na każdym przystanku magistrali ma to dwukrotnie przyspieszyć pozyskiwanie danych z pamięci podręcznej L3. Szerokość i taktowanie magistrali pozostały bez zmian, a powiększenie buforów wiąże się według Intela z bardzo małym kosztem energetycznym.
W Skylake zmieniła się też organizacja pamięci podręcznych. W procesorach z dodatkową pamięcią eDRAM (jeszcze nie ma takich w handlu) będzie ona służyła jako pamięć podręczna kontrolera pamięci systemowej. To znaczy, że zamiast przechowywać dane wyrzucone z L3, znajduje się przed samym kontrolerem RAM-u i służy do przyspieszania wszelkich transferów z pamięci głównej i do pamięci głównej.
Różnica polega na tym, że eDRAM może teraz służyć do wszystkich zastosowań (włącznie z przechowywaniem danych, które oprogramowanie oznacza jako niezdatne do przechowywania w cache) oraz wszystkim podukładom, które uzyskują dostęp do pamięci: również kontrolerowi wyjść obrazu w procesorze i urządzeniom PCI-E wykorzystującym transfery DMA.
Ponadto eDRAM będzie stosowany w dwóch rozmiarach: 64 MB lub 128 MB. Inżynierowie projektujący procesory Haswell, w których to Intel po raz pierwszy wykorzystał eDRAM, wybrali pojemność 128 MB „na zapas”, choć już 32 MB dawało niemal tak samo duży wzrost wydajności. Układ graficzny w Skylake'u z eDRAM-em jest znacznie szybszy, interfejs pamięci również przyspieszył, dlatego postanowiono zachować dużą pojemność eDRAM-u. Jądro z dodatkową pamięcią jest w dalszym ciągu produkowane w procesie technologicznym 22 nm; nie jest jasne, czy wersja 64-megabajtowa będzie miała inne, mniejsze jądro czy zostanie wykorzystany niższy sort tych samych jąder.
Podsumowanie
Jak pokazaliśmy na pierwszej stronie, większa część wysiłku inżynieryjnego w architekturze Skylake została skierowana na usprawnienia energetyczne. W trzeciej części tego artykułu opiszemy mechanizmy sprzętowe pozwalające procesorom Skylake osiągnąć odpowiednio niski pobór energii, tak żeby mogły być wykorzystywane we wszystkich zaplanowanych przez Intela zastosowaniach.