Articulo de referencia

Computadora con conjunto de instrucciones complejo

Un ordenador con conjunto de instrucciones complejo ( CISC / ˈ s ɪ s k / ) es una arquitectura informática en la que las instrucciones individuales pueden ejecutar varias operac...

Un ordenador con conjunto de instrucciones complejo ( CISC / ˈ s ɪ s k / ) es una arquitectura informática en la que las instrucciones individuales pueden ejecutar varias operaciones de bajo nivel (como una carga desde la memoria , una operación aritmética y un almacenamiento en memoria) o son capaces de realizar operaciones de varios pasos o modos de direccionamiento dentro de las mismas instrucciones. [ 1 ] El término se acuñó retroactivamente en contraste con el ordenador con conjunto de instrucciones reducido (RISC) [ 2 ] y, por lo tanto, se ha convertido en una especie de término general para todo lo que no es RISC, [ 3 ] donde algunos de los factores diferenciadores más comunes de una arquitectura RISC son la longitud uniforme de las instrucciones y las instrucciones de acceso a memoria estrictamente separadas.

Ejemplos de arquitecturas CISC incluyen computadoras centrales complejas y microcontroladores simples donde las operaciones de carga y almacenamiento de memoria no están separadas de las instrucciones aritméticas. [ 4 ] 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. Microprocesadores y microcontroladores bien conocidos que también han sido etiquetados como CISC en muchas publicaciones académicas [ 5 ] incluyen las familias Motorola 6800 , 6809 y 68000 ; las familias 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 ciertos diseños como casos límite. Por ejemplo, el microcontrolador PIC de Microchip Technology ha sido catalogado como RISC en algunos círculos y como CISC en otros.

Incentivos y beneficios

Antes de que la filosofía RISC se popularizara, muchos arquitectos de computadoras intentaron superar la denominada brecha semántica , es decir, diseñar conjuntos de instrucciones que soportaran directamente construcciones de programación de alto nivel, como llamadas a procedimientos, control de bucles y modos de direccionamiento complejos , permitiendo combinar el acceso a estructuras de datos y matrices en instrucciones únicas. Las instrucciones también suelen estar altamente codificadas para aumentar aún más la densidad del código. La naturaleza compacta de estos conjuntos de instrucciones da como resultado programas más pequeños y menos accesos a la memoria principal (que a menudo eran lentos), lo que en aquel entonces (principios de la década de 1960 en adelante) supuso un enorme ahorro en el coste de la memoria y el almacenamiento en disco, además de 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 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. [ 6 ]

New instructions

En la década de 1970, el análisis de lenguajes de alto nivel indicó que los compiladores generaban un lenguaje máquina complejo. Se determinó que las nuevas instrucciones podían mejorar el rendimiento. Se añadieron algunas instrucciones que nunca se habían concebido para usarse en lenguaje ensamblador, pero que se adaptaban bien a 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 observan en los procesadores modernos, especialmente en el segmento de alto rendimiento, donde las cachés son un componente fundamental (a diferencia de la mayoría de los sistemas embebidos ). 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.

Problemas de diseño

Si bien muchos diseños lograron un mayor rendimiento a menor costo y permitieron expresar construcciones de lenguaje de alto nivel con menos instrucciones, se observó que esto no siempre era así. Por ejemplo, las versiones de gama baja de arquitecturas complejas (es decir, con 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 procedimiento o una instrucción de entrada), sino una secuencia de instrucciones más simples.

Una de las razones era que los arquitectos ( escritores de microcódigo ) a veces sobrediseñaban las instrucciones del lenguaje ensamblador, incluyendo funciones que no podían implementarse de manera eficiente en el hardware básico disponible. Podía haber, por ejemplo, "efectos secundarios" (más allá de las banderas convencionales), como la configuración de un registro o una ubicación de memoria que quizás se usaba con poca frecuencia; si esto se hacía a través de buses internos ordinarios (no duplicados), o incluso del bus externo, requerirí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 podían ser difíciles de decodificar y ejecutar eficientemente con un presupuesto limitado de transistores. Por lo tanto, estas arquitecturas requerían un gran esfuerzo por parte del diseñador del procesador en los casos en que una solución más simple, pero (generalmente) más lenta, basada en tablas de decodificación o secuenciación de microcódigo no resultaba apropiada. En una época en la que los transistores y otros componentes eran un recurso limitado, esto también implicaba menos componentes y menos oportunidades para otros tipos de optimizaciones de rendimiento.

