Rinominazione dei registri
La rinomina dei registri è una tecnica di ottimizzazione utilizzata dai microprocessori per incrementare l'Instruction level parallelism dei programmi eliminando alcuni vincoli durante l'esecuzione delle istruzioni nelle pipeline.
Durante l'esecuzione di più istruzioni in parallelo all'interno di una pipeline alcune istruzioni non possono essere eseguite perché devono attendere anche alcuni registri utilizzati da altre istruzioni siano liberi. Per evitare di dover attendere l'esecuzione delle istruzioni in corso per la presenza di registri occupati si usa la rinomina degli stessi.
Quando il processore individua delle istruzioni che non possono essere eseguite per la presenza di registri già occupati il processore assegna all'istruzione altri registri, dei registri temporanei da poter utilizzare fino a quando i registri di destinazione non siano liberi.
Per esempio nel seguente frammento di codice:
1) h = a + b
L'istruzione 1 e 2 utilizzano lo stesso registro per salvare il risultato e quindi non possono essere eseguite in parallelo pur in realtà non dipendendo dagli stessi dati di partenza. Implementando la rinomina dei registri si può sostituire uno degli accessi al registro h con un registro temporaneo t1. Nell'esempio sopra il codice diverrebbe:
2) h = c - d
1) h = a + b
La seconda istruzione salva i dati nel registro temporaneo t1 e quindi le due istruzioni possono essere eseguite in parallelo tanto alla fine l'unità di rinominazione provvederà a memorizzare il dato contenuto in t1 nel registro h mantenendo la coerenza logica del programma.
2) t1 = c - d
Questa tecnica mostra la sua utilità in congiunzione con l'esecuzione fuori ordine, le due tecniche in congiunzione eliminano la maggior parte dei vincoli sui dati delle istruzioni innalzando il livello di istruzioni eseguibili in parallelo dai processori e quindi innalzandone le prestazioni.
La rinomina dei registri è fondamentale nell'architettura X86 dato che questa tipologia di processori è dotata di soli 8 registri per i numeri interi e 8 registri per i numeri in virgola mobile. In un'architettura con così pochi registri la probabilità che due istruzioni utilizzino gli stessi registri è molto elevata difatti fin dalla microarchitettura P6 (architettura del Pentium Pro e successori fino al Pentium III) i microprocessori Intel implementavano questa tecnica. Comunque anche i processori RISC, pur essendo usualmente dotati di molti registri, implementano questa tecnica per migliorare le prestazioni di calcolo. Per esempio il processore MIPS R10000 e il Alpha 21264 implementano la rinomina dei registri.