# Canalització d'instruccions

En enginyeria informàtica, la canalització d'instruccions és una tècnica per implementar el paral·lelisme a nivell d'instrucció dins d'un sol processador. La canalització intenta mantenir ocupada totes les parts del processador amb algunes instruccions dividint les instruccions entrants en una sèrie de passos seqüencials (el "pipeline" homònim) realitzats per diferents unitats de processador amb diferents parts d'instruccions processades en paral·lel.
| Clock cycleInstr. No. | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 1 | IF | ID | EX | MEM | WB | | |
| 2 | | IF | ID | EX | MEM | WB | |
| 3 | | | IF | ID | EX | MEM | WB |
| 4 | | | | IF | ID | EX | MEM |
| 5 | | | | | IF | ID | EX |
| (IF = Buscar instrucció (Instruction Fetch), ID = Decodificar (Instruction Decode), EX = Execute, MEM = Accedir a memòria (Memory Access), WB = Escriure (Registre write back)). En el quart cicle de rellotge (la columna verda), la instrucció més antiga es troba en l'etapa MEM i la darrera instrucció encara no ha entrat a la canalització. ||||||||

## Concepte i motivació

En un ordinador canalitzat, les instruccions flueixen a través de la unitat central de processament (CPU) per etapes. Per exemple, pot tenir una etapa per a cada pas del cicle de von Neumann: buscar la instrucció, buscar els operands, fer la instrucció, escriure els resultats. Un ordinador canalitzat normalment té "registres de canalització" després de cada etapa. Aquests emmagatzemen informació de la instrucció i els càlculs perquè les portes lògiques de la següent etapa puguin fer el següent pas.
Aquesta disposició permet a la CPU completar una instrucció a cada cicle de rellotge. És habitual que les etapes parells funcionin en una vora del rellotge d'ona quadrada, mentre que les etapes senars operen a l'altra vora. Això permet més rendiment de la CPU que un ordinador multicicle a una velocitat de rellotge determinada, però pot augmentar la latència a causa de la sobrecàrrega afegida del propi procés de canalització. A més, tot i que la lògica electrònica té una velocitat màxima fixa, un ordinador canalitzat es pot fer més ràpid o més lent variant el nombre d'etapes de la canonada. Amb més etapes, cada etapa fa menys treball, de manera que l'etapa té menys retards de les portes lògiques i podria funcionar a una velocitat de rellotge més alta.
Un model d'ordinador canalitzat sovint és el més econòmic, quan el cost es mesura com a portes lògiques per instrucció per segon. En cada instant, una instrucció només es troba en una etapa de pipeline i, de mitjana, una etapa de pipeline és menys costosa que un ordinador multicicle. A més, quan es fa bé, la major part de la lògica de l'ordinador canalitzat s'utilitza la major part del temps. En canvi, els ordinadors fora de servei solen tenir grans quantitats de lògica inactiva en un moment determinat. Càlculs similars solen mostrar que un ordinador canalitzat utilitza menys energia per instrucció.
Tanmateix, un ordinador canalitzat sol ser més complex i més costós que un ordinador multicicle comparable. Normalment té més portes lògiques, registres i una unitat de control més complexa. De la mateixa manera, pot utilitzar més energia total, mentre que utilitza menys energia per instrucció. Les CPU fora d'ordre solen fer més instruccions per segon perquè poden fer diverses instruccions alhora.

### Nombre de passos

