2 razy więcej bitów

Czy przejście z IA32 na IA64 będzie przypominać migrację z architektury 16- na 32-bitową? Wygląda na to, że pod wieloma względami będzie to proces znacznie trudniejszy.

Czy przejście z IA32 na IA64 będzie przypominać migrację z architektury 16- na 32-bitową? Wygląda na to, że pod wieloma względami będzie to proces znacznie trudniejszy.

Współczesne procesory mają coraz bardziej rozbudowaną logikę wewnętrzną. Do najnowszych układów Intela, a także do ich klonów jest wprowadzanych coraz więcej bloków wykonawczych, które równolegle potrafią wykonywać kilka instrukcji w jednym cyklu zegara. Jednocześnie istnieje wiele instrukcji, które nie mogą być wykonywane jednocześnie - na przykład instrukcje, które zapisują i odczytują ten sam obszar pamięci czy też korzystają z tych samych zasobów. musi na nowo "odkrywać" to, co kompilator "wie" już na etapie przetwarzania kodu źródłowego i generowania plików wynikowych - które z poleceń mogą działać równolegle.

Kilka naraz

Chcąc aby instrukcje w architekturze IA32 były wykonywane równolegle, kompilator mógł je w odpowiedni sposób przestawić, tak by kolejno wykonywane operacje nie powodowały konfliktów w dostępie do zasobów. Wąskim gardłem były wszelkiego rodzaju instrukcje warunkowe, w przypadku których nieprawidłowe przewidzenie wyniku powodowało konieczność zatrzymywania niemal wszystkich równolegle wykonywanych operacji i uruchomienie ich od początku. To, jakie zasoby były blokowane i jaka powinna być kolejność instrukcji, zależało od typu procesora. Wprawdzie Pentium, Pen-tium II czy Pentium III mają ten sam bazowy zestaw instrukcji, ale tak naprawdę program powinien być oddziel- nie optymalizowany dla każdego z nich. Zasady optymalizacji nie były więc jasne. Problemy pojawiały się zwłasz- cza w przypadku "dostrajania" aplikacji wielozadaniowych.

Systemy operacyjne

W ograniczonym zakresie są już dostępne 64-bitowa wersja Windows Advanced Server (Limited Edition), działająca na IA64, oraz wersje beta Windows XP/Whistler 64. Nie wiadomo, czy powstanie wersja systemu dla AMD 64. Jednak już teraz w plikach nagłówkowych Platform SDK można znaleźć pewne struktury związane z tym procesorem.

Na IA64 są dostępne cztery dystrybucje Linuxa z kernelem Trillian. Jego twórcy zakładają, że kernel przeniesiony na nową platformę znajdzie miejsce w głównym drzewie źródeł jądra systemu (na razie jest to nakładka na dystrybucję 2.3). W prace zaangażowało się wiele firm, m.in. Caldera, Red Hat, HP, IBM i Intel.

Dostępny jest też emulator procesora IA64, działający na Pentium, opracowany przez HP Ń Ski. Jest to emulator funkcjonalny; nie symuluje dokładnie zachowania IA64 - nie można na nim analizować np. równoległego wykonania instrukcji czy symulować systemów wieloprocesorowych. Pozwala jednak w ograniczonym zakresie testować aplikacje na nową platformę.

HP ma także 64-bitową wersję systemu HP-UX.

Wprowadzając IA64, Intel zaproponował architekturę, w której dostępne są instrukcje dokładnie określające, jakie fragmenty kodu mogą być wykonywane równolegle. Kompilator w trakcie analizy programu określa, które elementy nie będą ze sobą kolidować.

Procesor Itanium został zaprojektowany w architekturze nazywanej EPIC (Explicitly Parallel Instruction Computing). Dysponuje on innym zestawem instrukcji (o trochę innej semantyce i składni niż w procesorach 32-bitowych). Dzięki temu, że procesor nie zawiera układów odpowiedzialnych za automatyczne zrównoleglenie kodu, ma do dyspozycji więcej bloków funkcjonalnych. Przy dobrze zoptymalizowanym kodzie Itanium może wykonywać w jednym cyklu zegara maksymalnie 6 instrukcji (dokładniej - co najwyżej 20 operacji jednostkowych, takich jak porównanie, odczyt/zapis pamięci czy operacja arytmetyczna na rejestrach). Dysponuje m.in. 2 jednostkami do obliczeń zmiennoprzecinkowych, 10 jednostkami typu ALU, 2 jednostkami dostępu do pamięci itp. Co najważniejsze, każda jednostka wykonawcza może przyjmo- wać jedno polecenie w cyklu zegara; praktycznie wyeliminowano instrukcje "trwające" więcej niż jeden cykl zegara.

