www.eprace.edu.pl » ia64 » Mechanizmy zastosowane w architekturze IA-64 » EPIC czyli paczkowanie instrukcji

EPIC czyli paczkowanie instrukcji

Po ostatniej rewolucji w dziedzinie zestawu instrukcji jaka nastąpiła w roku 1980 kiedy to powstał Reduced Instruction Set Computing (RISC), Intel oraz Hewlett-Packard przygotowali nowy zestaw instrukcji IA-64. Zbliżyli się oni tym sposobem do ideału procesora wykonującego operacje równolegle.

Główną ideą przyświecającą technologii EPIC jest grupowanie instrukcji w paczki, która to paczka jest ładowana cala w jednym takcie zegara. Co prawda idea grupowania instrukcji w paczki zastosowana w IA-64 znana już była z procesorów typu VLIW, jednak metoda zastosowana w architekturze IA-64 wydaje się być wiele lepsza.

Procesory VLIW (Very Long Instruction Word) były pierwszą architekturą, opracowaną z założeniem, że kod maszynowy ma być w taki sposób przygotowany, że instrukcje mają sobie wzajemnie nie przeszkadzać. Takie instrukcje były grupowane w paczki. Istniały dwa rozwiązania, pierwsze procesory miały ustaloną długość paczki, w kolejnych długość paczki zmieniała się. Procesory tego typu nie upowszechniły się ponieważ na drodze stanęły problemy które architektura VLIW nie była w stanie przezwyciężyć.

Głównym problemem był nadmierny rozrost kodu spowodowany niemożnością grupowania instrukcji które są współzależne i jedna korzysta z wyników drugiej. Problemom tego typu zapobiegano poprzez stosowanie szczelin paczkach. Tak więc w jednym cyklu zegarowym procesor dostawał w najgorszym przypadku jedną instrukcję, a dalej pustkę, gdyż długość paczki była stała. Zastosowano inne rozwiązanie tego problemu, a mianowicie zmienną długość paczki. Niestety pojawił się kolejny problem, nie wiadomo czy nie poważniejszy od poprzedniego. Przy zmiennej ilości instrukcji w paczkach kompilator tak układał instrukcje, że były one dedykowane dla konkretnego procesora. Zdarzało się tak zwykle przy dużych paczkach, z dużą ilością instrukcji. Instrukcje te niekiedy były konkretnie dedykowane do określonych jednostek wykonawczych w procesorze. To zmuszało do rekompilacji programów nawet dla kolejnego procesora z serii. Dodatkowo wykluczone zostało przez to przetwarzanie oparte na wielu procesorach bez uprzedniej rekompilacji kodu. Obecnie technologię VLIW stosuje się raczej tylko w specjalizowanych procesorach (na przykład Texas Instruments DSP C6201), lub technologia ta jest stosowana tylko w specjalnych jednostkach wewnątrz procesorów.

IA-64 idzie dalej niż poprzednie (CISC, RISC, VLIW) zestawy instrukcji i niosąc ze sobą nowe cechy które zostały nazwane EPIC (czyli Explicitly Paralel Instruction Computing) co po polsku można przetłumaczyć Przetwarzanie Wyraźnie Równolegle. Ta strategia powinna dać procesorom serii IA-64 palmę pierwszeństwa wśród wszystkich innych zestawów instrukcji. Co prawda technika Epic jest podobna do VLIW, ale IA-64 redukuje dwie niedogodności czyli brak skalowalności oraz duże rozrost kodu powstającego przy kompilowaniu programów dla procesorów VLIW. Owe problemy pokonano zaopatrując procesory oparte na architekturze IA-64 w takie cechy jak: bardzo duża liczba rejestrów (około 4 razy więcej niż typowy procesor RISC) bezpośredni dostęp do wszystkich rejestrów przez oprogramowanie, co eliminuje potrzebę mapowania rejestrów, oraz przyspieszony dostęp do cache. Kiedy jest zapotrzebowanie na dostęp do danych spekulatywne ładowanie może całkowicie zniwelować opóźnienie spowodowane przez dostęp do cache, nawet jeśli w międzyczasie odbywają się skoki. Poza tym niektóre skoki mogą być w ogóle wyeliminowane całkowicie poprzez stosowanie predykatów.

Główną rolę w metodzie EPIC odgrywa kompilator. Nowoczesny kompilator analizuje program pod kątem wyszukiwania przeszkód dla równoległego wykonywania instrukcji, a później układa instrukcje dla optymalnego wykorzystania procesora. Dzieje się to już w niektórych dzisiejszych kompilatorów dla superskalarnych procesorów, jednak większość obecnych kompilatorów dla architektur CISC lub RISC przygotowuje kod "szeregowo" nie analizując powiązań między instrukcjami. Zadanie zaplanowania równoległości pozostaje procesorowi, który ponownie analizuje kod instrukcja po instrukcji, aby w końcu móc wykonać je równolegle. Dzisiejszy zestaw instrukcji typu CISC czy RISC nie daje możliwości na transfer danych dotyczących sposobu równoległego wykonania od kompilatora do procesorem, tak aby zaplanować wcześniej sposób wykonania. Istnieje wiele wad takiego rozwiązania, po pierwsze kompilator ma wiele czasu na poszukiwanie najlepszego sposobu, a po drugie praca wykonywana by była tylko raz przy tworzeniu kodu maszynowego. Przeniesienie tych zadań do procesora powoduje, iż praca musi być wykonywana przy każdorazowym wykonaniu programu, co gorsza niekiedy wielokrotnie. Dodatkowo procesor traci na dodatkową analizę swoją cenną moc obliczeniową, a co za tym idzie marnuje zyski z równoległego wykonania.

