El paralelismo a nivel de instrucción ( ILP ) es la ejecución paralela o simultánea de una secuencia de instrucciones en un programa informático . Más específicamente, ILP se refiere al número promedio de instrucciones ejecutadas por paso de esta ejecución paralela. [2] : 5
No debe confundirse ILP con concurrencia . En ILP, existe un único hilo específico de ejecución de un proceso . Por otro lado, la concurrencia implica la asignación de múltiples hilos a un núcleo de la CPU en una alternancia estricta, o en verdadero paralelismo si hay suficientes núcleos de CPU, idealmente un núcleo por cada hilo ejecutable.
Hay dos enfoques para el paralelismo a nivel de instrucción: hardware y software .
El ILP a nivel de hardware funciona con paralelismo dinámico, mientras que el ILP a nivel de software funciona con paralelismo estático. El paralelismo dinámico significa que el procesador decide en tiempo de ejecución qué instrucciones ejecutar en paralelo, mientras que el paralelismo estático significa que el compilador decide qué instrucciones ejecutar en paralelo. [3] [ aclaración necesaria ] El procesador Pentium funciona con la secuencia dinámica de ejecución paralela, pero el procesador Itanium funciona con paralelismo a nivel estático.
Consideremos el siguiente programa:
e = a + bf = c + dm = e * f
La operación 3 depende de los resultados de las operaciones 1 y 2, por lo que no se puede calcular hasta que ambas se completen. Sin embargo, las operaciones 1 y 2 no dependen de ninguna otra operación, por lo que se pueden calcular simultáneamente. Si suponemos que cada operación se puede completar en una unidad de tiempo, entonces estas tres instrucciones se pueden completar en un total de dos unidades de tiempo, lo que da un ILP de 3/2.
Un objetivo de los diseñadores de compiladores y procesadores es identificar y aprovechar la mayor cantidad posible de ILP. Los programas ordinarios suelen escribirse según un modelo de ejecución secuencial en el que las instrucciones se ejecutan una tras otra y en el orden especificado por el programador. El ILP permite al compilador y al procesador superponer la ejecución de varias instrucciones o incluso cambiar el orden en el que se ejecutan las instrucciones.
La cantidad de ILP que existe en los programas depende de cada aplicación. En ciertos campos, como los gráficos y la computación científica , la cantidad puede ser muy grande. Sin embargo, las cargas de trabajo como la criptografía pueden mostrar mucho menos paralelismo.
Las técnicas de microarquitectura que se utilizan para explotar ILP incluyen:
El compilador y el hardware aprovechan la ILP, pero el compilador también proporciona ILP inherente e implícita en los programas al hardware mediante optimizaciones en tiempo de compilación. Algunas técnicas de optimización para extraer la ILP disponible en los programas incluyen la programación de instrucciones , la asignación/cambio de nombre de registros y la optimización del acceso a la memoria.
Las arquitecturas de flujo de datos son otra clase de arquitecturas donde ILP se especifica explícitamente; para un ejemplo reciente [¿ cuándo? ] , consulte la arquitectura TRIPS .
En los últimos [ ¿cuándo? ] años, se han utilizado técnicas de ILP para proporcionar mejoras de rendimiento a pesar de la creciente disparidad entre las frecuencias operativas del procesador y los tiempos de acceso a la memoria (los primeros diseños de ILP, como el IBM System/360 Model 91, utilizaban técnicas de ILP para superar las limitaciones impuestas por un archivo de registros relativamente pequeño). En la actualidad [ ¿cuándo? ] , una penalización por error de caché en la memoria principal cuesta varios cientos de ciclos de CPU. Si bien en principio es posible utilizar ILP para tolerar incluso esas latencias de memoria, los costos asociados de recursos y disipación de energía son desproporcionados. Además, la complejidad y, a menudo, la latencia de las estructuras de hardware subyacentes dan como resultado una frecuencia operativa reducida, lo que reduce aún más los beneficios. Por lo tanto, las técnicas mencionadas anteriormente resultan inadecuadas para evitar que la CPU se detenga para los datos fuera del chip. En cambio, la industria se dirige hacia la explotación de niveles más altos de paralelismo que se pueden aprovechar a través de técnicas como el multiprocesamiento y el multihilo . [4]