Zen wielokrotnie zapowiadano jako pierwszą od dawna zaprojektowaną od zera architekturę. Tylko... co to znaczy „zaprojektowany od zera”?
Projektowanie procesora (nie tylko zwykłego CPU, ale też procesorów graficznych, sieciowych i wielu innych) zaczyna się zawsze od profilowania wydajności. To pojęcie może wam się kojarzyć z programowaniem. Profilowanie wydajności polega tam na analizie, jak jest wykonywany kod programu: które segmenty są wykonywane najdłużej, kiedy program czeka na dane z pamięci, których funkcji używa najczęściej itp. Dzięki temu programiści mogą zidentyfikować „wąskie gardła”: problematyczne procedury, których optymalizacji warto poświęcić najwięcej uwagi.
Podobnie robi się w przypadku procesorów. Najpierw trzeba zdecydować, do czego ma się nadawać dany procesor, w jakich zadaniach ma się sprawować najlepiej. Następnie analizuje się te typowe zadania i przewiduje, jaka konstrukcja będzie do nich najlepsza. Te przewidywania trzeba zweryfikować – sprawdzić, czy nie ma jakichś ograniczeń technologicznych lub ekonomicznych, które nie pozwolą ich zrealizować.
Projektowanie procesora trwa wiele lat, a jego kariera rynkowa – kolejnych kilka lat. Dlatego nie wystarczy zanalizować zadań, które dziś są popularne, ale trzeba przewidzieć, co użytkownicy będą robić na komputerach za wiele miesięcy. Znane i przewidywane zadania służą do stworzenia symulacji typowego użytkowania procesora. Sam procesor projektuje się tak, żeby najlepiej odpowiadał tej symulacji.
Przyjęte na początku projektowania założenia wpływają na wszystkie elementy mikro- i makroarchitektury. Jednostki wykonawcze, wewnętrzne kolejki, bufory i interfejsy, podsystem pamięci podręcznych – wszystko jest dopasowane do tych założeń i nawzajem do siebie. W kolejnych wersjach mikroarchitektury zwykle nie można zmienić zbyt wiele, bo zmiany w jednym podsystemie powodują lawinowo konieczność wprowadzenia zmian gdzie indziej.
Architektura zaprojektowana od zera to taka, w której zaczęto od pierwszego kroku: sformułowania nowych założeń projektowych, przewidzenia na nowo przyszłości oprogramowania i wykonania nowych symulacji. To nie znaczy, że w procesorze wszystko jest nowe. Wiele funkcji zostało już tak dobrze poznanych, że znamy już bliskie doskonałości sposoby na ich zrealizowanie. Na przykład układy przewidywania skoków albo kontrolery pamięci wszystkie mają wiele wspólnego, bo jakiekolwiek możliwe ulepszenia są szczegółami. Poza tym po zrobieniu nowych symulacji i prognoz można dojść do podobnych wniosków, co poprzednio.
Dlatego, chociaż Zen nie jest ewolucyjnym rozwinięciem architektury Bulldozer-Excavator, będziemy czasem porównywać szczegóły tych dwóch architektur bezpośrednio.
Droga do Zen
Prace nad nową mikroarchitekturą AMD ruszyły przed 2012 rokiem. Nazwę roboczą Zen nadał naczelny projektant tej mikroarchitektury, Mike Clark. Miała oznaczać równowagę i kojarzyć się ze wspomnianym wyżej dopasowaniem poszczególnych podsystemów procesora do siebie.
Zen będzie podstawą większości procesorów AMD w nadchodzących latach. Jedna architektura zastąpi dwie rozwijane do tej pory: Jaguar/Puma (K16) (małe rdzenie do niskoenergetycznych procesorów) i Excavator (K15) (do wydajnych procesorów). Teraz do procesorów serwerowych, desktopowych, laptopowych i innych trafią te same rdzenie x86 w różnych konfiguracjach.
Pokazane powyżej i wymienane wielokrotnie na prezentacjach AMD „+40% IPC” było jednym z głównych założeń projektowych.
Drugim było pozostanie na poziomie energetycznym architektury Excavator. Zen ma wykonywać średnio o 40% więcej instrukcji niż Excavator w takiej samej liczbie cykli zegara, i zużywać na każdy cykl tyle samo energii. Jak to osiągnięto?
Jeden wątek znów w łaskach
W Zen zastosowano inną koncepcję wielowątkowości, niż w rodzinie Bulldozer-Excavator (K15). Zamiast klastrowej wielowątkowości (CMT), w której dwa rdzenie zespolono w moduł dzielący niektóre zasoby i jednostki wykonawcze, w Zen wykorzystano pewną formę SMT (Simultaneous Multi-Threading – symultaniczna wielowątkowość). Technikę SMT wykorzystuje większość nowoczesnych wysokowydajnych procesorów; m. in. wszystkie układy Intela poza rodziną Atom, serwerowe procesory SPARC i POWER8.
Technika CMT z rodziny K15 jest bliższa w wydajności, powierzchni rdzenia i liczbie tranzystorów dwóm osobnym rdzeniom. Współdzielone są te części procesora, które – jak spodziewają się projektanci – najczęściej mają wolne zasoby obliczeniowe. SMT jest znacznie bliższe pojedynczemu rdzeniowi; inwestycja w powierzchnię rdzenia i liczbę tranzystorów jest znacznie mniejsza, niż w CMT. W Zen jeden rdzeń może prowadzić jednocześnie dwa wątki, podobnie jak desktopowe procesory Intela. W SMT znakomita większość zasobów procesora jest dostępnych dla jednego wątku, jeśli drugi ich nie używa. Jeśli trzeba, prawie wszystkie zasoby rdzenia można wykorzystać do przyspieszenia wykonywania jednowątkowego kodu, podczas gdy w CMT drugi rdzeń w żaden sposób nie pomaga pierwszemu w jednowątkowych zadaniach. Do implementacji SMT w Zen wrócimy za chwilę.
Front-end
Front-end procesora, w którym pobiera się instrukcje z pamięci, przewiduje się skoki, dekoduje instrukcje i przygotowuje je do wykonania jest pierwszą oznaką, że mamy do czynienia z architekturą zupełnie inną niż K15.
Pamięć podręczna L1 dla instrukcji ma o połowę większą pojemność, niż w Excavatorze – 64 kB dla każdego rdzenia, podczas gdy w Excavatorze 96 kB L1I było wspólne dla 2-rdzeniowego modułu. Ulepszenia układu przewidywania skoków są jak zwykle sekretne. Jako metodę na zwiększenie wydajności i efektywności energetycznej wykorzystano pierwszy raz niewielką pamięć podręczną (o nieujawnionym rozmiarze) przechowującą zdekodowane mikrooperacje. Układ przewidywania skoków decyduje, czy kolejne instrukcje należy pobrać z pamięci L1I i zdekodować, czy wystarczy je pobrać spośród niedawno zdekodowanych mikrooperacji i od razu wysłać do wykonania. Dzięki temu mechanizmowi dekoder i pamięć L1I nie zawsze są wykorzystywane, i można je czasowo wyłączyć i oszczędzić energię. Jeśli instrukcja zostanie odnaleziona w tej pamięci mikrooperacji, może zostać od razu wysłana do wykonania, i nie przechodzi przez trwające kilka cykli dekodowanie – to skraca potok wykonawczy i zwiększa wydajność w niektórych scenariuszach.
Z pamięci L1I można pobrać 32 bajty na cykl zegara, a dekoder dekoduje 4 operacje na cykl; to tyle samo, ile przypadało na caly moduł w architekturze K15. Z kolejki mikrooperacji do jednostek wykonawczych trafia 6 mikrooperacji stałoprzecinkowych (lub 4 zmiennoprzecinkowe) w cyklu zegara - o połowę więcej, niż w całym module K15.
Zastosowano ponownie mechanizmy łączenia makrooperacji i mikrooperacji, w ulepszonej względem K15 formie. Kolejka mikrooperacji przechowuje niektóre pary mikrooperacji w skompresowanej formie, i rozdziela je na dwie dopiero przy wysyłaniu do części wykonawczej.
Zen ma znacznie większe okno out-of-order, czyli śledzi kod w poszukiwaniu skoków i zależności ze znacznie większym wyprzedzeniem, niż Excavator. AMD nie ujawnia, z jak dużym: rozmiar kolejki mikrooperacji i pamięci podręcznej zdekodowanych mikrooperacji nie są znane. Porównanie rozmiaru innych wewnętrznych buforów do architektur Haswell, Broadwell i Skylake pozwala sądzić, że okno OoO w Zen to około 200 instrukcji (podobnie jak Haswell i Broadwell).
Nowoczesny zestaw instrukcji
Zestaw instrukcji Zen został rozszerzony o najbardziej przydatne instrukcje znane z CPU Intela: RDRAND i RDSEED (do generowania liczb losowych), instrukcje przyspieszające szyfrowanie algorytmami wykorzystującymi funkcje SHA oraz tryby ograniczonego dostępu do pamięci SMAP i SMEP. Dodano też kilka nowych instrukcji zaprojektowanych specjalnie dla Zen, dotyczących pamięci podręcznej: jedną można wyczyścić całą linię cache, druga umożliwia łączenie 4-kilobajtowych stron w 32-kilobajtowe. Obie moga posłużyć głównie do optymalizacji wydajności, o ile oprogramowanie i system operacyjny ich użyją.
Schedulery i jednostki wykonawcze
Schedulery i jednostki wykonawcze Zen są kolejną diametralną różnicą względem K15. Mikrooperacje trafiają do sześciu osobnych schedulerów, po jednym dla każdej z 4 jednostek arytmetyki stałoprzecinkowej i dwóch jednostek generowania adresów. Sześć jednostek wykonawczych to prawie tyle samo, co w architekturach Haswell i Skylake – te mają jeszcze trzecią jednostkę generowania adresów. Każdy scheduler śledzi 14 instrukcji; w sumie 84 instrukcje, prawie dwa razy więcej, niż w K15.
Pula rejestrów to PRF (Physical Register File) – przemianowywanie rejestrów działa bez przesuwania danych między rejestrami; dla oszczędności energii zmienia się tylko ich nazwy. 168 rejestrów to tyle samo, ile dali inżynierowie Intela architekturom Haswell i Broadwell.
W odróżnieniu od jednostek ALU w procesorach Intela, w Zen wszystkie są symetryczne – mają takie same możliwości wykonywania instrukcji i nie są wyspecjalizowane.
Część zmiennoprzecinkowa ma cztery jednostki wykonawcze, co pozwala wykonać maksymalnie cztery instrukcje 64-bitowe lub dwie FMA w jednym cyklu zegara. Scheduler łączy niektóre instrukcje w makrooperacje, ale dopiero przed wykonaniem, kiedy zależności między instrukcjami są już rozwiązane; mamy do czynienia z pewną formą wewnętrznych instrukcji SIMD operujących jednocześnie na 4 64-bitowych rejestrach, ale szczegóły nie są znane.
W części zmiennoprzecinkowej zastosowano dodatkową kolejkę instrukcji czekających na wysłanie do schedulera. Dzięki temu operacje zmiennoprzecinkowe można natychmiast usunąć z kolejki mikrooperacji (patrz schemat z 2. strony) i zwolnić w niej miejsce na więcej operacji stałoprzecinkowych. W ten sposób wolno wykonywane instrukcje zmiennoprzecinkowe i zapełniony scheduler FP nie powinny nigdy opóźniać pracy części stałoprzecinkowej. To szczególnie ważne ze względu na SMT – oba wątki powinny jak najczęściej mieć dostęp do jednostek stałoprzecinkowych.
SMT - symultaniczna wielowątkowość
Rdzeń Zen może prowadzić jednocześnie dwa wątki dzięki technice SMT. Niemal wszystkie zasoby procesora są dostępne dla obu wątków. Większość jest przydzielana do konkretnego wątku na zasadzie algorytmu karuzelowego (oznaczone na czerwono), w którym oba wątki otrzymują na przemian małe przedziały czasu (lub pamięci) na wykonanie swoich zadań.
Układy przewidywania skoków oraz przemianowywania rejestrów (oznaczone na niebiesko) są współdzielone w bardziej zaawansowany sposób. Szczegóły algorytmów są tajemnicą, ale wiemy, że priorytet otrzymują krótsze lub bardziej krytyczne zadania (od których wyniku więcej zależy). Część struktur jest „na sztywno” podzielona między wątki (oznaczone na zielono), co nie jest optymalnym rozwiązaniem z punktu widzenia wydajności, ale było konieczne, żeby nie poświęcać zbyt wielu tranzystorów, zbyt dużo powierzchni jądra i zbyt wiele energii na implementację SMT.
Makroarchitektura
Organizacja pamięci podręcznej (cache)
Poszerzone okno wykonywania instrukcji z wyprzedzeniem stawia większe wymagania co do systemu pamięci podręcznych. Więcej instrukcji trzeba pobierać z wyprzedzeniem, trzeba też szybciej zapisywać wyniki. Pamięć podręczna w Zen ma 3-poziomową strukturę. 64 kB pamięci L1 instrukcji zapewnia odpowiednią przepustowość algorytmom pobierania z wyprzedzeniem. Z 32-kilobajtowej pamięci L1 danych można pobrać 32 bajty w jednym cyklu zegara i zapisać 16 bajtów, co odpowiada przeciętnym programom, które zwykle więcej odczytują niż zapisują.
W odróżnieniu od poprzednich procesorów AMD, pamięć podręczna L1 pracuje w trybie write-back: dane z niej są przenoszone do pamięci L2 i dalej dopiero wtedy, kiedy trzeba zwolnić miejsce w L1. Poprzednio L1 pracowała w trybie write-through, czyli dane zapisane do L1 były natychmiast aktualizowane w L2. Jak twierdzą projektanci, rzadsze zapisywanie do L2 oszczędza znaczą ilość energii.
Pamięć podręczna L2 ma pojemność 512 kB (w Excavatorze – 1 MB na wspólne dla dwóch rdzeni). Pamięć podręczna L3 jest wspólna dla czterech rdzeni i składa się z 2-megabajtowych segmentów.
CPU Complex
Rdzenie Zen będą na poziomie SoC pogrupowane po cztery. Taką grupę AMD nazywa CPU Complex (CCX). W skład CCX wchodzą też cztery segmenty pamięci podręcznej L3, której cała pojemność jest wspólna dla wszystkich rdzeni. Ta organizacja przypomina procesory Intela, ale w odróżnieniu od nich, w Zen L3 działa jako ekskluzywna pamięć w trybie victim – jest zapełniona danymi wyrzuconymi z L2. L2 i L3 nie przechowują zwykle tych samych danych, poza wyjątkami, o których inżynierowie AMD nie powiedzieli więcej.
Pamięć L3 ma własną strefę taktowania i nie pracuje z prędkością rdzeni x86. Sposób połączenia poszczególnych segmentów L3 z innymi jest na razie tajemicą. Wiemy tylko, że nie jest pochodną łącza HyperTransport ani systemem łącz punkt-punkt między wszystkimi segmentami L3 i rdzeniami. Dostęp do pamięci L3 jest szybszy, jeśli dane zostaną odnalezione w lokalnym segmencie, i wolniejszy, jeśli są w segmencie L3 przy innym rdzeniu. Adresy lokacji w pamięci są równomiernie rozłożone pomiędzy segmenty L3, więc średni czas dostępu do L3 jest taki sam dla każdego rdzenia i każdego zakresu adresów. To może oznaczać, że mamy do czynienia z rozwiązaniem podobnym do magistrali pierścieniowej.
W układach SoC z więcej niż jedną grupą rdzeni (CCX) komunikacja między częściami SoC potrzebującymi dostępu do wspólnej pamięci L3 będzie następować za pośrednictwem dodatkowego switcha. Jeżeli AMD użyło jakiegoś rodzaju magistrali pierścieniowej, to zapewne nie sięga ona poza CCX, tak jak w serwerowych procesorach Intela.
Poziom SoC
Niestety nie wiadomo wiele więcej na temat organizacji pozostałych części SoC i sposobu połączenia ich z grupami rdzeni x86. Wiemy, że AMD przygotowuje co najmniej dwie wersje kontrolera PCI Express: procesory Summit Ridge (8 rdzeni, 16 wątków, bez GPU) będą mieć więcej linii PCI Express i możliwość podłączenia dodatkowych kontrolerów IO, niż nadchodzące później APU Raven Ridge (4 rdzenie, 8 wątków, GPU). Nie wiadomo też, w jaki sposób będą zintegrowane podsystemy pamięci CPU i GPU w APU z architekturą Zen. W poprzednich APU AMD wewnętrzne magistrale między CPU, GPU i kontrolerem pamięci zapewniające zunifikowaną przestrzeń adresową były dość ważnym elementem wpływającym na wydajność GPU. Musi też istnieć jakiś nowy mechanizm pozwalający na połączenie dwóch jąder CPU w konfiguracje 16- i 32-rdzeniowe, jakie będą sprzedawane w serwerach.
Podsumowanie
Pod wieloma względami Zen jest architekturą bardzo podobną do niedawnych architektur Intela. Wielkości różnych wewnętrznych buforów, szerokość front-endu, liczba instrukcji możliwych do wysłania do wykonania w jednym cyklu – wiele z tych parametrów odpowiada Haswellowi, Broadwellowi lub Skylake. Również niektóre funkcje takie jak pamięć podręczna zdekodowanych mikrooperacji są bliźniaczo podobne.
Nas to nie dziwi: podobne symulacje i projekcje przyszłościowych zadań obliczeniowych muszą dać podobne wyniki i zasugerować podobne rozwiązania. Jak wspomnieliśmy na początku, procesory są projektowane z myślą o oprogramowaniu, a oprogramowanie z myślą o procesorach. Popularność procesorów Intela powoduje, że trzeba albo podążać podobną drogą, albo ryzykować i stawiać na innowacje – i zdawać się na łaskę twórców oprogramowania, którzy notorycznie są kilka lat do tyłu za nowinkami sprzętowymi. AMD zwykle stawiało na innowacje, co czasem nie wychodziło im na dobre (szczególnie w połączeniu z problemami produkcyjnymi, jak w pierwszych wcieleniach architektury Bulldozer), a czasem było jednym z głównych motorów biznesu (jak kontrakty na APU w konsolach).
Ciągle nie znamy wszystkich szczegółów budowy Zen, i nie wiemy jakie inne innowacje AMD już wykorzystało w rdzeniach x86 lub w budowie układów SoC. Rdzenie Zen zobaczymy w najbliższej przyszłości w procesorach o nazwach roboczych:
- Summit Ridge – wysokowydajne procesory desktopowe do podstawki AM4. Będą mieć 8 rdzeni (16 wątków) i nie będą wyposażone w układ graficzny. Dostawy do partnerów mają ruszyć w tym roku, a w sklepach spodziewamy się ich w pierwszych tygodniach 2017 roku.
- Raven Ridge – pierwsze APU z rdzeniami Zen, również do podstawki AM4. Będą mieć 4 rdzenie (8 wątków) i trafią do sprzedaży w nieokreślonej części 2017 roku.
- Zeppelin/Naples – procesory serwerowe z 8, 16 lub 32 rdzeniami (maksymalnie 64 wątki!) i dwu- lub czterokanałowym kontrolerem pamięci. Obecnie przechodzą testy u producentów serwerów, mają zacząć pojawiać się w serwerach w 2. kwartale 2017 roku.
Na koniec zacytujemy wczorajszą wypowiedź głównego architekta Zen, Mike'a Clarke'a: „AMD is back, and it's back to stay.”. Mike Clark powiedział to w odniesieniu do projektowania procesorów: architektura Zen ma być punktem wyjścia do dalszych usprawnień.
Obecnie toczą sie prace nad Zen+, drugim etapem ewolucji tej architektury. Tylko o K12, nowej architekturze ARM, od dawna nic nie słychać...
INB4: więcej slajdów, !remindme 6 months, AMD 2 lata w tyle, poczekam na testy, może 6700k stanieje, wreszcie procesor bez IGP