Itanium zawiera 128 rejestrów cał-kowitoliczbowych, 128 zmiennoprzecinkowych, 8 do kontroli instrukcji warunkowych (przechowujących adresy odpowiednich fragmentów kodu), a także 64 jednobitowe rejestry P, pozwa- lające określić, czy dana instrukcja ma być wykonana czy nie (rejestry pełnią rolę szybkich semaforów). Został także rozbudowany rejestr CPUID, który informuje o możliwościach konkretnego modelu procesora.

Niewiele jest algorytmów, w których można by efektywnie wykorzystać taką liczbę rejestrów. Intel zdecydował się wprowadzić mechanizm, w którym rejestry są w specjalny sposób obracane (zamieniane miejscami). Implementowany jest bardzo szybki stos, który wykorzystuje 75% rejestrów. W przypadku rejestrów całkowitoliczbowych do dyspozycji programu pozostają 32 rejestry. Ponadto w procesorze jest zaimplementowany mechanizm RSE, który dynamicznie przesuwa najdawniej wykorzystywane rejestry do pamięci, co pozwala tworzyć stos o dowolnym rozmiarze, a jednocześnie zapewnia, że ostatnio używane elementy znajdują się w rejestrach. To rozwiązanie powinno bardzo przyspieszyć wywoływanie procedur, a także przechowywanie tymczasowych informacji. Także zapisanie stanu procesora przy przełączaniu zadań powinno działać bardzo szybko.

Pod warunkiem...

W IA64 zmieniły się zasady wykonywania instrukcji warunkowych. Sprawdzanie wartości warunku często wymaga odwołania do pamięci i trwa stosunkowo długo. W przypadku starszych procesorów Pentium program "przewidywał", że dany warunek jest prawdziwy i przetwarzał dalej te instrukcje, które miały być wykonane w następstwie jego prawdziwości. Natomiast, gdy okazywało się, że warunek jest fałszywy, obliczenia musiały być wykonywane od początku. Itanium równolegle wykonuje oba zestawy instrukcji i w momencie, gdy znany jest już wynik porównania, przestaje wykonywać niepotrzebny ciąg. Specjalne rejestry P pozwalają eliminować dużą część instrukcji warunkowych i skoków. Każda instrukcja może być oznaczona znacznikiem, który określa, który z rejestrów decyduje czy należy ją w danym momencie wykonywać. Manipulując rejestrami P, można efektywnie równolegle wykonywać nawet kilka następujących po sobie instrukcji warunkowych.

W Itanium wprowadzono mechanizmy pozwalające zakładać, że np. po wykonaniu porównania, system będzie potrzebował dostępu do danego zasobu (rejestru czy pamięci). W związku z tym pewne operacje są wykonywane wcześniej, niż wynikałoby to z normalnego przetwarzania programu, a potem odbywa się już tylko szybka weryfikacja, czy poprzednio odczytana wartość jest poprawna. Eliminuje to większość opóźnień związanych z dostępem do pamięci. Procesor może wykonywać instrukcje równolegle zarówno wtedy, gdy występuje zależność pomiędzy danymi, jak i wówczas gdy występuje bardzo rozbudowana instrukcja warunkowa.

IA64 pozwala szybciej wykonywać krótkie pętle. Można wykorzystać "obrotowe" rejestry, by równolegle wykonać kilka iteracji pętli (składając potem wynik). W ten sposób większość pętli, zwłaszcza tych nie wymagających wykonywania wielu operacji, działa nawet w czterokrotnie mniejszej liczbie cykli zegara. Warto też dodać, że Itanium zawiera specjalne rejestry kontrolujące przebieg takich pętli, które pozwalają m.in. w podobny sposób obsługiwać zagnieżdżone pętle.

Multimedia

Itanium zawiera także dużo instrukcji pozwalających wykonywać operacje tzw. multimedialne. Standardowo tego typu operacje są wykonywane na liczbach 8-, 16- lub 32-bitowych. IA64 może wykonywać równolegle kilka instrukcji multimedialnych i przetwarzać naraz znacznie większe bloki pamięci.

