Registreringsfönster

Exempel på ett 4-fönsters registerfönstersystem

Inom datorteknik är registerfönster en funktion som dedikerar register till en subrutin genom att dynamiskt alias en delmängd av interna register till fasta, programmerare-synliga register . Registerfönster implementeras för att förbättra prestandan hos en processor genom att minska antalet stackoperationer som krävs för funktionsanrop och returer. En av de mest inflytelserika funktionerna i Berkeley RISC- designen, de implementerades senare i instruktionsuppsättningsarkitekturer som AMD Am29000 , Intel i960 , Sun Microsystems SPARC och Intel Itanium .

Allmän drift

Flera uppsättningar register tillhandahålls för de olika delarna av programmet. Register är avsiktligt dolda för programmeraren för att tvinga flera subrutiner att dela processorresurser.

Att göra registren osynliga kan implementeras effektivt; CPU:n känner igen rörelsen från en del av programmet till en annan under ett proceduranrop. Det åstadkoms genom en av ett litet antal instruktioner ( prolog ) och slutar med en av en lika liten uppsättning ( epilog ) . I Berkeley-designen skulle dessa anrop orsaka att en ny uppsättning register "bytes in" vid den tidpunkten, eller markeras som "döda" (eller "återanvändbara") när samtalet avslutas.

Applikation i CPU:er

I Berkeley RISC-designen är endast åtta register av totalt 64 synliga för programmen. Den kompletta uppsättningen av register kallas registerfilen , och varje särskild uppsättning av åtta som ett fönster . Filen tillåter upp till åtta proceduranrop att ha sina egna registeruppsättningar. Så länge programmet inte anropar kedjor som är längre än åtta anrop djupa, behöver registren aldrig spillas, dvs sparas till huvudminne eller cache vilket är en långsam process jämfört med registeråtkomst.

Som jämförelse ger Sun Microsystems SPARC- arkitektur samtidig synlighet i fyra uppsättningar med åtta register vardera. Tre uppsättningar om vardera åtta register är "fönster". Åtta register (i0 till i7) bildar ingångsregistren till den aktuella procedurnivån. Åtta register (LO till L7) är lokala för den aktuella procedurnivån, och åtta register (o0 till o7) är utsignalerna från den nuvarande procedurnivån till nästa anropade nivå. När en procedur anropas skiftar registerfönstret med sexton register, döljer de gamla ingångsregistren och gamla lokala register och gör de gamla utmatningsregistren till de nya ingångsregistren. De gemensamma registren (gamla utgångsregister och nya ingångsregister) används för parameteröverföring. Slutligen är åtta register (g0 till g7) globalt synliga för alla procedurnivåer.

AMD 29000 förbättrade designen genom att tillåta fönstren att vara av variabel storlek, vilket underlättar användningen i det vanliga fallet där färre än åtta register behövs för ett samtal. Det separerade också registren i en global uppsättning av 64, och ytterligare 128 för fönstren. På liknande sätt använde arkitekturen IA-64 (Itanium) fönster med variabel storlek, med 32 globala register och 96 för fönstren.

I Infineon C166 -arkitekturen är de flesta register helt enkelt platser i internt RAM som har den ytterligare egenskapen att vara tillgängliga som register. Av dessa är adresserna till de 16 allmänna registren (R0-R15) inte fasta. Istället är RO-registret lokaliserat på adressen som pekas på av "Context Pointer" (CP)-registret, och de återstående 15 registren följer sekventiellt därefter.

Registerfönster ger också en enkel uppgraderingsväg. Eftersom tilläggsregistren är osynliga för programmen kan ytterligare fönster läggas till när som helst. resulterar användningen av objektorienterad programmering ofta i ett större antal "mindre" samtal, som kan hanteras genom att öka fönstren från till exempel åtta till sexton. Detta var tillvägagångssättet som användes i SPARC, som har inkluderat fler registerfönster med nyare generationer av arkitekturen. Slutresultatet är färre långsamma registerfönsterspill och fyllningsoperationer eftersom registerfönstren svämmar över mer sällan.

Kritik

Registerfönster är inte det enda sättet att förbättra registerprestandan. Gruppen vid Stanford University som designade MIPS såg Berkeleys arbete och beslutade att problemet inte var brist på register, utan dåligt utnyttjande av de befintliga. De investerade istället mer tid i sin kompilators registerallokering , och såg till att den på ett klokt sätt använde den större uppsättningen som finns tillgänglig i MIPS. Detta resulterade i minskad komplexitet hos chippet, med hälften av det totala antalet register, samtidigt som det erbjöd potentiellt högre prestanda i de fall där en enda procedur skulle kunna utnyttja det större synliga registerutrymmet. I slutändan, med moderna kompilatorer, utnyttjar MIPS sitt registerutrymme bättre även under proceduranrop. [ citat behövs ]