Skok do teraflopsa
Z tą jednostką miary wydajności maszyn obliczeniowych stykamy się najczęściej przy okazji opisów superkomputerów – nic dziwnego, gdyż oznacza ona tryliony (Tera) operacji zmiennoprzecinkowych (Floating Point operations) na sekundę. Z takimi wydajnościami nie spotykamy się na co dzień, chociaż już mamy do tego blisko – sumaryczna wydajność obliczeniowa GeForce 8800 GTX wynosi około 500 Gflops, czyli pół teraflopsa. Wróćmy jednak na chwilę do superkomputerów.
Pierwszą teraflopową maszyną na świecie był oddany do użytku w Sandia National Laboratories w 1997 roku komputer ASCI Red. Jego 104 szafy zawierały łącznie przeszło 9 tysięcy 200-megahercowych procesorów Pentium Pro, zaś szczytowa wydajność przekraczała nieco 1,3 Tflops.
Czasy się zmieniają, technika idzie naprzód - po dziesięciu latach od czasów ASCI Red, teraflopowa maszyna przybrała nieco skromniejszy wygląd, stając się pojedynczą płytą.
Tysiące procesorów, jakie potrzebne były do uzyskania teraflopowej wydajności, zastąpił pojedynczy układ scalony, obdarzony kodową nazwą Polaris, złożony z zaledwie około 100 milionów tranzystorów.
Chip jak chip, przy czym na zdjęciu widzimy, że i w laboratoriach Intela zdarza się ukruszenie narożników krzemowej kostki. To na pociechę dla tych, którzy w ten sposób popsuli swoje Athlony i Durony! Wracając do tematu - jak na skalę dziesięciu lat, skok wydaje się ogromny, jednak do pełnego wykorzystania możliwości architektury Polaris będzie musiało minąć jeszcze kilka lat. Potrzeba będzie także kilku nowych rozwiązań technologicznych. Dlaczego?
Makroarchitektura i brakujące ogniwo
Na powierzchni 275 milimetrów kwadratowych układu, wykonanego w wymiarze technologicznym 65 nm, z dziewięcioma warstwami połączeniowymi, znalazło się miejsce dla 80 niewielkich „kafelków”, z których każdy tworzy samodzielny procesor, z własną pamięcią danych i instrukcji. Fotografia chipu pokazuje nam relatywnie duże odstępy pomiędzy poszczególnymi „kafelkami”. Nie jest to bynajmniej niewykorzystana przestrzeń – tędy przebiega sieć połączeń, tworząca jedną całość z osiemdziesięciu indywidualnych układów. Warto wiedzieć, że przepływność połączenia w tej sieci wynosi 32 GB/s.
Zauważmy, że blisko jedną czwartą „kafelka” Processing Engine o powierzchni trzech milimetrów kwadratowych stanowi układ, któremu nadano nazwę "router". Jego konstrukcja jest oparta na sześcioportowym przełączniku krzyżowym. Sterowany programowo, umożliwia komunikację jądra obliczeniowego z układami wejścia/wyjścia, a także przekazywanie zadań pomiędzy poszczególnymi jądrami.
Cztery spośród wejść/wyjść routera prowadzą do sąsiednich jąder (jedno jest przeznaczone na własny użytek jednostki PE). Jest jeszcze piąte, skierowane... na razie donikąd. Jak wspomnieliśmy wcześniej, do pełnej użytkowości układowi Polaris jeszcze nieco brakuje – ów piąty port routera ma współpracować bezpośrednio z pamięcią RAM, która zostanie nałożona na chip i połączona z nim.
Obecnie Intel prowadzi szeroko zakrojone prace nad praktyczną realizacją struktury złożonej z kilku chipów nałożonych jeden na drugi. Zauważmy, że indywidualny dostęp każdego z jąder do pamięci (oczywiście wieloportowej) eliminuje problemy niedoboru pasma przepływności, przed jakim stają coraz częściej współczesne procesory wielordzeniowe. Pojemność chipu pamięci, nałożonego na układ Polaris, Intel ostrożnie szacuje na 256 MB. Jeśli pamięć ta będzie do podziału dla osiemdziesięciu jąder, to nie jest zbyt wiele, jednak jeśli potraktujemy ją jako wspólną dla wszystkich jąder pamięć cache drugiego poziomu, to wystarcza aż nadto. Pozostaje tylko czekać, aż Intel zrealizuje praktycznie „brakujące ogniwo” i piąty port routera zostanie połączony z pamięcią RAM.
Mikroarchitektura – 80 chudziutkich jąderek
Popatrzmy teraz bardziej wnikliwie na architekturę miniaturowych jednostek obliczeniowych Processing Engine. Nie zniechęcajcie się obrazkiem!
Dwie 32-bitowe jednostki zmiennoprzecinkowe FPMAC z funkcją mnożenia, pracujące w trybie akumulacji (to znaczy, że wynik operacji trafia do rejestru, w którym znajdował się jeden z operandów), współpracują z zestawem 32 rejestrów, zorganizowanym tak, że możliwe jest równocześnie dokonanie sześciu odczytów i czterech zapisów. 2-kilobajtowa pamięć RAM danych (D MEM) dostępna jest przez 64-bitową szynę zarówno dla zespołu rejestrów, jak i dla układu RIB – Router Interface Block.
Zwraca uwagę brak jakiegokolwiek dekodera instrukcji – elementu, do którego obecności przywykliśmy w klasycznej architekturze procesorów. Dekodera instrukcji nie ma, ponieważ odczytywane z pamięci I MEM instrukcje sterują jednostkami procesora bezpośrednio. W Processing Engine zastosowano bardzo uproszczoną architekturę VLIW – Very Long Instruction Word, w bardziej wyrafinowanych formach znaną nam z procesorów Transmeta i Intel Itanium. W 96-bitowym słowie instrukcji może być zawarte do sześciu poleceń, adresowanych do poszczególnych układów funkcjonalnych. Możliwe jest więc równoczesne wydanie instrukcji dla obu jednostek FPMAC oraz dwóch instrukcji zapisu i dwóch odczytu z pamięci D MEM, a także kombinacje tych instrukcji z rozkazami przeznaczonymi dla routera. Prościej, a zarazem skuteczniej, chyba się tego zrobić nie da.
Ale jedna cecha układu PE stanowi o tym, że od Polaris do rzeczywistego Terascale Computing jest jeszcze dość odległa droga. To fakt, że jednostki FPMAC są jedynie 32-bitowe – w większości dzisiejszych zastosowań konieczne są natomiast obliczenia zmiennoprzecinkowe z podwójną precyzją...
Wydajność i moc
Przejdźmy wreszcie do tego, co jest najistotniejsze w całym przedsięwzięciu – do osiągów układu i ponoszonych na ich rzecz kosztów w postaci poboru mocy i związanych z nim problemów.
Układ może pracować przy bardzo szerokim zakresie napięć zasilających. Oczywiście im wyższe napięcie, tym wyższa jest także osiągana częstotliwość pracy, a co za tym idzie, wydajność.
Tak wyglądały wczesne charakterystyki układu. Jak widać, aby osiągnąć wydajność jednego teraflopsa, procesor musi pracować z zegarem 3,13 GHz i napięciem zasilającym niespełna 1 V. Pobiera wówczas moc 98 W. Osiągnięcie wydajności 1,28 Tflops wymaga zegara 4 GHz i napięcia zasilającego 1,2 V – pobór mocy w takim trybie pracy wynosi 230 W. Ale to są osiągi z pierwszych testów. Obecnie Polaris ma nieco lepszą charakterystykę (tym razem wersja dla uczulonych na wykresy! ;-).
Tym niemniej osiągnięcie wydajności 1,81 Tflops pociąga za sobą pobór mocy wynoszący 265 W. Strach się bać!
Chociaż Polaris nie jest układem użytkowym, od początku jego projektowania przewidziano szereg mechanizmów umożliwiających oszczędzanie energii.
Każde z jąderek (PE) może być wprowadzone w stan oczekiwania, przy którym jest gotowe do natychmiastowego podjęcia pracy (dane pozostają zachowane w pamięci), albo stan uśpienia z wyłączonymi pamięciami. Z kolei wewnątrz PE wyznaczono aż 21 obszarów, które mogą być wprowadzane w stan uśpienia. Wszystko to sprawia, że gdy nie jest niezbędna pełna wydajność, pobór mocy znacznie spada.
Sekret szybkiego zegara
Chip układu Polaris ma spore rozmiary i generator zegara umieszczony na jednej z krótszych krawędzi. Rodzi to możliwość powstawania dużych różnic w czasie docierania sygnału zegara do różnych obszarów chipu, co stanowi poważny czynnik ograniczający możliwość przyspieszania zegara. Dzięki przemyślanej organizacji dystrybucji sygnału zegarowego w Polaris, jego opóźnienia nie są drastycznie duże, ale...
... w niektórych rejonach chipu osiągają nawet 250 ps (pikosekund). Przypomnijmy, że w układzie Pentium 4 "Prescott" maksymalne opóźnienie zegara nie przekraczało 50 ps. A tymczasem Polaris, mimo tak dużych opóźnień sygnału, może pracować z zegarem o częstotliwości bliskiej 6 GHz. Jak to możliwe?
Wyjaśnienie zagadki zawarte jest w opisie schematu blokowego routera, w którym znajdujemy Mesochronous Interface MSINT – interfejs mezochroniczny. Okazuje się, że wszystkie jednostki PE i komunikacja pomiędzy nimi są wprawdzie taktowane tym samym zegarem, ale w sposób niewrażliwy na przesuniecie fazowe, dzięki czemu ewentualne opóźnienie zegara może wynosić nawet więcej niż połowę długości jego okresu. Tę cechę Polaris warto zapamiętać – przyda się przy rozważaniach na temat praktycznych zastosowań tego układu.
Co się z tego da zrobić?
Na dzień dzisiejszy praktyczna użyteczność układu Polaris jest, pomimo jego gigantycznej wydajności, wręcz znikoma. Natomiast plany na przyszłość przedstawiają się szalenie obiecująco.
Pierwszy krok to wyposażenie układu w pamięć SRAM, dostępną dla każdego z jąderek przez jego router. W takiej postaci będzie on mógł znaleźć wiele różnych zastosowań. Kolejny krok, dużo ciekawszy, to zastąpienie części zmiennoprzecinkowych PE jądrami klasycznymi, z ALU, czyli architektura heterogenicznego jądra. I krok następny – wszystkie jądra przybierają charakter CPU ogólnego przeznaczenia. Jak wykorzystać powstałą w ten sposób potęgę? Tu jest zagadka, ale...
... rozwiązanie może przyjść szybko.
Jak już wspomnieliśmy na wstępie, szybciej niż można się spodziewać na podstawie publikowanych tu planów Intela. Jak wielu Czytelników zapewne już wie, niedawno powstała Intel Visual Computing Group (VCG) – dział zajmujący się procesorami graficznymi. VCG zapowiada swój GPU, zdolny do rywalizacji z najszybszymi układami NVIDII czy AMD/ATI już na 2009 rok – bardzo szybko, jak na formujący się jeszcze zespół. Trudno się oprzeć wrażeniu, że punktem wyjścia do tej konstrukcji jest właśnie... układ dziś prezentowany pod nazwą Polaris. Przypomnijmy, że Polaris zawiera rozwiązanie problemu, który wciąż ogranicza możliwości stosowania szybszego taktowania procesorów graficznych – opóźnień transmisji sygnału zegarowego na wielkich chipach. To właśnie dlatego obecne GPU pracują z relatywnie niskimi częstotliwościami...
Oczywiście jest to kolejna „zgadywanka”, ale przecież Czytelnicy wiedzą, że lubię zgadywać. Czasem udaje mi się trafić...