Testowy algorytm wykrywania ruchu w standardzie MPEG2 zajmuje 10 instrukcji. W Itanium można go zapisać w 9 instrukcjach, przy czym 3 grupy poleceń będą wykonywane równolegle. Istnieją operacje grupowego wykonywania operacji arytmetycznych, porównywania, czy szukania wartości największej bądź najmniejszej w grupie rejestrów. IA64 obsługuje zarówno instrukcje typu MMX, SIMD, jak i SSE. Dostępna jest bardzo szybka instrukcja "pomnóż i dodaj", szeroko wykorzystywana m.in. w algorytmach szyfrujących.

Pamięć notatnikowa

Kolejna zmiana dotyczy organizacji pamięci podręcznej. Pamięć cache poziomu L1 będzie miała dodatkowe mechanizmy kontroli poprawności danych. Oprócz powszechnie stosowanej kontroli parzystości, będą dostępne bardziej zaawansowane mechanizmy, np. kod ECC, który pozwala korygować błędy. Procesor będzie także mógł ponownie przeładować błędną zawartość pamięci.

W Itanium pamięć podręczna znajduje się obok głównej kości procesora. Kolejna seria 64-bitowych procesorów - McKinley - będzie miała pamięć podręczną pierwszego poziomu, zintegrowaną na tej samej płycie krzemu, co procesor. Dzięki temu nie będzie konieczne wykorzystywanie szyny BSB w dostępie do danych znajdujących się w cache. Itanium zawiera instrukcje, które pozwalają określić, w jaki sposób jest wykorzystywana linia pamięci podręcznej (gdzie przechowywana jest wartość odczytywana z L2 czy z pamięci operacyjnej). Pozwala to tworzyć doskonale zoptymalizowane procedury, np. kopiowania pamięci.

Korzyści

Architektura Itanium pozwala zbudować system z 512 procesorami. Intel opracował chipset (460GX), który obsługuje co najwyżej 4 procesory. Specyfikację chip-setu przekazano partnerom. Przykładowo, prace nad 8-procesorową wersją prowadzi Compaq, a Unisys rozwija wersję przeznaczoną do obsługi 32 procesorów. HP, już z myślą o układzie McKinley, przygotowuje specjalną wersję serwera Superdome, która będzie mogła obsłużyć 64 procesory.

Procesor współpracuje z szyną o częstotliwości 133 MHz. Jednak z uwagi na to, że potrafi równolegle pobierać 2 instrukcje, powszechnie przyjmuje się, że jest taktowany dwa razy większą częstotliwością. Główna szyna dostępu do pamięci ma w przybliżeniu przepustowość rzędu 2,1 GB/s.

Wstępne wyniki testów ujawniają przewagę procesora Intela nad konkurencyjnymi rozwiązaniami Sun SPARC. Tylko w przypadku obliczeń na liczbach całkowitych procesory taktowane analogicznym zegarem mają bardzo podobny wynik. W pozostałych testach IA64 był szybszy o co najmniej kilkadzie- siąt procent. Intel zawsze dysponował bardzo szybką jednostką, odpowiedzialną za obliczenia zmiennoprzecinkowe - 64-bitowy procesor ma moc ok. 6,4 Gflops. W standardowym teście obliczeń liniowych (Linpak) IA64 wypada ponad dwa razy lepiej niż rozwiązanie Suna.

Procesor IA64 wspiera sekwencyjne wykonywanie określonych operacji (np. dodawanie, mnożenie czy obliczanie pierwiastka kwadratowego). Ważne jest odpowiednie ułożenie kolejności ope- racji zmiennoprzecinkowych, dzięki czemu np. w 4 cyklach może być wykonanych 6 czy nawet 8 instrukcji zmiennoprzecinkowych. Znacznie przyspieszono operację dzielenia. Itanium może wykonywać operacje na tzw. zdenormalizowanych liczbach zmiennoprzecinkowych. W poprzednich wersjach procesora niemal po każdej operacji trzeba było wykonać normalizację, by móc kontynuować obliczenia. IA64 wszystkie argumenty operacji zmiennoprzecinkowych zapisuje w 82-bitowych rejestrach i potrafi dokładnie wykonywać większość operacji arytmetycznych nawet wtedy, gdy w operacji biorą udział liczby znormalizowana i zdenormalizowana.

Przechodzić czy trwać

Reklamowaną cechą IA64 jest możliwość uruchamiania starszych aplikacji 32-bitowych. Czy w takim razie w ogóle należy brać pod uwagę przenoszenie programów z IA32 na IA64?

