miniatura|Exemple d'un sistema de registre de 4 finestres En enginyeria informàtica, la finestra de registre és una característica que dedica registres a una subrutina mitjançant l'aliasing dinàmic d'un subconjunt de registres interns a registres fixos visibles pel programador. Les finestres de registre s'implementen per millorar el rendiment d'un processador reduint el nombre d'operacions de pila necessàries per a les crides i retorns de funcions. Una de les característiques més influents del disseny RISC de Berkeley, posteriorment es van implementar en arquitectures de conjunts d'instruccions com ara AMD Am29000, Intel i960, Sun Microsystems SPARC i Intel Itanium.
Operació general Es proporcionen diversos conjunts de registres per a les diferents parts del programa. Els registres s'oculten deliberadament al programador per forçar diverses subrutines a compartir recursos del processador.
Fer que els registres siguin invisibles es pot implementar de manera eficient; la CPU reconeix el moviment d'una part del programa a una altra durant una crida de procediment. S'aconsegueix mitjançant una d'un petit nombre d'instruccions (pròleg) i acaba amb una d'un conjunt similarment petit (epíleg). En el disseny de Berkeley, aquestes crides provocarien que un nou conjunt de registres s'"intercanviés" en aquest punt, o es marqués com a "morts" (o "reutilitzables") quan finalitza la crida.
Aplicació en CPUs En el disseny RISC de Berkeley, només vuit registres d'un total de 64 són visibles per als programes. El conjunt complet de registres es coneix com a fitxer de registres, i qualsevol conjunt particular de vuit com a finestra. El fitxer permet que fins a vuit crides a procediments tinguin els seus propis conjunts de registres. Sempre que el programa no cridi cadenes de més de vuit crides de profunditat, els registres no s'han de vessar mai, és a dir, desar-los a la memòria principal o a la memòria cau, cosa que és un procés lent en comparació amb l'accés als registres.
En comparació, l'arquitectura SPARC de Sun Microsystems proporciona visibilitat simultània en quatre conjunts de vuit registres cadascun. Tres conjunts de vuit registres cadascun estan "en finestra". Vuit registres (de i0 a i7) formen els registres d'entrada al nivell de procediment actual. Vuit registres (de L0 a L7) són locals al nivell de procediment actual, i vuit registres (de o0 a o7) són les sortides del nivell de procediment actual al següent nivell cridat. Quan es crida un procediment, la finestra de registre es desplaça en setze registres, amagant els registres d'entrada antics i els registres locals antics i convertint els registres de sortida antics en els nous registres d'entrada. Els registres comuns (registres de sortida antics i registres d'entrada nous) s'utilitzen per al pas de paràmetres. Finalment, vuit registres (de g0 a g7) són globalment visibles per a tots els nivells de procediment.
L'AMD 29000 va millorar el disseny permetent que les finestres fossin de mida variable, cosa que facilita la utilització en el cas comú on es necessiten menys de vuit registres per a una crida. També va separar els registres en un conjunt global de 64 i 128 addicionals per a les finestres. De la mateixa manera, l'arquitectura IA-64 (Itanium) utilitzava finestres de mida variable, amb 32 registres globals i 96 per a les finestres.
A l'arquitectura Infineon C166, la majoria dels registres són simplement ubicacions a la RAM interna que tenen la propietat addicional de ser accessibles com a registres. D'aquests, les adreces dels 16 registres d'ús general (R0-R15) no són fixes. En canvi, el registre R0 es troba a l'adreça a la qual apunta el registre "Context Pointer" (CP), i els 15 registres restants segueixen seqüencialment a partir de llavors.
Les finestres de registre també proporcionen una ruta d'actualització fàcil. Com que els registres addicionals són invisibles per als programes, es poden afegir finestres addicionals en qualsevol moment. Per exemple, l'ús de la programació orientada a objectes sovint resulta en un nombre més gran de crides "més petites", que es poden adaptar augmentant les finestres de vuit a setze, per exemple. Aquest va ser l'enfocament utilitzat a l'SPARC, que ha inclòs més finestres de registre amb les generacions més noves de l'arquitectura. El resultat final és menys operacions lentes de vessament i ompliment de finestres de registre perquè les finestres de registre es desborden menys sovint.
En GPUs Les finestres de registre també són un mecanisme d'ús gairebé universal a les GPU, particularment a les unitats d'execució encarregades d'executar fils de càlcul d'ús general. Per exemple, a l'arquitectura GenX d'Intel, cadascuna de les moltes unitats d'execució ("nuclis") que s'executen en paral·lel té el seu propi fitxer de registre, que conté (per exemple) 256 registres físics d'ús general. Cada fil generat en un nucli accedeix a la seva pròpia finestra de registre amb un índex basat en zero que el maquinari assigna a un conjunt separat de registres físics contigus al fitxer de registre d'aquest nucli. Cada finestra pot constar d'un nombre variable de registres segons la funció que implementa el fil, però normalment limitat a no més de la meitat del nombre de registres físics del fitxer. Això és perquè (almenys) un segon fil pugui prendre el control immediatament d'un nucli que d'altra banda estarà inactiu quan el fil que s'executava anteriorment s'ha d'aturar per alguna raó (normalment per comunicar-se amb buffers de memòria externs).
Crítica Un inconvenient de les finestres de registre és que els canvis de context requereixen desar un gran nombre de registres a la memòria. La implementació de SPARC sempre avança la finestra de registre en setze registres, cosa que significa que quan això passa, molts d'aquests registres desats ni tan sols contenen dades útils. Alguns han criticat els estudis originals que van conduir a la implementació de les finestres de registre, per considerar només els programes de forma aïllada i ignorar les càrregues de treball multitasca.
Les finestres de registre no són l'única manera de millorar el rendiment dels registres. El grup de la Universitat de Stanford que dissenyava el MIPS va veure el treball de Berkeley i va decidir que el problema no era l'escassetat de registres, sinó la mala utilització dels existents. En canvi, van invertir més temps en l'assignació de registres del seu compilador, assegurant-se que utilitzés amb prudència el conjunt més gran disponible al MIPS. Això va resultar en una reducció de la complexitat del xip, amb la meitat del nombre total de registres, alhora que oferia un rendiment potencialment més alt en aquells casos en què un sol procediment podia fer ús de l'espai de registre visible més gran. Al final, amb els compiladors moderns, el MIPS fa un millor ús del seu espai de registre fins i tot durant les crides de procediment.
Referències
Categoria:Microprocessadors