stringtranslate.com

Equipo conjunto de instrucciones complejas

Una computadora con conjunto de instrucciones complejas ( 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 almacén de memoria) o son capaces de operaciones de varios pasos o modos de direccionamiento dentro de instrucciones únicas. [ cita necesaria ] El término se acuñó 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 necesaria ] donde la característica diferenciadora típica [ dudosa ] es que la mayoría de los diseños RISC utilizan una longitud de instrucción uniforme para casi todas las instrucciones y emplean instrucciones de carga y almacenamiento estrictamente separadas.

Los ejemplos de arquitecturas CISC incluyen computadoras centrales complejas hasta microcontroladores simplistas donde las operaciones de carga y almacenamiento de memoria no están separadas de las instrucciones aritméticas. [ cita necesaria ] Las arquitecturas de conjuntos de instrucciones específicas que se han etiquetado retroactivamente como CISC son System/360 hasta 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 necesaria ] incluyen las familias Motorola 6800 , 6809 y 68000 ; la familia Intel 8080 , iAPX 432 y x86 ; las familias Zilog Z80 , Z8 y Z8000 ; la familia National Semiconductor NS320xx ; la familia MOS Technology 6502 ; la familia Intel 8051 ; y otros.

Algunos escritores han considerado algunos diseños como casos límite. [ ¿OMS? ] 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 informáticos intentaron salvar la llamada 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 estructurar los datos. y los accesos a matrices se combinarán 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 programas de menor tamaño 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 enorme ahorro en el costo de la memoria de la computadora y el almacenamiento en disco, ya que 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 necesaria ]

Nuevas instrucciones

En la década de 1970, el análisis de lenguajes de alto nivel indicó que los compiladores producían algún lenguaje de máquina complejo correspondiente. Se determinó que nuevas instrucciones podrían mejorar el rendimiento. Se agregaron algunas instrucciones que nunca debieron usarse en lenguaje ensamblador pero que encajan bien con lenguajes compilados de alto nivel. 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 son necesarios 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 costo menor y también permitieron expresar construcciones de lenguaje de alto nivel mediante menos instrucciones, se observó que no siempre era así. Por ejemplo, las versiones de gama baja de arquitecturas complejas (es decir, que utilizan menos hardware) podrían conducir 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 utilizar una secuencia de instrucciones más simples. instrucciones.

Una razón para esto fue que los arquitectos ( escritores de microcódigos ) a veces "sobrediseñaban" instrucciones en lenguaje ensamblador, incluidas características que no podían implementarse de manera eficiente en el hardware básico disponible. Podría haber, por ejemplo, "efectos secundarios" (por encima de las banderas convencionales), como la configuración de un registro o ubicación de memoria que quizás rara vez se usaba; si esto se hiciera a través de buses internos ordinarios (no duplicados), o incluso el bus externo, exigirí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 (relativamente) de alto nivel podrían resultar complicadas de decodificar y ejecutar de manera eficiente dentro de un presupuesto limitado de transistores. Por lo tanto, dichas arquitecturas requirieron una gran cantidad de trabajo por parte del diseñador del procesador en los casos en que una solución más simple, pero (típicamente) más lenta, basada en tablas de decodificación y/o secuenciación de microcódigos no es apropiada. 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 de rendimiento.

La idea RISC

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

Uno de los primeros procesadores con etiqueta RISC (retroactivamente) ( IBM 801  - Centro de investigación Watson de IBM , mediados de la década de 1970) era una máquina simple estrechamente estructurada originalmente destinada a ser utilizada como un núcleo o motor de microcódigo interno en diseños CISC, [ cita necesitaba ] pero también se convirtió en el procesador que introdujo la idea RISC a una audiencia algo mayor. La simplicidad y la regularidad también en el conjunto de instrucciones visibles facilitarían la implementación de etapas de procesador superpuestas ( canalización ) a nivel de código de máquina (es decir, el nivel visto por los compiladores). Sin embargo, la canalizació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 la implementación dentro del número limitado de componentes y la complejidad del cableado factibles en ese momento). La ejecución interna del microcódigo en los procesadores CISC, por otro lado, podría ser 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 , entregada por primera vez en 1965, también ha sido descrita retroactivamente como RISC. [2] [3] Tenía una arquitectura de almacenamiento de carga que permitía que hasta cinco cargas y dos almacenes estuvieran en progreso simultáneamente bajo el control del programador. También tenía múltiples unidades funcionales que podían funcionar al mismo tiempo.

