Registeromdöpning (register renaming) – definition, syfte och exempel
Registeromdöpning förklarad: definition, syfte och tydliga exempel som visar hur tekniken eliminerar registerkonflikter och förbättrar CPU-prestanda.
Inom datateknik hänvisar registeromdöpning 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. Kort sagt handlar det om att ge olika instruktioner olika fysiska registernamn så att namnkonflikter inte tvingar instruktioner att vänta i onödan.
Definition och princip
Registeromdöpning innebär att arkitekturella register (de register som syns i instruktionerna, t.ex. R1, R2) mappas till ett större antal fysiska register internt i processorn. När en instruktion skriver till ett arkitekturellt register tilldelas en fri fysisk registerplats; läsningar hänvisar till den fysiska plats som för närvarande är associerad med det arkitekturella registret. På så sätt kan två instruktioner som i koden skriver till samma arkitekturella register ändå exekveras parallellt om deras resultat lagras i olika fysiska register.
Vilka problem löser det?
- Tar bort falska beroenden: registeromdöpning eliminerar namnberoenden (WAW — write-after-write och WAR — write-after-read) som inte representerar verkliga dataflöden.
- Ökar instruktionernas parallellism: gör det möjligt att köra instruktioner utanför ordning (out-of-order) utan att skapa onödiga synkpunkter.
- Minskar pipeline-stall: färre väntetider orsakas av registeråteranvändning.
Exempel
Tänk dig två instruktioner i följd:
1) ADD R1, R2, R3 ; R1 = R2 + R3 2) SUB R1, R4, R5 ; R1 = R4 - R5
Utan registeromdöpning måste instruktion 2 vänta på att instruktion 1 ska skriva till R1 (namnberoende). Med registeromdöpning tilldelas instruktion 1 t.ex. fysisk register P10 och instruktion 2 får P11. Båda kan då utföras parallellt och deras resultat bevaras i var sitt fysiska register tills de commit:as till det arkitekturella R1 i rätt ordning.
Hur implementeras det i hårdvaran?
- Register Alias Table (RAT) eller Rename Table: en tabell som mappar arkitekturella register till aktuella fysiska register.
- Fysiskt registerfil: ett större set fysiska register där data lagras under utpekade fysiska namn.
- Free list: håller reda på tillgängliga fysiska register som kan användas vid omdöpning.
- Reorder Buffer (ROB) eller commit-logik: ser till att instruktioner görs synliga i arkitekturens register i rätt ordning och frigör fysiska register när de inte längre behövs.
- Reservationsstationer / Tomasulos algoritm: i vissa designer används reserverstationer för att hantera operandberoenden tillsammans med omdöpning.
Begränsningar och nackdelar
- Ökad hårdvarukomplexitet: fler kretsar för tabeller, fler fysiska register och logik för commit/återställning.
- Högre effekt- och areakostnad: flera fysiska register och större styrlogik kräver mer ström och kiselarea.
- Begränsad effekt om antalet fysiska register är litet: om fria fysiska register tar slut kan man ändå få stall eller behöva spill/komplicerad återanvändning.
- Kan inte ta bort sanna beroenden (RAW — read-after-write): dessa måste fortfarande respekteras.
Tillämpning
Registeromdöpning används i nästan alla moderna superskalära och out-of-order-processorer, både i x86- och ARM-designs samt i högpresterande RISC-processorer. Tekniken är en viktig del i att uppnå hög instruktion-per-cykel (IPC) i dagens CPU-arkitekturer.
Sammanfattning
Registeromdöpning är en central optimering i modern CPU-design som minskar falska beroenden genom att mappa arkitekturella register till ett större set fysiska register. Resultatet blir färre onödiga väntetider, bättre parallellism och högre prestanda — på bekostnad av ökad hårdvarukomplexitet och energiförbrukning.
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å
Sök