Procesador superescalar
Un procesador superescalar es una CPU que implementa una forma de paralelismo llamado paralelismo a nivel de instrucción dentro de un solo procesador. A diferencia de un procesador escalar, que puede ejecutar como máximo una sola 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 varias instrucciones a diferentes unidades de ejecución en el procesador. Por lo tanto, permite un mayor rendimiento (la cantidad de instrucciones que se pueden ejecutar en una unidad de tiempo) de lo que sería posible a una velocidad de reloj determinada. Cada unidad de ejecución no es un procesador separado (o un núcleo si el procesador es un procesador de varios núcleos), sino un recurso de ejecución dentro de una sola CPU, como una unidad lógica aritmética.
En la taxonomía de Flynn, un procesador superescalar de un solo núcleo se clasifica como un procesador SISD (flujo de instrucciones único, flujo de datos único), aunque un procesador superescalar de un solo núcleo que admita operaciones vectoriales cortas podría clasificarse como SIMD (flujo de instrucción única, múltiples flujos de datos). Un procesador superescalar multinúcleo se clasifica como un procesador MIMD (múltiples flujos de instrucciones, múltiples flujos de datos).
Si bien una CPU superescalar también suele estar canalizada, la ejecución superescalar y la canalización se consideran diferentes técnicas de mejora del rendimiento. El primero ejecuta múltiples instrucciones en paralelo usando múltiples unidades de ejecución, mientras que el segundo ejecuta múltiples instrucciones en la misma unidad de ejecución en paralelo dividiendo la unidad de ejecución en diferentes fases.
La técnica superescalar se asocia tradicionalmente con varias características de identificación (dentro de una CPU dada):
- Se emiten instrucciones de una secuencia de instrucción secuencial
- La CPU controla dinámicamente las dependencias de datos entre instrucciones en tiempo de ejecución (verificación de software en tiempo de compilación)
- La CPU puede ejecutar múltiples instrucciones por ciclo de reloj
Historia
El CDC 6600 de Seymour Cray de 1964 se menciona a menudo como el primer diseño superescalar. El IBM System/360 Model 91 de 1967 fue otro mainframe superescalar. Los microprocesadores Motorola MC88100 (1988), Intel i960CA (1989) y AMD 29000-series 29050 (1990) fueron los primeros microprocesadores superescalares comerciales de un solo chip. Los microprocesadores RISC como estos fueron los primeros en tener una ejecución superescalar, porque las arquitecturas RISC liberan transistores y un área de matriz que se puede usar para incluir múltiples unidades de ejecución (esa fue la razón por la cual los diseños RISC fueron más rápidos que los diseños CISC durante la década de 1980 y hasta la década de 1990).
A excepción de las CPU que se utilizan en aplicaciones de bajo consumo, sistemas integrados y dispositivos alimentados por batería, básicamente todas las CPU de propósito general desarrolladas desde aproximadamente 1998 son superescalares.
El P5 Pentium fue el primer procesador superescalar x86; el Nx586, P6 Pentium Pro y AMD K5 estuvieron entre los primeros diseños que decodifican instrucciones x86 de forma asincrónica en secuencias micro-op similares a microcódigos dinámicos antes de la ejecución real en una microarquitectura superescalar; esto se abrió para 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.
De escalar a superescalar
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 la aritmética escalar y vectorial. Un procesador superescalar es una mezcla de los dos. Cada instrucción procesa un elemento de datos, pero hay varias 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 la CPU superescalar enfatiza la mejora de la precisión del despachador de instrucciones y le permite mantener las 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 tení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 no logra 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 suele mantener una tasa de ejecución superior a una instrucción por ciclo de máquina. Pero el simple procesamiento de varias instrucciones al mismo tiempo 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 las 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 sola CPU. Por lo tanto, se puede imaginar un procesador superescalar que tenga múltiples canalizaciones paralelas, cada una de las cuales procesa instrucciones simultáneamente desde un solo hilo de instrucción.
Limitaciones
La mejora de rendimiento disponible de las técnicas superescalares está limitada por tres áreas clave:
- El grado de paralelismo intrínseco en la corriente de instrucción (instrucción que requiere los mismos recursos computacionales de la CPU)
- La complejidad y el coste del tiempo de la lógica de control de dependencia y el registro de renoming circuito
- El procesamiento de la instrucción rama
Los programas ejecutables binarios existentes tienen diversos 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 afecta los recursos o los resultados de la otra. Las instrucciones a = b + c; d = e + f se puede ejecutar en paralelo porque ninguno de los resultados depende de otros cálculos. Sin embargo, las instrucciones a = b + c; Es posible que b = e + f
no se pueda ejecutar en paralelo, según el orden en que se completan las instrucciones mientras se mueven a través de 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 la falla en detectar una dependencia produciría resultados incorrectos.
No importa qué tan avanzado sea el proceso de semiconductores o qué tan rápida sea la velocidad de conmutación, esto pone un límite práctico a la cantidad de instrucciones que se pueden enviar simultáneamente. Si bien los avances del proceso permitirán un número cada vez mayor de unidades de ejecución (por ejemplo, ALU), la carga de verificar las dependencias de instrucciones crece rápidamente, al igual que la complejidad de los circuitos de cambio de nombre de registro para mitigar algunas dependencias. Colectivamente, el consumo de energía, la complejidad y los costos de retardo de puerta limitan la aceleración superescalar alcanzable.
Sin embargo, incluso con una lógica de verificación de dependencia 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. Así, el grado de paralelismo intrínseco en el flujo de código forma una segunda limitación.
Alternativas
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 instrucción explícitamente paralela (EPIC), subprocesos múltiples simultáneos (SMT) y computación multinúcleo.
Con VLIW, la pesada 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 paralelas (EPIC) es como VLIW con instrucciones adicionales de captura previa de caché.
El subprocesamiento múltiple simultáneo (SMT) es una técnica para mejorar la eficiencia general de los procesadores superescalares. SMT permite varios subprocesos de ejecución independientes para utilizar mejor los recursos proporcionados por las arquitecturas de procesador modernas.
Los procesadores superescalares se diferencian de los procesadores multinúcleo en que las distintas unidades de ejecución no son procesadores completos. Un solo procesador se compone de unidades de ejecución de grano más fino, como la ALU, el multiplicador de enteros, el desplazador de enteros, la 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 se diferencia de un procesador segmentado, en el que las múltiples instrucciones pueden estar simultáneamente en varias etapas de ejecución, al estilo de una línea de montaje.
Las diversas técnicas alternativas no se excluyen mutuamente: 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 canalizaciones paralelas, siendo cada canalización superescalar. Algunos procesadores también incluyen capacidad vectorial.
Contenido relacionado
Licencia Apache
Boeing CH-47 Chinook
Galvanoplastia