Przemianowanie rejestrów

Przemianowanie rejestrów - technika w inżynierii komputerowej używana w celu uniknięcia niepotrzebnego szeregowego wykonania instrukcji narzuconego przez wykorzystanie tych samych rejestrów procesora przez następujące po sobie instrukcje.

Definicja problemu edytuj

Prześledźmy poniższą sekwencję instrukcji:

  1. R1 = MEM[1024]
  2. R1 = R1 + 2
  3. MEM[1032] = R1
  4. R1 = MEM[2048]
  5. R1 = R1 + 4
  6. MEM[2056] = R1

Rozkazy 4, 5 oraz 6 są niezależne od rozkazów 1, 2 i 3, jednakże procesor nie może wykonać 4 dopóki rozkaz 3 nie zostanie zakończony.

Możemy usunąć to ograniczenie zmieniając nazwy rejestrów:

  • 1. R1 = MEM[1024] 4. R2 = MEM[2048]
  • 2. R1 = R1 + 2 5. R2 = R2 + 4
  • 3. MEM[1032] = R1 6. MEM[2056] = R2

Teraz instrukcje 1, 2 i 3 mogą być wykonywane jednocześnie z instrukcjami 4, 5 oraz 6, a co za tym idzie przyspieszone może być przetwarzanie całej sekwencji.

Jeśli jest to możliwe przemianowanie rejestrów dokonuje się na etapie kompilacji, jednakże współczesne procesory zawierają więcej fizycznych rejestrów niż wynika to z architektury listy rozkazów (ang. ISA), więc przemianowanie rejestrów jest wykonywane sprzętowo aby uzyskać dalsze zrównoleglenie przetwarzania instrukcji.

Konflikty i przemianowanie rejestrów edytuj

Kiedy więcej niż jedna instrukcja odwołuje się do określonego operandu w celu odczytu, bądź zapisu, wykonanie tych instrukcji w innej kolejności niż wynika to z oryginalnego porządku programu skutkuje konfliktem danych:

  • Odczyt po zapisie (RAW)
Instrukcja odczytująca zawartość rejestru musi wykonać się po instrukcji zapisującej występującej bezpośrednio przed nią w porządku programu, a nie po innej instrukcji zapisującej ten rejestr.
  • Zapis po zapisie (WAW)
Zawartość rejstru po sekwencji instrukcji piszących do niego musi wynikać z ostatniej instrukcji według porządku programu.
  • Zapis po odczycie (WAR)
Instrukcja zapisu nie może wykonać się po instrukcji odczytu z tego samego rejestru, gdyż spowoduje to odczytanie błędnej wartości.