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 nivel de hardware funciona con paralelismo dinámico, mientras que el 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 de 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:
Se sabe que el ILP es explotado tanto por el compilador como por el soporte de hardware, pero el compilador también proporciona ILP inherente e implícito en programas al hardware mediante optimizaciones en tiempo de compilación. Algunas técnicas de optimización para extraer el ILP disponible en los programas incluirían 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, consulte la arquitectura TRIPS .
En los últimos años, las técnicas de ILP se han utilizado para proporcionar mejoras de rendimiento a pesar de la creciente disparidad entre las frecuencias de funcionamiento 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, una penalización por fallo 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 de funcionamiento 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 mediante técnicas como el multiprocesamiento y el multihilo . [4]