Omdöpning av register

Inom datateknik hänvisar registeromdöme till en teknik som används för att undvika onödigt seriellt utförande av programinstruktioner på grund av att samma register återanvänds av dessa instruktioner.

 

Problemdefinition

Programmen består av instruktioner som bearbetar värden. Instruktionen måste namnge dessa värden för att skilja dem från varandra. En typisk instruktion kan vara: addera X och Y och lägg resultatet i Z. I denna instruktion är X, Y och Z namnen på lagringsplatser.

För att få en kompakt instruktionskodning har de flesta processorinstruktionsuppsättningar en liten uppsättning särskilda platser som kan namnges direkt. Exempelvis har x86-arkitekturen 8 heltalsregister, x86-64 har 16, många RISC:er har 32 och IA-64 har 128. I mindre processorer motsvarar namnen på dessa platser direkt element i en registerfil.

Olika instruktioner kan ta olika lång tid (t.ex. CISC-arkitektur). En processor kan t.ex. utföra hundratals instruktioner medan en enda instruktion för inläsning från huvudminnet pågår. Kortare instruktioner som utförs medan inläsningen pågår kommer att avslutas först, vilket innebär att instruktionerna avslutas utanför den ursprungliga programordningen. Exekvering i fel ordning har använts i de senaste högpresterande processorerna för att uppnå en del av deras hastighetsvinster.

Tänk på denna sekvens av instruktioner som körs på en CPU som inte är ordnad:

1.LOAD R1, LOC MEM[1024] 2.R1 = R1 + 2 3.STORE R1, LOC MEM[1024+8] 4.LOAD R1, LOC MEM[2048] 5.R1 = R1 + 4 6.STORE R1, LOC MEM[2048+8]


 instruktionerna 4, 5 och 6 är oberoende av instruktionerna 1, 2 och 3, men processorn kan inte avsluta 4 förrän 3 är klar, eftersom 3 då skulle skriva fel värde.

Problemlösning

Vi kan ta bort denna begränsning genom att ändra namnen på vissa av registren:

1.LOAD R1, LOC MEM[1024] 2.R1 = R1 + 2 3.STORE R1, LOC MEM[1024+8] 4.LOAD R2, LOC MEM[2048] 5.R2 = R2 + 4 6.STORE R2, LOC MEM[2048+8]

Nu kan instruktionerna 4, 5 och 6 exekveras parallellt med instruktionerna 1, 2 och 3, så att programmet kan exekveras snabbare.

När det är möjligt gör kompilatorerna denna omdöpning. Men kompilatorerna är begränsade av antalet register i processorn. Många högpresterande CPU:er har fler fysiska register än vad som kan namnges direkt i instruktionsuppsättningen, och de kan byta namn på register i hårdvara för att uppnå bättre parallellitet på instruktionsnivå.

Allt som läses och skrivs kan byta namn. Även om register för allmänna ändamål och flyttalregister är de vanligaste, är det vanligt att flagg- och statusregister eller till och med enskilda statusbitar också döps om.

Minnesplatser kan också bytas ut, även om det inte är vanligt att det görs på samma nivå som när register byts ut.

Risker Problem

När mer än en instruktion hänvisar till en viss plats för en operand, antingen genom att läsa den (som en ingång) eller skriva den (som en utgång), kan utförandet av dessa instruktioner i en ordning som skiljer sig från den ursprungliga programordningen leda till tre typer av problem, även kallade faror:

  • Läsa efter skrivning (RAW)

En läsning från ett register eller en minnesplats måste återge det värde som placerades där av den senaste skrivningen i programordning, inte någon annan skrivning. Detta kallas ett verkligt beroende eller flödesberoende och kräver att instruktionerna utförs i programordning.

  • Skrivning efter skrivning (WAW)

Vid på varandra följande skrivningar till ett visst register eller en viss minnesplats måste den platsen innehålla resultatet av den andra skrivningen. Detta kan lösas genom att vid behov krossa (synonymer: annullera, upphäva, mooting) den första skrivningen. WAW-beroenden är också kända som outputberoenden.

  • Skrivning efter läsning (WAR)

En läsning från ett register eller en minnesplats måste återge det senaste tidigare värdet som skrivits till platsen, och inte ett värde som skrivits programmässigt efter läsningen. Detta är den typ av falskt beroende som kan lösas genom att byta namn. WAR-beroenden är också kända som antiberoenden.

Istället för att fördröja skrivningen tills alla läsningar är avslutade kan två kopior av platsen behållas, det gamla värdet och det nya värdet. Läsningar som i programordning föregår skrivningen av det nya värdet kan förses med det gamla värdet, även om andra läsningar som följer efter skrivningen förses med det nya värdet. Det falska beroendet bryts och ytterligare möjligheter till utförande utanför ordningen skapas. När alla läsningar som behöver det gamla värdet har uppfyllts kan det kasseras. Detta är det grundläggande konceptet bakom omdöpning av register.  

Relaterade sidor

  • Parallell beräkning
  • Parallellism på instruktionsnivå
 

AlegsaOnline.com - 2020 / 2023 - License CC3