Zmiana nazw rejestrów

W architekturze komputerowej zmiana nazwy rejestrów polega na tym, że mikroarchitektura dynamicznie przydziela rejestry architektoniczne do większego zestawu rejestrów fizycznych podczas wykonywania programu.

Stanowisko problemu

Zewnętrzna architektura procesora definiuje zestaw tzw architektonicznych rejestrów że programy językowe Urządzenie może obsłużyć.

W mikroarchitekturze superskalarnej procesor próbuje wykonać kilka instrukcji równolegle . Dlatego analizuje program lokalnie w celu wykrycia zależności między instrukcjami i odpowiednio zmienia kolejność tych ostatnich, aby skorzystać z paralelizmu, nie wprowadzając żadnego błędu. Jednak zależności między instrukcjami maszynowymi ograniczają wydajność wykonywania poza kolejnością, ponieważ często zdarza się, że kilka instrukcji konkuruje o użycie tego samego rejestru ze względu na wprowadzoną równoległość. Konieczne jest wtedy zablokowanie jednej z instrukcji podczas oczekiwania na zwolnienie zasobu.

Jednak w wielu przypadkach te zależności pojawiają się tylko na poziomie rejestru, ale nie odzwierciedlają rzeczywistych zależności w strumieniach danych przetwarzanych przez program. Problem ten jest tym bardziej istotny, że kompilator przeprowadzał optymalizacje w oparciu o wykorzystanie rejestrów.

Rozwiązanie: zmiana nazw rejestrów

Jedno rozwiązanie polega więc na powielaniu zasobów: rejestry architektoniczne nie odpowiadają już rejestrom fizycznym w mikroarchitekturze, ale są dynamicznie przydzielane do większego zbioru rejestrów fizycznych, co pozwala wyeliminować niektóre zależności wprowadzane sztucznie przez ograniczoną liczbę rejestrów. Na przykład architektura IA-32 definiuje 16 rejestrów architektonicznych. Pentium zawiera rejestry 128 fizyczne i przeprowadza rejestrować zmiany nazwy.

Przykład

Rozważmy na przykład następujący kod:

1. R1 ← mem[1] 2. R1 ← R1 + 1 3. mem[1] ← R1 4. R1 ← mem[10] 5. R1 ← R1 + 4 6. mem[11] ← R1

Z funkcjonalnego punktu widzenia jasne jest, że mamy dwa niezależne bloki po 3 instrukcje:

Jednak te dwa bloki używają rejestru R1do obliczeń pośrednich. Procesor nie może uruchomić 4, dopóki 3 nie zostanie ukończone, co drastycznie ogranicza przewagę architektury superskalarnej.

Załóżmy teraz, że procesor przeprowadza zmiany nazw rejestrów. Za każdym razem, gdy wartość jest umieszczana w rejestrze architektonicznym, umieszcza ją w innym rejestrze fizycznym. Różne rejestry fizyczne przypisane do tego samego rejestru architektonicznego są identyfikowane za pomocą sufiksu jednej litery:

1. R1a ← mem[1] 2. R1b ← R1a + 1 3. mem[1] ← R1b 4. R1c ← mem[10] 5. R1d ← R1c + 4 6. mem[11] ← R1d

W ten sposób zniknęły zależności, które istniały na poziomie rejestrów między 1-3 a 4-6: te dwa bloki mogą być wykonywane równolegle, co w pełni wykorzystuje superskalarną architekturę procesora.

1. R1a ← mem[1] 4. R1c ← mem[10] 2. R1b ← R1a + 1 5. R1d ← R1c + 4 3. mem[1] ← R1b 6. mem[11] ← R1d

Uwagi i odniesienia

  1. Stallings 2003 , s.  567.
  2. Stallings 2003 , s.  556.

Załączniki

Bibliografia