stringtranslate.com

Conjunto de instrucciones complejo para computadoras

Una computadora con conjunto de instrucciones complejo ( CISC / ˈ s ɪ s k / ) es una arquitectura de computadora en la que instrucciones individuales pueden ejecutar varias operaciones de bajo nivel (como una carga desde la memoria , una operación aritmética y un almacenamiento de memoria) o son capaces de operaciones de múltiples pasos o modos de direccionamiento dentro de instrucciones individuales. [ cita requerida ] El término fue acuñado retroactivamente en contraste con la computadora con conjunto de instrucciones reducido (RISC) [1] y, por lo tanto, se ha convertido en una especie de término general para todo lo que no es RISC, [ cita requerida ] donde la característica diferenciadora típica [ dudoso - discutir ] es que la mayoría de los diseños RISC usan una longitud de instrucción uniforme para casi todas las instrucciones y emplean instrucciones de carga y almacenamiento estrictamente separadas.

Ejemplos de arquitecturas CISC incluyen computadoras mainframe complejas hasta microcontroladores simplistas donde las operaciones de carga y almacenamiento de memoria no están separadas de las instrucciones aritméticas. [ cita requerida ] Las arquitecturas de conjuntos de instrucciones específicas que han sido etiquetadas retroactivamente como CISC son System/360 a z/Architecture , las arquitecturas PDP-11 y VAX , y muchas otras. Los microprocesadores y microcontroladores conocidos que también han sido etiquetados como CISC en muchas publicaciones académicas [ cita requerida ] incluyen las familias Motorola 6800 , 6809 y 68000 ; la familia Intel 8080 , iAPX 432 , x86 y 8051 ; las familias Zilog Z80 , Z8 y Z8000 ; la familia National Semiconductor NS320xx ; la familia MOS Technology 6502 ; y otras.

Algunos autores han considerado algunos diseños como casos límite. [¿ Quién? ] Por ejemplo, el PIC de Microchip Technology ha sido etiquetado como RISC en algunos círculos y CISC en otros.

Incitaciones y beneficios

Antes de que la filosofía RISC se hiciera prominente, muchos arquitectos de computadoras intentaron salvar la llamada brecha semántica , es decir, diseñar conjuntos de instrucciones que admitieran directamente construcciones de programación de alto nivel como llamadas a procedimientos, control de bucles y modos de direccionamiento complejos , lo que permite combinar la estructura de datos y los accesos a matrices en instrucciones únicas. Las instrucciones también suelen estar altamente codificadas para mejorar aún más la densidad del código. La naturaleza compacta de tales conjuntos de instrucciones da como resultado tamaños de programa más pequeños y menos accesos a la memoria principal (que a menudo eran lentos), lo que en ese momento (principios de la década de 1960 en adelante) resultó en un tremendo ahorro en el costo de la memoria de la computadora y el almacenamiento en disco, así como una ejecución más rápida. También significó una buena productividad de programación incluso en lenguaje ensamblador , ya que los lenguajes de alto nivel como Fortran o Algol no siempre estaban disponibles o no eran apropiados. De hecho, los microprocesadores de esta categoría a veces todavía se programan en lenguaje ensamblador para ciertos tipos de aplicaciones críticas. [ cita requerida ]

Nuevas instrucciones

En la década de 1970, el análisis de lenguajes de alto nivel indicó que los compiladores producían algunos lenguajes de máquina correspondientes complejos. Se determinó que las nuevas instrucciones podrían mejorar el rendimiento. Se agregaron algunas instrucciones que nunca se pretendió utilizar en lenguaje ensamblador, pero que encajaban bien con los lenguajes de alto nivel compilados. Los compiladores se actualizaron para aprovechar estas instrucciones. Los beneficios de las instrucciones semánticamente ricas con codificaciones compactas también se pueden ver en los procesadores modernos, particularmente en el segmento de alto rendimiento donde las cachés son un componente central (a diferencia de la mayoría de los sistemas integrados ). Esto se debe a que estas memorias rápidas, pero complejas y costosas, tienen un tamaño inherentemente limitado, lo que hace que el código compacto sea beneficioso. Por supuesto, la razón fundamental por la que se necesitan es que las memorias principales (es decir, la RAM dinámica actual) siguen siendo lentas en comparación con un núcleo de CPU (de alto rendimiento).

Problemas de diseño

Si bien muchos diseños lograron el objetivo de un mayor rendimiento a un menor costo y también permitieron que las construcciones de lenguaje de alto nivel se expresaran mediante menos instrucciones, se observó que esto no siempre era así. Por ejemplo, las versiones de gama baja de arquitecturas complejas (es decir, que utilizan menos hardware) podían dar lugar a situaciones en las que era posible mejorar el rendimiento al no utilizar una instrucción compleja (como una llamada a un procedimiento o una instrucción de entrada) sino utilizar en su lugar una secuencia de instrucciones más simples.