La idea RISC

El circuito que ejecuta las acciones definidas por el microcódigo en muchos (pero no en todos) los procesadores CISC es, en sí mismo, un procesador cuya estructura recuerda en muchos aspectos a los primeros diseños de CPU. A principios de la década de 1970, esto dio lugar a la idea de volver a diseños de procesadores más sencillos para que resultara más factible prescindir de las tablas ROM y/o las estructuras PLA ( entonces relativamente grandes y costosas) para la secuenciación y/o la decodificación.

Un procesador RISC primitivo (con una denominación retroactiva) ( IBM 801 Centro de Investigación Watson de IBM , mediados de la década de 1970) era una máquina simple con una arquitectura de segmentación estrecha, originalmente concebida para usarse como núcleo o motor de microcódigo interno en diseños CISC, pero que también se convirtió en el procesador que introdujo la idea RISC a un público más amplio. La simplicidad y la regularidad, incluso en el conjunto de instrucciones visible, facilitarían la implementación de etapas de procesamiento superpuestas ( segmentación ) a nivel de código máquina (es decir, el nivel que ven los compiladores). Sin embargo, la segmentación a ese nivel ya se utilizaba en algunas "supercomputadoras" CISC de alto rendimiento para reducir el tiempo del ciclo de instrucción (a pesar de las complicaciones de implementarla dentro del número limitado de componentes y la complejidad del cableado factible en ese momento). La ejecución interna del microcódigo en los procesadores CISC, por otro lado, podía tener mayor o menor segmentación dependiendo del diseño particular, y por lo tanto, ser más o menos similar a la estructura básica de los procesadores RISC. 

La supercomputadora CDC 6600 , entregada por primera vez en 1965, también ha sido descrita retroactivamente como RISC. [ 7 ] [ 8 ] Tenía una arquitectura de carga y almacenamiento que permitía que hasta cinco cargas y dos almacenamientos estuvieran en curso simultáneamente bajo el control del programador. También tenía múltiples unidades funcionales que podían operar al mismo tiempo.

Superescalar

En un contexto más moderno, la compleja codificación de longitud variable utilizada por algunas 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 de ejecución en orden y el Cyrix 6x86 superescalar de ejecución fuera de orden son ejemplos bien conocidos de esto. Los frecuentes accesos a 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 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 actual. Aunque complejos, los decodificadores CISC no aumentan exponencialmente como el número total de transistores por procesador (la mayoría se utilizan normalmente para cachés). Junto con mejores herramientas y tecnologías avanzadas, esto ha dado lugar a nuevas implementaciones de diseños altamente codificados y de longitud variable sin limitaciones de carga-almacenamiento (es decir, no RISC). Esto rige las reimplementaciones de arquitecturas antiguas como la omnipresente x86 (véase más abajo), así como nuevos diseños para microcontroladores para sistemas embebidos y usos similares. La complejidad superescalar en el caso de la x86 moderna se resolvió convirtiendo las instrucciones en una o más microoperaciones y emitiendo dinámicamente dichas 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 relativamente sencillo después de los decodificadores (y búferes), que son bastante complejos, lo que ofrece, 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 de la arquitectura z .

Términos CISC y RISC

A mediados de la década de 1980, el consenso de la industria informática era que RISC era más eficiente que CISC. Digital Equipment Corporation estimó que RISC tenía una relación precio/rendimiento como máximo la mitad que CISC. Dos posibles respuestas de los proveedores de CISC fueron: [ 9 ]

  • Mejorar CISC tanto como sea posible hasta alcanzar los límites de la arquitectura actual. Elegido para mainframes IBM y x86 .

Intel logró mejorar x86 para igualar el rendimiento de RISC. [ 10 ] Los términos CISC y RISC se han vuelto menos significativos con la continua evolución de los diseños e implementaciones de CISC y RISC. Las primeras implementaciones de x86 altamente (o ajustadamente) segmentadas, los diseños 486 de Intel, AMD , Cyrix e IBM, admitían todas las instrucciones que sus predecesores admitían, pero alcanzaban la máxima eficiencia solo en un subconjunto de 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-almacenamiento de RISC ). [ 5 ] La generación Intel P5 Pentium fue una versión superescalar de estos principios. Sin embargo, los procesadores x86 modernos también (típicamente) decodifican y dividen las instrucciones en secuencias dinámicas de microoperaciones con búfer interno , 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 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 ni tienen instrucciones "complejas". [ 11 ] Dado que CISC se convirtió en un término genérico que abarca todo lo que no es una arquitectura de carga-almacenamiento (RISC), no es el número 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. [ 12 ] Comparada 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 bien podrían tener modos de direccionamiento más complejos que los pequeños procesadores CISC de 8 bits.

