El paral·lelisme a nivell d'instrucció (amb acrònim anglès ILP) és l'execució paral·lela o simultània d'una seqüència d'instruccions en un programa informàtic. Més concretament, ILP es refereix al nombre mitjà d'instruccions executades per pas d'aquesta execució paral·lela.[2]:5
No s'ha de confondre ILP amb concurrència. En ILP hi ha un únic fil específic d'execució d'un procés. D'altra banda, la concurrència implica l'assignació de diversos fils al nucli d'una CPU en una alternança estricta, o en paral·lelisme real si hi ha prou nuclis de CPU, idealment un nucli per a cada fil executable.[3]
Hi ha dos enfocaments per al paral·lelisme a nivell d'instrucció: maquinari i programari.
El nivell de maquinari funciona amb paral·lelisme dinàmic, mentre que el nivell de programari funciona amb paral·lelisme estàtic. El paral·lelisme dinàmic significa que el processador decideix en temps d'execució quines instruccions executar en paral·lel, mentre que el paral·lelisme estàtic significa que el compilador decideix quines instruccions executar en paral·lel.[4] El processador Pentium treballa en la seqüència dinàmica d'execució paral·lela, però el processador Itanium treballa en el paral·lelisme a nivell estàtic.
Considereu el programa següent:
e = a + b
f = c + d
m = e * f
L'operació 3 depèn dels resultats de les operacions 1 i 2, per la qual cosa no es pot calcular fins que s'han completat totes dues. Tanmateix, les operacions 1 i 2 no depenen de cap altra operació, de manera que es poden calcular simultàniament. Si suposem que cada operació es pot completar en una unitat de temps, aquestes tres instruccions es poden completar en un total de dues unitats de temps, donant una ILP de 3/2.
Un objectiu dels dissenyadors de compiladors i processadors és identificar i aprofitar el màxim d'ILP possible. Els programes normals s'escriuen normalment sota un model d'execució seqüencial on les instruccions s'executen una darrere l'altra i en l'ordre especificat pel programador. ILP permet que el compilador i el processador superposen l'execució de múltiples instruccions o fins i tot canviar l'ordre en què s'executen les instruccions.[5]
Les tècniques de microarquitectura que s'utilitzen per explotar ILP inclouen:
Execució fora d'ordre on les instruccions s'executen en qualsevol ordre que no infringeixi les dependències de dades. Tingueu en compte que aquesta tècnica és independent tant de la canalització com de l'execució superescalar. Les implementacions actuals d'execució fora d'ordre dinàmicament (és a dir, mentre el programa s'executa i sense cap ajuda del compilador) extreuen ILP dels programes normals. Una alternativa és extreure aquest paral·lelisme en temps de compilació i, d'alguna manera, transmetre aquesta informació al maquinari. A causa de la complexitat d'escalar la tècnica d'execució fora d'ordre, la indústria ha reexaminat conjunts d'instruccions que codifiquen explícitament múltiples operacions independents per instrucció.
Canvi de nom de registre que fa referència a una tècnica utilitzada per evitar la serialització innecessària d'operacions del programa imposada per la reutilització de registres per part d'aquestes operacions, utilitzada per permetre l'execució fora d'ordre.
Execució especulativa que permet l'execució d'instruccions completes o parts d'instruccions abans d'estar segur de si aquesta execució s'ha de produir. Una forma d'execució especulativa que s'utilitza habitualment és l'especulació del flux de control on les instruccions que passaven d'una instrucció de flux de control (per exemple, una branca) s'executen abans que es determini l'objectiu de la instrucció de flux de control. S'han proposat diverses altres formes d'execució especulativa que s'utilitzen, inclosa l'execució especulativa impulsada per la predicció de valors, la predicció de la dependència de la memòria i la predicció de la latència de la memòria cau.
Predicció de branca que s'utilitza per evitar l'aturada per resoldre les dependències de control. La predicció de branques s'utilitza amb l'execució especulativa.