Una de las razones de esto era que los arquitectos ( escritores de microcódigo ) a veces "sobre-diseñaban" las instrucciones en lenguaje ensamblador, incluyendo características que no podían implementarse eficientemente en el hardware básico disponible. Podría haber, por ejemplo, "efectos secundarios" (por encima de los indicadores convencionales), como la configuración de un registro o una ubicación de memoria que tal vez se usara rara vez; si esto se hiciera a través de buses internos ordinarios (no duplicados), o incluso el bus externo, demandaría ciclos adicionales cada vez y, por lo tanto, sería bastante ineficiente.

Incluso en diseños equilibrados de alto rendimiento, las instrucciones altamente codificadas y de nivel (relativamente) alto podrían ser complicadas de decodificar y ejecutar de manera eficiente dentro de un presupuesto limitado de transistores. Por lo tanto, tales arquitecturas requerían una gran cantidad de trabajo por parte del diseñador del procesador en los casos en que una solución más simple, pero (normalmente) más lenta, basada en tablas de decodificación y/o secuenciación de microcódigo no era adecuada. En una época en la que los transistores y otros componentes eran un recurso limitado, esto también dejaba menos componentes y menos oportunidades para otros tipos de optimizaciones del rendimiento.

La idea RISC

El circuito que realiza las acciones definidas por el microcódigo en muchos procesadores CISC (pero no en todos) es, en sí mismo, un procesador que en muchos sentidos recuerda en su estructura a los primeros diseños de CPU. A principios de los años 70, esto dio lugar a ideas para volver a diseños de procesadores más simples con el fin de que fuera más factible prescindir de tablas ROM y/o estructuras PLA para secuenciar y/o decodificar ( en aquel entonces relativamente grandes y costosas).

Un procesador etiquetado RISC (retroactivamente) temprano ( IBM 801  – Centro de Investigación Watson de IBM, mediados de la década de 1970) era una máquina simple con una estructura de tuberías muy estrecha que originalmente estaba destinada a ser utilizada como un núcleo o motor de microcódigo interno en diseños CISC, [ cita requerida ] pero que también se convirtió en el procesador que introdujo la idea RISC a una audiencia algo más grande. La simplicidad y la regularidad también en el conjunto de instrucciones visibles facilitarían la implementación de etapas de procesador superpuestas ( tubería ) a nivel de código de máquina (es decir, el nivel visto por los compiladores). Sin embargo, la tubería a ese nivel ya se usaba en algunas "supercomputadoras" CISC de alto rendimiento para reducir el tiempo del ciclo de instrucción (a pesar de las complicaciones de implementación dentro del recuento limitado de componentes y la complejidad del cableado factible en ese momento). La ejecución de microcódigo interno en procesadores CISC, por otro lado, podría estar más o menos canalizada dependiendo del diseño particular y, por lo tanto, más o menos similar a la estructura básica de los procesadores RISC.

La supercomputadora CDC 6600 , que se entregó por primera vez en 1965, también se describió retroactivamente como RISC. [2] [3] Tenía una arquitectura de carga y almacenamiento que permitía que se ejecutaran hasta cinco cargas y dos almacenamientos simultáneamente bajo el control del programador. También tenía unidades de función múltiples que podían funcionar al mismo tiempo.

Superescalar

En un contexto más moderno, la compleja codificación de longitud variable utilizada por algunas de las arquitecturas CISC típicas hace que sea complicado, pero aún factible, construir una implementación superescalar de un modelo de programación CISC directamente ; el Pentium original superescalar en orden y el Cyrix 6x86 superescalar fuera de orden son ejemplos bien conocidos de esto. Los frecuentes accesos a la memoria para los operandos de una máquina CISC típica pueden limitar el paralelismo a nivel de instrucción que se puede extraer del código, aunque esto está fuertemente mediado por las rápidas estructuras de caché utilizadas en los diseños modernos, así como por otras medidas. Debido a las instrucciones inherentemente compactas y semánticamente ricas, la cantidad promedio de trabajo realizado por unidad de código de máquina (es decir, por byte o bit) es mayor para un procesador CISC que para un procesador RISC, lo que puede darle una ventaja significativa en una implementación moderna basada en caché.

