Un procesador superescalar (o procesador de múltiples problemas [1] ) es una CPU que implementa una forma de paralelismo llamado paralelismo a nivel de instrucciones dentro de un solo procesador. [2] A diferencia de un procesador escalar , que puede ejecutar como máximo una única instrucción por ciclo de reloj, un procesador superescalar puede ejecutar más de una instrucción durante un ciclo de reloj enviando simultáneamente múltiples instrucciones a diferentes unidades de ejecución en el procesador. Por lo tanto, permite un mayor rendimiento (el número de instrucciones que se pueden ejecutar en una unidad de tiempo) del que sería posible de otro modo a una velocidad de reloj determinada . Cada unidad de ejecución no es un procesador independiente (o un núcleo si el procesador es un procesador multinúcleo ), sino un recurso de ejecución dentro de una única CPU, como una unidad lógica aritmética .
Si bien una CPU superescalar generalmente también se canaliza , la ejecución superescalar y de canalización se consideran técnicas diferentes de mejora del rendimiento. El primero (superescalar) ejecuta múltiples instrucciones en paralelo utilizando múltiples unidades de ejecución, mientras que el segundo (pipeline) ejecuta múltiples instrucciones en la misma unidad de ejecución en paralelo dividiendo la unidad de ejecución en diferentes fases. En la figura "Canalización superescalar simple", recuperar dos instrucciones al mismo tiempo es superescalar, y recuperar las dos siguientes antes de que se haya escrito el primer par es canalizar.
La técnica superescalar se asocia tradicionalmente con varias características de identificación (dentro de una CPU determinada):
El CDC 6600 de Seymour Cray de 1964 se menciona a menudo como el primer diseño superescalar. El IBM System/360 Modelo 91 de 1967 fue otro mainframe superescalar. Los microprocesadores Intel i960 CA (1989), [3] AMD 29000 -serie 29050 (1990) y Motorola MC88110 (1991), [4] fueron los primeros microprocesadores superescalares comerciales de un solo chip. Los microprocesadores RISC como estos fueron los primeros en tener ejecución superescalar, porque las arquitecturas RISC liberan transistores y área de matriz que se pueden usar para incluir múltiples unidades de ejecución y la uniformidad tradicional del conjunto de instrucciones favorece el despacho superescalar (esta fue la razón por la que los diseños RISC fueron más rápidos que los CISC). diseños durante las décadas de 1980 y 1990, y es mucho más complicado realizar envíos múltiples cuando las instrucciones tienen una longitud de bits variable).
A excepción de las CPU utilizadas en aplicaciones de bajo consumo , sistemas integrados y dispositivos alimentados por baterías , esencialmente todas las CPU de uso general desarrolladas desde aproximadamente 1998 son superescalares.
El P5 Pentium fue el primer procesador superescalar x86; el Nx586 , el P6 Pentium Pro y el AMD K5 estuvieron entre los primeros diseños que decodifican instrucciones x86 de forma asincrónica en secuencias de microoperaciones dinámicas similares a microcódigos antes de la ejecución real en una microarquitectura superescalar ; esto abrió la puerta a la programación dinámica de instrucciones parciales almacenadas en búfer y permitió extraer más paralelismo en comparación con los métodos más rígidos utilizados en el Pentium P5 más simple ; también simplificó la ejecución especulativa y permitió frecuencias de reloj más altas en comparación con diseños como el avanzado Cyrix 6x86 .
Los procesadores más simples son los procesadores escalares. Cada instrucción ejecutada por un procesador escalar normalmente manipula uno o dos elementos de datos a la vez. Por el contrario, cada instrucción ejecutada por un procesador vectorial opera simultáneamente en muchos elementos de datos. Una analogía es la diferencia entre aritmética escalar y vectorial. Un procesador superescalar es una mezcla de los dos. Cada instrucción procesa un elemento de datos, pero hay múltiples unidades de ejecución dentro de cada CPU, por lo que varias instrucciones pueden procesar elementos de datos separados al mismo tiempo.
El diseño de CPU superescalar enfatiza la mejora de la precisión del despachador de instrucciones y le permite mantener múltiples unidades de ejecución en uso en todo momento. Esto se ha vuelto cada vez más importante a medida que aumenta el número de unidades. Mientras que las primeras CPU superescalares tendrían dos ALU y una sola FPU , un diseño posterior como el PowerPC 970 incluye cuatro ALU, dos FPU y dos unidades SIMD. Si el despachador es ineficaz a la hora de mantener todas estas unidades alimentadas con instrucciones, el rendimiento del sistema no será mejor que el de un diseño más simple y económico.
Un procesador superescalar normalmente mantiene una tasa de ejecución superior a una instrucción por ciclo de máquina . Pero el simple hecho de procesar múltiples instrucciones simultáneamente no hace que una arquitectura sea superescalar, ya que las arquitecturas canalizadas , multiprocesador o multinúcleo también logran eso, pero con diferentes métodos.
En una CPU superescalar, el despachador lee instrucciones de la memoria y decide cuáles se pueden ejecutar en paralelo, enviando cada una a una de las varias unidades de ejecución contenidas dentro de una única CPU. Por lo tanto, se puede imaginar que un procesador superescalar tenga múltiples canales paralelos, cada uno de los cuales procesa instrucciones simultáneamente desde un único hilo de instrucciones.
La mayoría de las CPU superescalares modernas también tienen lógica para reordenar las instrucciones para intentar evitar paradas en la canalización y aumentar la ejecución paralela.
La mejora del rendimiento disponible a partir de técnicas superescalares está limitada por tres áreas clave:
Los programas ejecutables binarios existentes tienen distintos grados de paralelismo intrínseco. En algunos casos, las instrucciones no dependen unas de otras y pueden ejecutarse simultáneamente. En otros casos son interdependientes: una instrucción impacta los recursos o los resultados de la otra. Las instrucciones a = b + c; d = e + f
se pueden ejecutar en paralelo porque ninguno de los resultados depende de otros cálculos. Sin embargo, es posible que las instrucciones a = b + c; b = e + f
no se puedan ejecutar en paralelo, dependiendo del orden en que se completen mientras se mueven por las unidades.
Aunque el flujo de instrucciones puede no contener dependencias entre instrucciones, una CPU superescalar debe verificar esa posibilidad, ya que no hay garantía de lo contrario y no detectar una dependencia produciría resultados incorrectos.
No importa cuán avanzado sea el proceso del semiconductor o cuán rápida sea la velocidad de conmutación, esto impone un límite práctico a la cantidad de instrucciones que se pueden enviar simultáneamente. Si bien los avances en los procesos permitirán un número cada vez mayor de unidades de ejecución (por ejemplo, ALU), la carga de verificar las dependencias de las instrucciones crece rápidamente, al igual que la complejidad de cambiar el nombre de los circuitos de los registros para mitigar algunas dependencias. En conjunto, el consumo de energía , la complejidad y los costos de retardo de puerta limitan la aceleración superescalar alcanzable.
Sin embargo, incluso dada una lógica de verificación de dependencias infinitamente rápida en una CPU superescalar convencional, si el flujo de instrucciones en sí tiene muchas dependencias, esto también limitaría la posible aceleración. Por tanto, el grado de paralelismo intrínseco en el flujo de código constituye una segunda limitación.
En conjunto, estos límites impulsan la investigación de cambios arquitectónicos alternativos, como palabras de instrucción muy largas (VLIW), computación de instrucciones explícitamente paralela (EPIC), multiproceso simultáneo (SMT) y computación multinúcleo .
Con VLIW, la engorrosa tarea de comprobar las dependencias mediante la lógica del hardware en tiempo de ejecución se elimina y se delega al compilador . La computación de instrucciones explícitamente paralela (EPIC) es como VLIW con instrucciones de captación previa de caché adicionales.
El multiproceso simultáneo (SMT) es una técnica para mejorar la eficiencia general de los procesadores superescalares. SMT permite múltiples subprocesos de ejecución independientes para utilizar mejor los recursos proporcionados por las arquitecturas de procesadores modernas. El hecho de que sean independientes significa que sabemos que la instrucción de un hilo puede ejecutarse fuera de orden y/o en paralelo con la instrucción de otro diferente. Además, un hilo independiente no producirá una burbuja de canalización en el flujo de código de otro diferente, por ejemplo, debido a una rama.
Los procesadores superescalares se diferencian de los procesadores multinúcleo en que las distintas unidades de ejecución no son procesadores completos. Un único procesador se compone de unidades de ejecución más detalladas, como ALU , multiplicador de enteros , desplazador de enteros, FPU , etc. Puede haber varias versiones de cada unidad de ejecución para permitir la ejecución de muchas instrucciones en paralelo. Esto difiere de un procesador multinúcleo que procesa simultáneamente instrucciones de múltiples subprocesos, un subproceso por unidad de procesamiento (llamado "núcleo"). También difiere de un procesador canalizado , donde las múltiples instrucciones pueden estar simultáneamente en varias etapas de ejecución, al estilo de una línea de ensamblaje .
Las diversas técnicas alternativas no son mutuamente excluyentes: pueden combinarse (y con frecuencia lo hacen) en un solo procesador. Por lo tanto, es posible una CPU multinúcleo donde cada núcleo es un procesador independiente que contiene múltiples canales paralelos, siendo cada canal superescalar. Algunos procesadores también incluyen capacidad vectorial .
{{cite book}}
: |journal=
ignorado ( ayuda ){{cite book}}
: |journal=
ignorado ( ayuda )