Se han hecho muchas comparativas entre las arquitecturas de procesadores RISC vs CISC, pero ahora introducimos un nuevo contrincante menos conocido. Así que, en este artículo verás las diferencias y ventajas en esta nueva comparativa RISC vs EPIC vs CISC, además de comprender bien las diferencias.
Índice de contenidos
¿Qué es una arquitectura CISC?
La arquitectura CISC (Complex Instruction Set Computer) es un paradigma de diseño de microprocesadores que se caracteriza por un conjunto de instrucciones muy amplio y con longitudes variables, pero generalmente largas. Cada instrucción puede realizar múltiples operaciones, lo que permite ejecutar tareas complejas con un número reducido de instrucciones. Además, también suele implicar el uso de un conjunto de registros más reducido (y generalmente más específico) y de más tipos de modos de direccionamiento.
Las instrucciones CISC que se pueden encontrar en una ISA de este tipo son bastante variadas, como pueden ser las aritméticas, las lógicas, las de control de flujo, acceso a memoria, etc. Cuando un programa se compila, se traduce el código fuente a una lista de instrucciones que la CPU debe ejecutar para hacer funcionar al programa. Al ser más complejas, un programa necesitará menos de estas CISC para ejecutarse.
Sin embargo, a nivel de hardware, esto implica que las instrucciones necesitarán más tiempo para ejecutarse, es decir, más ciclos de reloj. Por otro lado, este tipo de procesadores también tiene microcódigo en su unidad de control, que es básicamente una ROM con una serie de operaciones de control en las que se traducen estas instrucciones. Por ejemplo, una instrucción ADD o de suma, generará las órdenes necesarias para que la ALU sume los números requeridos por el programa…
Se puede decir que la CISC es una arquitectura más orientada al software, para facilitar la programación, generando códigos con menos número de operaciones, ya que en pocas instrucciones complejas se puede hacer lo mismo que con una mayor cantidad de instrucciones simples.
Por otro lado, también es importante destacar que los procesadores CISC suelen tener retrocompatibilidad, es decir, compatibilidad hacia atrás, para poder ejecutar software antiguo. Este es el caso de los x86, que siguen manteniendo instrucciones y modos más antiguos para ejecutar software de 32-bit y de 16-bit, mientras el modo nativo de los actuales es de 64-bit. Es por eso que nos podemos encontrar con procesadores antiguos con un microcódigo muy extenso y complejo, y repertorios de instrucciones de miles en esta ISA.
Esto no solo hace más grande la unidad de control de la CPU, también complica el diseño e implementación del procesador para manejar todo ese tipo de instrucciones tan heterogéneas, así como sus modos de direccionamiento. Y, esto también repercute finalmente en un desempeño variable según las instrucciones utilizadas, por lo que variará en forma de carga de trabajo.
Por último, entre los ejemplos de arquitecturas CISC tenemos IA-32 (x86), Motorola 68k, Zilog Z80, IBM System/360, IBM z/Architecture, DEC VAX, etc.
También te puede interesar conocer qué es una arquitectura
¿Qué es una arquitectura RISC?
La arquitectura RISC (Reduced Instruction Set Computer) representa un paradigma de diseño de microprocesadores que contrasta marcadamente con la arquitectura CISC. A diferencia de CISC, que busca ofrecer un conjunto de instrucciones amplio y complejo, RISC se enfoca en un conjunto de instrucciones reducido, más homogéneo, optimizado y de ejecución rápida. Además, cuenta con un conjunto de registros mayor (de uso más genérico) y los modos de direccionamiento se simplifican (generalmente direccionamiento directo y direccionamiento basado en registros).
Al ser las instrucciones más simples y homogéneas, se pueden ejecutar en un número de ciclos de reloj bajo (normalmente 1 instrucción por ciclo), y no habrá tanta diferencia dependiendo del tipo de instrucción empleada. Sin embargo, a nivel de software, el código traducido necesitará más cantidad de operaciones RISC para hacer una misma tarea en comparación con CISC. Es decir, se complica la cosa para el compilador, pero se simplifica del lado del hardware, permitiendo microarquitecturas más sencillas y fáciles de mejorar.
Por otro lado, es importante destacar otro detalle de RISC, y es que al tener mayor número de registros y hacer un uso más frecuente de ellos, reduce el tráfico hacia o desde la memoria principal, acelerando las operaciones. Mientras que en un CISC se necesitarán más accesos a la RAM, lo que podría generar cuellos de botella si la velocidad y el ancho de banda de la memoria no son adecuados.
También se separan las instrucciones de carga y almacenamiento (Load/Store o L/S). Al usar instrucciones específicas para cada una de ellas, se facilita la optimización del pipeline del procesador. Incluso puede dar como resultado a unidades funcionales más simples, lo que facilita el diseño, verificación y modificación. Por ejemplo, en estos casos no se necesita una unidad de control pesada, grande y con una gran ROM, y en algunos casos incluso se puede implementar mediante una unidad de control cableada, sin necesidad de ROM, lo que acelera el rendimiento.
Para finalizar, decir que algunas ISA de tipo RISC que se pueden tomar de ejemplo son RISC-V, Arm (y derivados como Apple Silicon), MIPS, IBM POWER, SPARC, DEC Alpha, AMD 29k, etc.
Te recomiendo leer nuestra guía con los mejores procesadores del mercado
RISC-like y actualidad
Los procesadores x86 modernos, de Intel y AMD, a pesar de tener una ISA (Conjunto de Instrucciones) CISC, operen de manera similar a los RISC a nivel interno. Este fenómeno se conoce como «RISC-like» o «RISC en el núcleo». Intel implementó este diseño en su Pentium Pro por primera vez, y AMD lo hizo en su K5. En el caso de AMD, como ya tenían un gran procesador RISC, como fue el 29000 o 29k, usaron este diseño como base para el núcleo del K5, al que agregaron un motor de traducción en el front-end para traducir las CISC en microoperaciones más sencillas estilo RISC. Esto le permitía obtener lo mejor de ambos mundos, consiguiendo las ventajas del CISC a nivel de software y las ventajas del RISC a nivel de hardware, aunque también supone una penalización al tener que traducir en comparación con un RISC nativo…
Es decir, todos los procesadores a partir de esos dos modelos implementan una capa interna que traduce estas instrucciones en una secuencia de operaciones más simples, llamadas microoperaciones o μops. Estas μops son similares a las instrucciones de un procesador RISC y son ejecutadas por una unidad de ejecución más optimizada y que lleva a cabo las siguientes etapas:
- Decodificación: cuando una instrucción x86 llega al procesador, se decodifica y se descompone en una o varias μops gracias al microcódigo.
- Renombramiento de registros: los registros físicos del procesador se asignan a los registros virtuales de la instrucción para evitar dependencias y permitir un mayor paralelismo.
- Dispatch: estas microops se colocan en una cola de despacho y se envían a las unidades de ejecución disponibles.
- Ejecución: las unidades de ejecución realizan las operaciones especificadas por las μops.
- Commit: los resultados se escriben en los registros o en la memoria.
De esta forma se consigue una simplificación del hardware para hacer más fácil el aumento de rendimiento mediante la mejora de la microarquitectura y de la frecuencia de reloj, así como conseguir mayor grado de paralelismo y más eficiencia. Por otro lado, se mantiene la compatibilidad con el software existente, ya que se hace la traducción a nivel de hardware, sin necesidad de modificar los códigos o compiladores.
He empleado la x86 para describir lo que es un RISC-like, pero ciertamente la mayoría de CPUs modernas, incluso si tienen un conjunto de instrucciones RISC, también funcionan de esta forma. Ejemplos son las microarquitecturas Arm, cuya ISA también ha incluido extensiones con instrucciones más largas, y por tanto que también deben traducirse a microoperaciones. Es decir, las microarquitecturas actuales han convergido y son bastante similares unas a otras… Por ejemplo:
¿Qué es EPIC?
EPIC (Explicitly Parallel Instruction Computing) es otro tipo de arquitectura de procesadores diseñado para explotar eficientemente el paralelismo a nivel de instrucción (ILP) en los programas. En lugar de depender de complejos circuitos internos para identificar y ejecutar instrucciones en paralelo, EPIC confía en el compilador para proporcionar información explícita sobre las dependencias entre las instrucciones. Esto fue el fruto de la colaboración entre HP e Intel, una vez que HP descontinuó sus procesadores PA-RISC, se unió a un equipo de Intel para diseñar el sucesor para sus grandes máquinas: el Itanium.
Intel había desarrollado la ISA IA-64 para este procesador, con características de EPIC. Es decir, similar a RISC, ya que utiliza un conjunto de instrucciones simple y regular para facilitar la predicción de dependencias. A diferencia de un RISC puro, el compilador deberá proporcionar información a la CPU sobre las instrucciones que puede ejecutar en paralelo. También se fundamenta en la ejecución especulativa de instrucciones, aunque con sus riesgos. Incluso admite escalar a mayor cantidad de núcleos de procesamiento sin aumentar la complejidad de forma significativa, lo cual es positivo.
Pero no todo son ventajas, el compilador debe ser altamente sofisticado para identificar y expresar adecuadamente el paralelismo en el código. La generación de código EPIC puede ser más lenta que la generación de código para arquitecturas tradicionales.
Bien, una vez dicho esto, realmente EPIC no es un paradigma como RISC o CISC, sino que es una interpretación de lo que conocemos como VLIW (Very Long Instruction Word). Esta arquitectura, como sabrás, se caracteriza por usar instrucciones muy largas que especifican múltiples operaciones a realizar en paralelo. Será el compilador el encargado de empaquetar dichas operaciones en una sola instrucción de tal manera que encaje con el socket de ejecución.
Es decir, imagina que un procesador tiene dos unidades de suma, y una de multiplicación. El compilador deberá encajar dos operaciones de suma y una de multiplicación en la misma instrucción, aprovechando así todas las unidades funcionales disponibles. En cambio, esto no siempre es posible, lo que puede dejar unidades funcionales sin trabajar en algunas instrucciones.
Estos problemas del Itanium, además de ser IA-64 incompatible con el software x86-64, y por su rendimiento no tan elevado en comparación con la competencia, hizo que el Itanium finalmente se descontinuase…
RISC vs EPIC vs CISC: ventajas y desventajas
Para finalizar, vamos a ver la comparativa entre las tres arquitecturas RISC vs EPIC vs CISC para llegar a las conclusiones:
- RISC (Reduced Instruction Set Computer):
- Ventajas: al tener un conjunto de instrucciones simple y homogéneo, además de limitaciones en los modos de direccionamiento, los procesadores RISC son más rápidos, eficientes y fáciles de mejorar a nivel de hardware. Tampoco complican mucho el lado del compilador, una ventaja sobre EPIC, aunque el código necesitará más instrucciones en comparación con CISC.
- Desventajas: se necesitarán más instrucciones en comparación con EPIC y CISC, pero al ser más simples, se pueden encajar mejor en las unidades de ejecución para no dejar desocupadas como ocurre en el EPIC/VLIW.
- EPIC (Explicitly Parallel Instruction Computing):
- Ventajas: puede llegar a tener un alto rendimiento a nivel de paralelismo de operaciones ejecutadas simultáneamente, además de permitir mayor flexibilidad que un VLIW convencional, y toma algunas ventajas de RISC en cuanto a simplicidad del hardware.
- Desventajas: agrega una complejidad muy elevada al compilador, y no siempre es posible encajar operaciones sin dependencias que permitan llenar todo el ancho de ejecución que tiene el procesador, por lo que es posible que en algunas instrucciones no se mantengan todas las unidades de ejecución ocupadas, lo que significa menor eficiencia. Dependiendo de la carga del trabajo y del compilador, el rendimiento del EPIC puede variar bastante, mientras que RISC y CISC no se ven tan afectados en este sentido.
- CISC (Complex Instruction Set Computer):
- Ventajas: en el lado del compilador y el software se facilitan las cosas, con un código de mayor densidad, es decir, se permite con menos instrucciones hacer lo que el programa debe hacer en comparación con RISC. Sin embargo, en este sentido se parece bastante a EPIC/VLIW, con instrucciones largas y complejas.
- Desventajas: al aumentar la complejidad de instrucciones dificulta también la mejora de las pipelines, lo que puede limitar el rendimiento en comparación con RISC. También suele tener un diseño complejo a nivel de hardware si se compara con los otros dos, y consume más energía.
¿Ganador? Pues la verdad es que la mejor opción actualmente parecen los híbridos o RISC-like, con instrucciones complejas que generan código binario de mayor densidad, y funcionando a nivel de hardware como un RISC, más simple, rápido y eficiente.
No olvides dejar tus comentarios con dudas y sugerencias…