# Execució fora d'ordre

En informàtica, execució fora d'ordre és un paradgima que es fa servir a la majoria de microprocessadors d'alt rendiment per a fer servir els cicles d'instrucció que d'altra forma serien desaprofitats, fent més lenta l'execució dels programes.

## Història

L'execució fora d'ordre és una forma restringida de computació de flux de dades, que va ser una àrea de forta recerca a arquitectura de computadors durant les dècades de 1970 i 1980. Investigació acadèmica important en aquest tema va ser liderada per Yale Patt i el seu simulador HPSm. Un article de James E. Smith i A. R. Pleszkun, publicat en 1985 va completar l'esquema descriving com el comportament de les excepcions podia ser mantingut en màquines amb execució fora d'ordre.
La computadora CDC 6600, de 1964, va ser la primera computadora amb capacitat per a acabar les instruccions fora d'ordre. Això no obstant, no tenia capacitat d'iniciar les instruccions fora d'ordre.
El computador IBM System/360 model 91, de 1966, va presentar l'algorisme de Tomasulo, capaç d'iniciar fora d'ordre i acabar fora d'ordre l'execució d'instruccions.
En 1990, IBM va presentar el primer microprocessador amb execució fora d'ordre POWER1, encara que l'execució de fora d'ordre estava limitada a instruccions de coma flotant.
Durant la dècada de 1990 l'execució fora d'ordre va esdevenir més comú, i va ser inclosa a l'IBM/Motorola PowerPC 601 (1993), Fujitsu/HAL SPARC64 (1995), Intel Pentium Pro (1995), MIPS R10000 (1996), HP PA-8000 (1996), AMD K5 (1996) i DEC Alpha 21264 (1998). Algunes excepcions notables a aquesta tendència van ser els Sun UltraSPARC, HP/Intel Itanium, Transmeta Crusoe, Intel Atom, i l'IBM POWER6.
La complexitat lògica dels esquemes d'execució fora d'ordre va ser la raó per la qual aquesta tècnica no va arribar a les màquines convencionals fins meitat de la dècada de 1990. Molts processadors de baix cost encara no fan servir aquest paradigma a causa de la gran àrea de silici que cal per a construir aquesta classe de màquina. L'estalvi energètic és un altre objectiu que és difícil aconseguir amb un disseny d'execució fora d'ordre.

## Concepte bàsic
### Processadors en ordre

En els processadors en ordre el processament es fa en aquests passos:
* Lectura de la instrucció
* Si els operands de lectura són disponibles (a registres per exemple), la instrucció és llançada a la unitat funcional apropiada. Si no - generalment perquè estan sent llegits de memòria - el processador s'atura fins que són disponibles.
* La instrucció és executada per la unitat funcional corresponent.
* La unitat funcional escriu els resultats al banc de registres o a memòria.

### Processadors fora d'ordre

En els processadors fora d'ordre el processament es fa en aquests passos:
* Lectura de la instrucció
* La instrucció es posa a una cua d'instruccions (també anomenada buffer d'instruccions o estacions de reserva)
* La instrucció espera a la cua fins que els seus operands són disponibles. Així s'evita llegir s'evita llegir unes dades que encara no han estat escrites (risc Read-after-Write). Llavors la instrucció pot sortir de la cua abans que instruccions anteriors, i, en efecte començar a executar-se abans que instruccions anteriors.
* La instrucció és llançada a la unitat funcional i executada per aquella unitat.
* El resultat es fica una cua.
* El resultat és escrit al banc de registres o a memòria només quan es donen aquestes dues condicions:
** Les instruccions anteriors ja han llegit les seves dades. Així s'evita que instruccions anteriors llegeixin dades "del futur"; incorrectes de fet (risc Write-after-Read).
** Les instruccions anteriors ja han escrit les seves dades. Així s'evita que instruccions anteriors deixin escrites dades "del passat" (risc Write-after-Write).
El concepte clau al processament fora d'ordre és permetre al processador evitar la classe d'aturades que es donen quan les dades necessàries per a executar una operació no estan disponibles. Al resum anterior, el processador fora d'ordre evita les aturades que es donen al pas 2 del processador en ordre quan la instrucció no està completament preparada per a ser processada a causa que falten dades.
Els processadors fora d'ordre omplen aquests slots amb altres instruccions que sí que estan preparades per a ser processades, llavors reordenen els resultats al final perquè sembli que les instruccions van ser processades en ordre. La forma en què les instruccions estan ordenades al codi original és coneguda com a ordre de programa. En canvi al processador són tractades en ordre de dades; l'ordre en què les dades i els operands es tornen disponibles als registres del processador. Cal circuiteria bastant complexa per a convertir d'un ordre a un altre i mantenir l'ordre lògic al final de la sortida.
El benefici del processament fora d'ordre creix a mesura que el pipeline es fa més profund i la diferència de velocitat entre la memòria i el processador creix. En màquines modernes, el processador funciona molts cops més ràpid que la memòria, així que durant el temps que un processador en ordre gasta esperant que arribin les dades, podria haver processat un gran nombre d'instruccions.

## Vegeu també

* Scoreboarding
* Algorisme Tomasulo

## Enllaços externs

* "Implementation of precise interrupts in pipelined processors", a paper by Smith and Pleszkun (1985).