Los transistores para lógica, PLA y microcódigo ya no son recursos escasos; solo las grandes memorias caché de alta velocidad están limitadas por el número máximo de transistores en la actualidad. Aunque complejo, el recuento de transistores de los decodificadores CISC no crece exponencialmente como el número total de transistores por procesador (la mayoría se usa típicamente para cachés). Junto con mejores herramientas y tecnologías mejoradas, esto ha llevado a nuevas implementaciones de diseños altamente codificados y de longitud variable sin limitaciones de carga y almacenamiento (es decir, no RISC). Esto rige las reimplementaciones de arquitecturas más antiguas como el ubicuo x86 (ver más abajo), así como los nuevos diseños de microcontroladores para sistemas integrados y usos similares. La complejidad superescalar en el caso del x86 moderno se resolvió convirtiendo instrucciones en una o más microoperaciones y emitiendo dinámicamente esas microoperaciones, es decir, ejecución superescalar indirecta y dinámica; el Pentium Pro y el AMD K5 son ejemplos tempranos de esto. Permite ubicar un diseño superescalar bastante simple después de los decodificadores (y buffers) (bastante complejos), lo que brinda, por así decirlo, lo mejor de ambos mundos en muchos aspectos. Esta técnica también se utiliza en los microprocesadores IBM z196 y posteriores z/Architecture .

Términos CISC y RISC

Los términos CISC y RISC han perdido significado con la continua evolución de los diseños e implementaciones de CISC y RISC. Las primeras implementaciones x86 altamente (o estrechamente) segmentadas, los diseños 486 de Intel , AMD , Cyrix e IBM , admitían todas las instrucciones que sus predecesores, pero alcanzaban la máxima eficiencia solo en un subconjunto x86 bastante simple que era solo un poco más que un conjunto de instrucciones RISC típico (es decir, sin los límites típicos de carga y almacenamiento de RISC ). [ cita requerida ] La generación Intel P5 Pentium fue una versión superescalar de estos principios. Sin embargo, los procesadores x86 modernos también (normalmente) decodifican y dividen instrucciones en secuencias dinámicas de microoperaciones almacenadas internamente en búfer , lo que ayuda a ejecutar un subconjunto más grande de instrucciones de manera segmentada (superpuesta) y facilita una extracción más avanzada de paralelismo fuera del flujo de código, para un rendimiento aún mayor.

Contrariamente a las simplificaciones populares (presentes también en algunos textos académicos), no todos los CISC están microcodificados o tienen instrucciones "complejas". [ cita requerida ] A medida que CISC se convirtió en un término general que significa cualquier cosa que no sea una arquitectura de carga y almacenamiento (RISC), no es la cantidad de instrucciones ni la complejidad de la implementación o de las instrucciones lo que define a CISC, sino que las instrucciones aritméticas también realizan accesos a memoria. [ cita requerida ] [4] [ verificación fallida ] En comparación con un pequeño procesador CISC de 8 bits, una instrucción de punto flotante RISC es compleja. CISC ni siquiera necesita tener modos de direccionamiento complejos; los procesadores RISC de 32 o 64 bits pueden tener modos de direccionamiento más complejos que los pequeños procesadores CISC de 8 bits.

Un PDP-10 , un PDP-8 , un Intel 80386 , un Intel 4004 , un Motorola 68000 , un mainframe System z , un Burroughs B5000 , un VAX , un Zilog Z80000 y un MOS Technology 6502 varían ampliamente en la cantidad, tamaños y formatos de instrucciones, la cantidad, tipos y tamaños de registros y los tipos de datos disponibles. Algunos tienen soporte de hardware para operaciones como escaneo de una subcadena, aritmética BCD de precisión arbitraria o funciones trascendentales , mientras que otros solo tienen suma y resta de 8 bits. Pero todos están en la categoría CISC [ cita requerida ] . porque tienen instrucciones de "carga-operación" que cargan y/o almacenan contenidos de memoria dentro de las mismas instrucciones que realizan los cálculos reales. Por ejemplo, el PDP-8, que tiene solo 8 instrucciones de longitud fija y ningún microcódigo, es un CISC por la forma en que funcionan las instrucciones, PowerPC, que tiene más de 230 instrucciones (más que algunos VAX) y funciones internas complejas como cambio de nombre de registros y un búfer de reordenamiento, es un RISC, mientras que Minimal CISC tiene 8 instrucciones, pero es claramente un CISC porque combina el acceso a la memoria y el cálculo en las mismas instrucciones.

Véase también

Referencias

  1. ^ Patterson, DA ; Ditzel, DR (octubre de 1980). "El caso de la computadora con conjunto de instrucciones reducido". ACM SIGARCH Computer Architecture News . 8 (6). ACM : 25–33. doi :10.1145/641914.641917. S2CID  12034303.
  2. ^ "Historia de la informática: arquitectura de hardware de la serie CDC 6000". Museo Waalsdorp . 23 de julio de 2023 . Consultado el 19 de enero de 2024 .
  3. ^ Anthony, Sebastian (10 de abril de 2012). «La historia de las supercomputadoras». ExtremeTech . Consultado el 19 de enero de 2024 .
  4. ^ Hennessy, John ; Patterson, David . Arquitectura informática: un enfoque cuantitativo (PDF) . Archivado (PDF) del original el 14 de junio de 2023 . Consultado el 13 de junio de 2023 .

Referencias generales

Lectura adicional