IA64 zawiera sprzętową emulację IA32. Jednak próba uruchomienia programu dostosowanego do Pentium na nowym procesorze spowoduje, że aplikacja będzie działała wolniej (brak architektury "superskalarnej"). Przygotowano specjalną wersję systemu operacyjnego HP-UX, której jądro zawiera emulator PA-RISC. Analizy wydajności pokazują, że dynamiczna translacja pochłania tylko 1-2% czasu procesora. Instrukcje procesora RISC mogą być znacznie łatwiej dynamicznie dostosowywane do architektury IA64, niż w przypadku procesorów CISC IA32. Jednak dynamiczna translacja działa tylko dla aplikacji użytkowych, a nie dla sterowników czy systemu operacyjnego.

System operacyjny IA64 ma inną listę rozkazów i inne zasady optymalizacji kodu. W zasadzie nie można mówić o łatwej migracji, a raczej o ponownym skompilowaniu programu i testowaniu rozwiązania - czyli de facto powstaniu nowego produktu na nową architekturę.

Zmiana z 16 na 32 bity także wymuszała modyfikację architektury (zarówno aplikacji, jak i systemów operacyjnych) - procesory zaczęły obsługiwać pamięć chronioną, zawierały wsparcie mechanizmów przełączania zadań itp. Jednak te zmiany polegały na rozszerzeniu dostępnej puli poleceń asemblera. W IA64 rozkazy zostały zmienione, choć ogólna architektura aplikacji może pozostać bez zmian.

Architektura IA64 będzie dużym wyzwaniem dla twórców kompilatorów. Nowy procesor pozwala dokładnie sterować wykorzystaniem wewnętrznych jednostek wykonawczych w procesorze, w jawny sposób unikać konfliktów w dostępie do pamięci. Wszystko to sprawia, że prawdopodobnie czas kompilacji znacznie się wydłuży. Może się też okazać, że optymalizacji będą podlegały nie tylko poszczególne procedury czy metody, ale całe ciągi kolejno wykonywanych instrukcji, bez względu na to, do jakiej należą procedury.

Dużą popularność mogą zyskać wszelkiego rodzaju maszyny wirtualne, pośredniczące w wykonaniu aplikacji. Zaoszczędzi to pracy programistom, których aplikacje - działając w sztucznym środowisku - będą izolowane od fizycznej architektury systemu. Procesor IA64 ma wprost wymarzoną konstrukcję do tego typu rozwiązań. Warto chociażby wspomnieć o możliwości równoległego wykonywania krótkich fragmentów kodu i dużej pamięci podręcznej pierwszego poziomu. Sun planuje wersję maszyny wirtualnej Javy, działającej na platformie IA64. Firma nie przewiduje jednak zmian w API Javy, którego głównie struktury nadal pozostaną 32-bitowe. Platforma .NET Microsoftu od początku jest planowana jako architektura 64-bitowa.

64 bity AMD

64-bitowy procesor przygotowuje również AMD. Tym razem nie będzie to klon intelowskiej architektury. AMD 64 bardziej przypomina 32-bitowe procesory niż produkt Intela. Tak jak w układach 8086 był dostępny 16-bitowy rejestr AX, w 32-bitowych rejestr EAX, tak teraz będzie dostępny dodatkowo 64-bitowy RAX, którego "młodsze" 32 bity odpowiadają EAX. AMD zignorował doświadczenia Intela i nadal tworzy procesory, w których to sprzęt odpowiada za równomierne rozłożenie obciążenia pomiędzy jednostki wykonawcze. 64-bitowa wersja procesora ma niewiele nowych instrukcji i można na tę konstrukcję spojrzeć jak na procesor z wydłużoną szyną sterującą. Pierwsze wersje nowego procesora będą mogły adresować 248 bajtów pamięci (układ Intela może obsłużyć obszar pamięci o rozmiarze 264 bajtów).

64-bitowy AMD wprowadza także specjalne mechanizmy prefixów, które określają, czy dany fragment ma działać w trybie 64- czy starym 32-bitowym. Tak więc teoretycznie znacznie prostsze będzie pisanie aplikacji, których tylko fragmenty wykorzystują 64 bity. To podejście sprawia, że nowy procesor AMD przypomina znaną dobrze linię x86. Może się zdarzyć, że na serwerach będzie królować Intel, a w zastosowaniach domowych AMD.