El nombre de passos dependents varia segons l'arquitectura de la màquina. Per exemple:
* El projecte IBM Stretch de 1956–61 va proposar els termes Fetch, Decode i Execute que s'han convertit en comuns.
* La canonada clàssica RISC inclou:
* # Recollida d'instruccions.
* # Descodificació d'instruccions i recuperació del registre.
* # Executar.
* # Accés a la memòria.
* # Escriptura de registra.
* L'AVR d'Atmel i el microcontrolador PIC tenen cadascun una canonada de dues etapes.
* Molts dissenys inclouen canonades fins a 7, 10 i fins i tot 20 etapes (com a l'Intel Pentium 4).
* Els nuclis NetBurst "Prescott" i "Cedar Mill" posteriors d'Intel, utilitzats a l'últim Pentium 4 models i els seus derivats Pentium D i Xeon, tenen una llarga canonada de 31 etapes.
* El processador de xarxa X10q Xelerat té un pipeline de més de mil etapes, encara que en aquest cas 200 d'aquestes etapes representen CPU independents amb instruccions programades individualment. Les etapes restants s'utilitzen per coordinar els accessos a les unitats de funció de memòria i en xip.
A mesura que el pipeline es fa "més profund" (amb un major nombre de passos dependents), un pas determinat es pot implementar amb un circuit més senzill, que pot permetre que el rellotge del processador funcioni més ràpid. Aquestes canonades es poden anomenar superpipelines.
Es diu que un processador està completament canalitzat si pot obtenir una instrucció en cada cicle. Per tant, si algunes instruccions o condicions requereixen retards que impedeixen obtenir noves instruccions, el processador no està completament canalitzat.

### Perills

El model d'execució seqüencial suposa que cada instrucció es completa abans que comenci la següent; aquesta hipòtesi no és certa en un processador canalitzat. Una situació on el resultat esperat és problemàtic es coneix com a perill. Imagineu les dues instruccions de registre següents a un processador hipotètic:
1: afegir 1 a R5
2: copieu R5 a R6
Si el processador té els 5 passos enumerats a la il·lustració inicial (el 'conducte bàsic de cinc etapes' a l'inici de l'article), la instrucció 1 s'obtindria a l'instant t $_1$ i la seva execució es completaria a t $_5$ . La instrucció 2 s'obtindria a t ₂ i es completaria a t $_6$ . La primera instrucció pot dipositar el número incrementat a R5 com a cinquè pas (registrar escriptura) a t $_5$ . Però la segona instrucció podria obtenir el número de R5 (per copiar a R6) en el seu segon pas (decodificació d'instruccions i recuperació de registre) en el moment t ₃ . Sembla que la primera instrucció no hauria incrementat el valor per llavors. El codi anterior invoca un perill.
L'escriptura de programes informàtics en un llenguatge compilat pot no plantejar aquestes preocupacions, ja que el compilador podria estar dissenyat per generar codi màquina que eviti perills.

#### Salts

Una bifurcació fora de la seqüència d'instruccions normal sovint implica un perill. A menys que el processador pugui donar efecte a la branca en un sol cicle de temps, la canalització continuarà obtenint instruccions seqüencialment. No es pot permetre que aquestes instruccions tinguin efecte perquè el programador ha desviat el control a una altra part del programa.
Una branca condicional és encara més problemàtica. El processador es pot ramificar o no, depenent d'un càlcul que encara no s'hagi produït. Diversos processadors poden aturar-se, poden intentar la predicció de branques i poden començar a executar dues seqüències de programes diferents (execució ansiosa), cadascun assumint que la branca s'ha pres o no, descartant tot el treball relacionat amb la conjectura incorrecta.

## Exemple il·lustrat

A la dreta hi ha un pipeline genèric amb quatre etapes: buscar, descodificar, executar i escriure enrere. El quadre gris superior és la llista d'instruccions a l'espera d'executar-se, el quadre gris inferior és la llista d'instruccions que s'han acabat d'executar i el quadre blanc del mig és la canalització.
L'execució és la següent:
| Rellotge | Execució |
| 0 | Quatre instruccions estan esperant per ser executades |
| 1 | La instrucció verda s'obté de la memòria |
| 2 | La instrucció verda està descodificada La instrucció violeta s'obté de la memòria |
| 3 | S'executa la instrucció verda (es realitza l'operació real) La instrucció morada està descodificada S'obté la instrucció blava |
| 4 | Els resultats de la instrucció verda s'escriuen al fitxer de registre o a la memòria S'executa la instrucció violeta La instrucció blava està descodificada S'obté la instrucció vermella |
| 5 | S'ha completat l'execució de la instrucció verda La instrucció morada es torna a escriure S'executa la instrucció blava La instrucció vermella es descodifica |
| 6 | S'ha completat l'execució de la instrucció violeta La instrucció blava es torna a escriure S'executa la instrucció vermella |
| 7 | S'ha completat l'execució de la instrucció blava La instrucció vermella es torna a escriure |
| 8 | S'ha completat l'execució de la instrucció vermella |
| 9 | S'ha completat l'execució de les quatre instruccions |

## Referències

* ↑ Hawthorne, Mel. «What Is an Instruction Pipeline?» (en anglès americà), 09-08-2022. [Consulta: 10 setembre 2023].
* ↑ «Arithmetic Pipeline and Instruction Pipeline» (en anglès americà), 15-05-2020. [Consulta: 10 setembre 2023].
* ↑ «Instruction Pipeline - javatpoint» (en anglès). [Consulta: 10 setembre 2023].
* ↑ John Paul Shen, Mikko H. Lipasti. Modern Processor Design. McGraw-Hill Professional, 2004. ISBN 9780070570641.
* ↑ Sunggu Lee. Design of Computers and Other Complex Digital Devices. Prentice Hall, 2000. ISBN 9780130402677.