Un PDP-10 , un PDP-8 , un procesador x86, un Intel 4004 , un procesador Motorola serie 68000, un mainframe IBM Z , un Burroughs B5000 , un VAX , un Zilog Z80000 y un MOS Technology 6502 varían ampliamente en el número, tamaños y formatos de instrucciones, el número, 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 [ 13 ] porque tienen instrucciones de "carga-operación" que cargan y/o almacenan contenido de memoria dentro de las mismas instrucciones que realizan los cálculos reales. Por ejemplo, el PDP-8, que solo tiene 8 instrucciones de longitud fija y ningún microcódigo, es un CISC debido a cómo funcionan las instrucciones; el PowerPC, que tiene más de 230 instrucciones (más que algunos VAX), y varias implementaciones de las cuales tienen mecanismos internos complejos como el cambio de nombre de registros y un búfer de reordenamiento , es un RISC; mientras que el CISC mínimo tiene 8 instrucciones, pero es claramente un CISC porque combina el acceso a memoria y el cálculo en las mismas instrucciones. [ 14 ]

Véase también

Referencias

  1. Hennessy, John L.; Patterson, David A. (2012). Arquitectura de computadoras: un enfoque cuantitativo (5.ª  ed.). Morgan Kaufmann. págs. 14–16 . ISBN  978-0123838728.
  2. Patterson, DA ; Ditzel, DR (octubre de 1980). "Argumentos a favor 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 . 
  3. Tanenbaum, Andrew S. (2006). Organización estructurada de computadoras (5.ª ed.). Pearson. págs. 12–14 . ISBN   978-0131485211.
  4. Stallings, William (2013). Organización y arquitectura de computadoras (9.ª ed.). Pearson. págs. 48–50 . ISBN   978-0-13-2936330.
  5. 1 2 Smith, James E. (1988). "Un estudio de las arquitecturas de conjuntos de instrucciones". IEEE Computer . 21 (7): 8– 22. doi : 10.1109/2.46 .
  6. Kernighan, Brian W. (2017). Comprender el mundo digital . Princeton University Press. págs. 87–88 . ISBN  978-0691176543.
  7. "Historia de la informática: Arquitectura de hardware de la serie CDC 6000" . Museo de Waalsdorp . 23 de julio de 2023. Consultado el 19 de enero de 2024 .
  8. Anthony, Sebastian (10 de abril de 2012). "La historia de las supercomputadoras" . ExtremeTech . Consultado el 19 de enero de 2024 .
  9. Bell, Gordon ; Strecker, WD ¿Qué hemos aprendido del PDP-11? - ¿Qué hemos aprendido de VAX y Alpha? (PDF) (Informe) . Recuperado el 26 de junio de 2025 .
  10. "Ex-CEO de Apple lamenta haber descartado a Intel" . Forbes . 9 de octubre de 2003. Consultado el 28 de junio de 2025 .
  11. Null, Linda; Lobur, Julia (2014). Fundamentos de organización y arquitectura de computadoras (4.ª ed.). Jones & Bartlett. págs. 63–65 . ISBN   978-1284033144.
  12. Hennessy, John ; Patterson, David . Arquitectura de computadoras: un enfoque cuantitativo (PDF) . Archivado (PDF) del original el 14 de junio de 2023. Recuperado el 13 de junio de 2023 .
  13. Furber, Steve (1989). "El debate RISC–CISC". Computer . 22 (5). IEEE: 29– 37. doi : 10.1109/2.24143 .
  14. Jones, Douglas W. (1988-06-01). "Un CISC mínimo" . SIGARCH Comput. Archit. News . 16 (3): 56– 63. doi : 10.1145/48675.48684 . ISSN 0163-5964 . 

Referencias generales

  • Tanenbaum, Andrew S. (2006) Organización estructurada de computadoras, quinta edición , Pearson Education, Inc. Upper Saddle River, NJ.

Lecturas adicionales

  • Mano, M. Morris. Arquitectura de sistemas informáticos (3.ª  ed.). ISBN 978-0131755635.