superescalar

En un contexto más moderno, la codificación compleja 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 superescalar fuera de orden Cyrix 6x86 son ejemplos bien conocidos de esto. Los frecuentes accesos a la memoria para 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; Actualmente, sólo las memorias caché de gran tamaño y alta velocidad están limitadas por el número máximo de transistores. Aunque es complejo, el número de transistores de los decodificadores CISC no crece exponencialmente como el número total de transistores por procesador (la mayoría se utiliza normalmente 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 almacenamiento de carga (es decir, no RISC). Esto rige las reimplementaciones de arquitecturas más antiguas, como la omnipresente x86 (ver más abajo), así como 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 dinámica e indirecta; el Pentium Pro y el AMD K5 son los primeros ejemplos de esto. Permite ubicar un diseño superescalar bastante simple después de los decodificadores (y buffers) (bastante complejos), brindando, por así decirlo, lo mejor de ambos mundos en muchos aspectos. Esta técnica también se utiliza en microprocesadores IBM z196 y posteriores z/Architecture .

Términos CISC y RISC

Los términos CISC y RISC se han vuelto menos significativos con la evolución continua de los diseños e implementaciones de CISC y RISC. Las primeras implementaciones x86 altamente (o estrictamente) canalizadas, los diseños 486 de Intel , AMD , Cyrix e IBM , admitían todas las instrucciones que sus predecesores, pero lograron la máxima eficiencia sólo 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 necesaria ] 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 , lo que ayuda a ejecutar un subconjunto más grande de instrucciones en forma canalizada (superpuesta) y facilita una extracción más avanzada de paralelismo del código. streaming, 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 necesaria ] 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 esa aritmética. Las instrucciones también realizan accesos a la memoria. [ cita necesaria ] [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 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 subcadenas, aritmética BCD de precisión arbitraria o funciones trascendentales , mientras que otros solo tienen sumas y restas 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 la memoria dentro de las mismas instrucciones que realizan los cálculos reales. Por ejemplo, el PDP-8, que tiene sólo 8 instrucciones de longitud fija y ningún microcódigo, es un CISC debido a cómo funcionan las instrucciones, PowerPC, que tiene más de 230 instrucciones (más que algunos VAX) y componentes internos complejos como el registro. cambio de nombre y un búfer de reordenamiento, es un RISC, mientras que Minimal CISC tiene 8 instrucciones, pero es claramente un CISC porque combina acceso a memoria y cálculo en las mismas instrucciones.

Ver también

Referencias

  1. ^ Patterson, DA ; Ditzel, DR (octubre de 1980). "El caso de la computadora con conjunto de instrucciones reducido". Noticias de arquitectura informática SIGARCH . 8 (6). MCA : 25–33. doi :10.1145/641914.641917. S2CID  12034303.
  2. ^ "Historia de la computadora: arquitectura de hardware de la serie CDC 6000". Museo Waalsdorp . 23 de julio de 2023 . Consultado el 19 de enero de 2024 .
  3. ^ Anthony, Sebastián (10 de abril de 2012). "La historia de las supercomputadoras". Tecnología extrema . Consultado el 19 de enero de 2024 .
  4. ^ Hennessy, Juan ; Patterson, David . Arquitectura informática: un enfoque cuantitativo (PDF) . Archivado (PDF) desde el original el 14 de junio de 2023 . Consultado el 13 de junio de 2023 .

Referencias generales

Otras lecturas