www.eprace.edu.pl » ia64 » Mechanizmy zastosowane w architekturze IA-64 » Skoki (zapobieganie, przewidywanie, unikanie)

Skoki (zapobieganie, przewidywanie, unikanie)

Procesory IA-64 posiadają rejestry predykatów, każdy po 1 bicie. Większość instrukcji procesorów IA-64 zawiera pole predykatu. Idea zastosowania predykatów polega na wykonywaniu instrukcji tylko wtedy gdy wyróżniony rejestr predykatowy zawiera wartość prawda. Wartości w rejestrach predykatowych są wytwarzane przez instrukcję CPM która porównuje wartości dwóch rejestrów (używając rozmaitych sposobów porównań), lub przez instrukcję TBIT (test bit). Pojedyncza instrukcja CPM lub TBIT zapisuje wynik swojego działania w jednym rejestrze predykatowym, oraz automatycznie zapisuje negacje wyniku w innym rejestrze predykatowym. Taki mechanizm pozwala bardzo efektywnie wykonać częstą konstrukcję IF-THEN-ELSE, przy niewielkim nakładzie pracy przypadającym na każdy blok, a co najważniejsze unika się skoków które występują w takiej konstrukcji w liczbie 2, z czego 1 jest bardzo trudny do przewidzenia.

dla przykładu

  RISC lub CISC   IA-64
  instr 1

instr 2

  instr 1

instr 2

IF cmp(a==b)

jump_equ e1

  PR1,PR2 ←cmp(a==b)
THEN instr3

instr4

jump e2

  (PR1) instr3

(PR1) instr4

ELSE e1: instr5

instr6

  (PR2) instr5

(PR2) instr6

  e2: instr7

instr8

  instr7

instr8

Jak widać technika zastosowana w IA-64 całkowicie eliminuje oba skoki, nie ma więc obawy związanej z przestojami spowodowanymi przez nietrafione przewidywanie skoków, oprócz tego wielkość kodu różni się w porównaniu z tradycyjnymi architekturami na korzyść IA-64. Dodatkową zaletą jest możliwość wykonania kodu równolegle, co nie jest możliwe przy konwencjonalnym wykonaniu kodu.

Technika predykatów była już znana wcześniej, ale nigdy w tak ogólnym przypadku. Niektóre istniejące procesory (np. Alpha, Sparc v9, MIPS IV) mają podobne mechanizmy, które oferowały niektóre dobrodziejstwa stosowania predykatów, ale tylko w przypadku instrukcji MOV. Metoda predykatów zastosowana w IA-64 pozwala na stosowanie jej w każdym z typów instrukcji. Jednak nie wszystkie skoki mogą być wyeliminowane przy zastosowaniu predykatów.

Powołując się na badania Uniwersytetu z Illinois można stwierdzić, że ponad połowa wszystkich skoków może być wyeliminowana, oraz 43% wszystkich skoków które tradycyjnie były by błędnie przewidziane. Eliminacja takiej ilości skoków powinno zwiększyć osiągi procesora o około 5 do 10 %.

Podstawowa instrukcja skoku w IA-64 używa 21- bitowego względnego przesunięcia. Celem skoku musi być pierwsza instrukcja w paczce. Pozwala to na skoki do instrukcji które są oddalone od siebie nie dalej niż 16 MB. Wyrównanie celu skoku do początku paczki powoduje uproszczenie jednostki wykonującej skoki, oraz pozwala na rozszerzenie zasięgu skoku, powoduje jednak rozrost kodu, związany z dodaniem średnio jednej instrukcji NOP na jeden skok. Skoki związane z instrukcjami warunkowymi zostały rozwiązane za pomocą rejestrów predykatowych, natomiast skoki związane z wywoływaniem procedur, powrotem z nich oraz podobne używają specjalnego zestawu rejestru zwanych rejestrami skoków (branch registers). Rejestry te są używane (zamiast rejestrów stałoprzecinkowych w tradycyjnych rozwiązaniach) do przechowywania docelowego adresu skoku. Takie rozwiązanie pozwala na uniknięcie używania stosu wywołań/powrotów gdzie zwykle przyjęło się przetrzymywać adres powrotny.

W przewidywaniu skoków bardzo pomocny jest rejestr LC (licznik pętli) który zawiera liczbę przebiegów pętli które jeszcze mają być wykonane. Większość tradycyjnych jednostek przewidywania skoków błędnie przewidywało ostatni kończący wykonanie pętli skok. Zadanie to w IA-64 wydaje się łatwe. Jednostka przewidywania skoków poprawnie przewidzi ten skok patrząc właśnie na wartość w rejestrze LC. Ponieważ w danej chwili spodziewany jest jedynie jeden skok związany z pętlą, istnieje tylko jeden licznik pętli.

Innym mechanizmem który jest pomocny przy przewidywaniu skoków to 2-bitowe pole zawarte w instrukcji skoku (hint) w którym kompilator daje wskazówkę procesorowi. Pierwszy bit pokazuje czy jest większe prawdopodobieństwo na wykonanie skoku czy nie. Niektóre skoki prawie zawsze prowadzą w jedną stronę, co powoduje iż kompilator może sugerować ten kierunek. Drugi bit sygnalizuje czy informacja o skoku powinna być przechowywana czy też jednostka przewidywania skoków powinna zignorować ten skok zwalniając miejsce dla bardziej skomplikowanych skoków. Procesor ma zawsze ostatnie słowo w procesie przewidywania skoków i może zignorować sugestie zawarte w instrukcjach. Kombinacja programowego oraz sprzętowego przewidywania, wraz z dodatkowymi wskazówkami (typu rejestr LC) powinna dać lepsze rezultaty niż dotychczasowe tylko sprzętowe rozwiązania.

Tak jak niektóre procesory RISCowe (np. PA-RISC), IA-64 może wykonywać w jednym cyklu zegarowym porównanie, oraz instrukcję skoku. Jest jednak różnica w osiąganiu tego celu. PA-RISC posiada specjalną instrukcję porównaj-i-skocz, IA-64 zamiast łączyć instrukcję porównania (która dodatkowo zapełnia rejestry predykatowe) z instrukcją skoku, układa te dwie instrukcje w jednej paczce, przy czym instrukcja skoku musi być ostatnią z instrukcji. W specjalnym przypadku dwie instrukcje skoku mogą być położone w jednej paczce. Powstaje wtedy tzw. rozgałęziony skok (multiway branch). Również taki układ skoków może zostać wykonany w jednym cyklu. Sprawdzany jest wtedy warunek oraz wyznaczany skok do wykonania (jeśli o ogóle któryś ma zostać wykonany)



komentarze

Copyright © 2008-2010 EPrace oraz autorzy prac.