Główną ideą przyświecające technologii EPIC jest grupowanie instrukcji w paczki (bundles). Uniknięto tutaj problemu nadmiernego rozrostu kodu stosując unikalny format paczki w której znajdują się instrukcje. Paczka ma długość 128 bitów i zawiera 3 instrukcje oraz tzw. template. Każda instrukcja ma długość 41 bitów, template natomiast 5 bitów.

Format paczki instrukcji

127 87 86 46 45 5 4 0
instrukcja 1 instrukcja 2 instrukcja 3 template
41 41 41 5

Dane zawarte w template sygnalizują czy instrukcje w paczce mogą być wykonywane jednocześnie, lub czy jest przymus wykonanie jednej lub więcej szeregowo w związku np. z konfliktem rejestrów. Template informuje jednocześnie czy paczka może być wykonana jednocześnie z następną z kolei paczką. Daje to możliwość ukadania paczek w łańcuchy tworząc grupy instrukcji dowolnej długości. Ściśle rzecz biorąc zdefiniowany jest tak zwany stop który odgranicza instrukcje które mogą być wykonane razem od tych które mają czekać na zwolnienie zasobów. I tak jeśli wszystkie bity w template są w stanie niskim to nie ma żadnych „stopów” na przeszkodzie, jeśli wartość pola template wynosi 1 to stop znajduje się po 3 instrukcji (następna paczka musi czekać), jeśli wynosi 2 to stop znajduje się po 2 instrukcji i tak dalej analogicznie. Ogólna zasada mówi, że jeżeli najmniej znaczący bit w template ma wartość zero to paczka nie może być wykonywana równolegle z następną w kolejce. Dodatkowo informacje w template informują o typie jednostki wykonującej tą instrukcje. Jeśli wartość pola template wynosi 0 to znaczy, że pierwsza instrukcja ma być przetwarzana przez jednostkę zarządzającą pamięcią, a druga oraz trzecia przez jednostkę arytmetyki stałoprzecinkowej. Niestety na 5 bitach nie da się zakodować wszystkich możliwości ułożenia stopów, wraz z określeniem jaka jednostka wykonawcza ma zajmować się daną instrukcją.

Tabela przedstawiająca zaimplementowane kombinacje:

Template instrukcja 1 instrukcja 2 instrukcja 3
0 00 M I I
1 01 M I I
2 02 M I I
3 03 M I I
4 04 M L X
5 05 M L X
6 06      
7 07      
8 08 M M I
9 09 M M I
10 0A M M I
11 0B M M I
12 0C M F I
13 0D M F I
14 0E M M F
15 0F M M F
16 10 M I B
17 11 M I B
18 12 M B B
19 13 M B B
20 14      
21 15      
22 16 B B B
23 17 B B B
24 18 M M B
25 19 M M B
26 1A      
27 1B      
28 1C M F B
29 1D M F B
30 1E      
31 1F      

legenda:

      M – (Memmory unit) jednostka zarządzająca pamięcią
      I – (Integer ALU) stałoprzecinkowa jednostka arytmetyczno-logiczna
      F – (Floating-point unit) zmiennoprzecinkowa jednostka arytmetyczno-logiczna
      B – (Branch unit) jednostka wykonująca skoki
      L – (Long Imidate Integer) jednostka stałoprzecinkowa, ale instrukcje tak zaznaczone
      zajmują dwa miejsca w paczce, są to instrukcji rozszerzone
      nieużywane wartości pola template, są to wartości zarezerwowane, ich wystąpienie
      powoduje Generalny Błąd Ochrony
      „stop” po danej instrukcji

Taki układ danych w paczce jaki posiada IA-64 jest bardziej złożony niż czysty VLIW jednakże pozwala na stworzenie rodziny kompatybilnych binarnie procesorów, a takie rozwiązanie jest dużo lepsze niż ewentualne późniejsze dodawanie specjalnych układów w procesorach które będą transformować kod od nowych wymagań.

Paczki instrukcji w programie wykonywalnym są ułożone od najmniejszego do największego adresu. Instrukcje w paczce o mniejszym adresie są uważane za poprzedzające instrukcje z paczki o większym adresie. Kolejność bajtów w każdej paczce w pamięci to tzw. little-endian.



komentarze

Copyright © 2008-2010 EPrace oraz autorzy prac.