2.5 Filosofías CISC y RISC
El diseño del repertorio de instrucciones es una decisión estratégica clave en la arquitectura de procesadores, ya que determina no solo el rendimiento del sistema, sino también la complejidad del hardware y del software, en particular del compilador. Dos de las filosofías más influyentes en este campo son CISC (Complex Instruction Set Computing) y RISC (Reduced Instruction Set Computing). Mientras que CISC prioriza la reducción del número de instrucciones necesarias para realizar tareas complejas mediante operaciones multifuncionales, RISC simplifica el conjunto de instrucciones con el objetivo de maximizar la velocidad y la eficiencia energética. En esta sección se analizan ambos enfoques y sus implicaciones en el diseño de procesadores (John L. Hennessy and Patterson 2017a; Patterson et al. 2014).
El debate entre las filosofías CISC y RISC se remonta a fines de la década de 1970, cuando se comenzaron a cuestionar los beneficios reales de los repertorios de instrucciones complejos. Mientras las primeras generaciones de computadoras buscaban reducir el número de instrucciones por programa, investigaciones posteriores demostraron que un conjunto reducido y eficiente de instrucciones podía mejorar significativamente el rendimiento al simplificar la ejecución y optimizar el uso del hardware.
La evolución de los procesadores ha llevado a un enfoque más equilibrado, donde las arquitecturas modernas combinan elementos de ambas filosofías. Las arquitecturas modernas tienden a incorporar elementos de ambas filosofías. Por ejemplo, x86 adopta técnicas de ejecución interna propias de RISC para aumentar su rendimiento, mientras que procesadores RISC como ARM han introducido extensiones complejas para tareas específicas, acercándose parcialmente al enfoque CISC (John L. Hennessy and Patterson 2017a; Patterson et al. 2014).
2.5.1 CISC
Las arquitecturas CISC, como la x86, se caracterizan por su enfoque en reducir el número de instrucciones requeridas para completar operaciones complejas. Esto se logra mediante la inclusión de instrucciones que combinan múltiples operaciones en un solo ciclo. Como resultado, los programadores necesitan escribir menos líneas de código para alcanzar un objetivo específico.
Sin embargo, este diseño implica ciertas desventajas. La decodificación y ejecución de instrucciones CISC requiere un hardware considerablemente más complejo, y las instrucciones de longitud variable, típicas de estas arquitecturas, pueden aumentar el tiempo de decodificación. Esto genera cuellos de botella en el pipeline y limita el rendimiento.
Un ejemplo representativo es la arquitectura x86, que ha incorporado técnicas internas de ejecución similares a RISC —como la descomposición de instrucciones mediante microcódigo— con el fin de mejorar el rendimiento sin abandonar su repertorio complejo. Utiliza microcódigo para descomponer las instrucciones complejas en operaciones más simples, parecidas a las de un procesador RISC. Aunque esta estrategia mejora la eficiencia de ejecución en algunos casos, el diseño sigue siendo más costoso en términos de consumo energético y complejidad (Patterson et al. 2014).
En consecuencia, el diseño del repertorio de instrucciones —incluyendo operaciones, modos de direccionamiento y formatos— constituye la interfaz crítica entre hardware y software, afectando tanto la eficiencia de ejecución como la expresividad de los programas. Su diseño influye directamente en la eficiencia del procesamiento y en la forma en que los programas interactúan con la arquitectura subyacente, lo que refuerza su relevancia en el estudio de la arquitectura de computadoras.
2.5.2 RISC
Las arquitecturas basadas en RISC, en contraste con CISC, se caracterizan por emplear instrucciones simples y de longitud fija. Esta simplificación facilita la decodificación y permite que muchas instrucciones se ejecuten en un solo ciclo de reloj. Además, esta filosofía favorece la implementación de técnicas avanzadas como el pipelining y la predicción de ramas, optimizando así el rendimiento.
A nivel de hardware, RISC prioriza la eficiencia energética, una característica crucial en dispositivos móviles y sistemas embebidos. Por ello, procesadores como los basados en ARM han dominado estos mercados, especialmente en dispositivos móviles, debido a su bajo consumo energético. La simplicidad y el bajo CPI (ciclos por instrucción) han sido factores determinantes en su adopción (John L. Hennessy and Patterson 2017b).
2.5.3 Comparativa entre CISC y RISC
Las diferencias entre CISC y RISC son evidentes tanto a nivel de diseño como de implementación. En las arquitecturas RISC, las instrucciones tienen una longitud fija, lo que simplifica la decodificación, reduce la latencia y mejora la predictibilidad del rendimiento. Además, este formato mejora la eficiencia del uso de la memoria caché, al ocupar menos espacio y facilitar accesos más rápidos.
En cambio, las arquitecturas CISC, como x86, emplean instrucciones de longitud variable, lo que les permite ofrecer una mayor flexibilidad y un repertorio más amplio de operaciones. Sin embargo, esta flexibilidad conlleva un mayor tiempo de decodificación y una complejidad adicional en la implementación del pipeline. Esto puede causar problemas como interrupciones en el flujo debido a errores de predicción de ramas, aunque se mitiguen mediante técnicas avanzadas como la predicción dinámica de saltos y el prefetching (Tanenbaum 2016).
Por ejemplo, en RISC, los modos de direccionamiento son simples y permiten un acceso más rápido a los operandos, reduciendo la latencia en el pipeline (Stallings 2021). En CISC, los modos de direccionamiento más complejos proporcionan flexibilidad a costa de una mayor latencia, lo que impacta negativamente en el rendimiento general del sistema.
2.5.3.1 Ejemplos de instrucciones
Para contrastar los enfoques RISC (RISC‑V) y CISC (x86) se resuelve la misma tarea: leer dos palabras desde memoria, sumarlas y escribir el resultado en la primera dirección.
Ejemplo RISC‑V (longitud fija; modelo load/store con registro base y desplazamiento).
RISC‑V emplea instrucciones simples y de longitud fija. La carga y el almacenamiento se realizan con lw y sw, respectivamente, y la suma con add. La dirección de una etiqueta se obtiene con la (pseudo‑instrucción).
.data
mem1: .word 5
mem2: .word 7
.text
.globl _start
_start:
# Cargar dirección de mem1 y leer su contenido
la t0, mem1 # t0 <- &mem1
lw t1, 0(t0) # t1 <- MEM[mem1]
# Cargar dirección de mem2 y leer su contenido
la t2, mem2 # t2 <- &mem2
lw t3, 0(t2) # t3 <- MEM[mem2]
# Sumar
add t4, t1, t3 # t4 <- t1 + t3
# Guardar resultado en mem1
sw t4, 0(t0) # MEM[mem1] <- t4
Notas (RISC‑V):
lacarga en un registro la dirección de una etiqueta (no el dato) y el ensamblador la expande en 1–2 instrucciones reales (p. ej.,auipc+addi).lw/swusan el formatolw rd, offset(rs1). Ej.:lw t1, 0(t0)lee MEM[t0+0];sw t4, 0(t0)escribe en esa dirección.
Ejemplo x86 (longitud variable; ALU con operando en memoria).
section .data
mem1: dd 5
mem2: dd 7
section .text
global _start
_start:
; Cargar mem1 en EAX
MOV EAX, [mem1]
; Sumar mem2 a EAX (operando de memoria permitido)
ADD EAX, [mem2]
; Guardar el resultado en mem1
MOV [mem1], EAX
Notas (x86):
x86 permite operaciones ALU con un operando en memoria (reg–mem), a diferencia del paradigma load/store de RISC‑V.
Las instrucciones son de longitud variable (1–15 bytes), lo que incrementa la complejidad de decodificación.
La Tabla 2.5 presenta una síntesis comparativa de las diferencias estructurales y operativas entre las filosofías CISC y RISC, resaltando sus implicancias en el diseño del hardware y el impacto sobre el rendimiento global del sistema.
| Aspecto | CISC | RISC |
|---|---|---|
| Objetivo principal | Minimizar el número de instrucciones para operaciones complejas | Simplificar el conjunto de instrucciones para optimizar velocidad y eficiencia energética |
| Tipo de instrucciones | Instrucciones complejas, longitud variable | Instrucciones simples, longitud fija |
| Decodificación y ejecución | Requiere hardware más complejo, posibles cuellos de botella en el pipeline | Decodificación más sencilla, facilita el uso de técnicas avanzadas como pipelining |
| Longitud de instrucciones | Longitud variable, puede aumentar el tiempo de decodificación | Longitud fija, simplifica la decodificación y mejora la predictibilidad del rendimiento |
| Eficiencia energética | Menor eficiencia energética en comparación con RISC | Mayor eficiencia energética, especialmente en dispositivos móviles |
| Modos de direccionamiento | Flexibilidad a costa de mayor latencia | Acceso más rápido a los operandos, menor latencia |
2.5.3.2 Convergencia de filosofías
A pesar de sus diferencias, las arquitecturas modernas tienden a integrar características de ambas filosofías. Por ejemplo, los procesadores x86 adoptan técnicas propias de RISC para mejorar la eficiencia energética y el rendimiento. Esta convergencia refleja cómo los avances en diseño de procesadores buscan combinar lo mejor de cada enfoque, maximizando la flexibilidad y la eficiencia para adaptarse a las necesidades actuales y futuras del mercado.
La Figura 2.7 ilustra de manera conceptual la convergencia entre las filosofías CISC y RISC en el diseño de procesadores modernos. Este esquema destaca cómo la integración de ambos enfoques permite alcanzar un rendimiento optimizado, combinando la flexibilidad y expresividad de CISC con la eficiencia y simplicidad de RISC. La representación gráfica facilita la comprensión de las tendencias actuales en arquitectura, donde la complementariedad de ambos paradigmas resulta clave para satisfacer las demandas de desempeño y eficiencia energética.
Figura 2.7: Convergencia de filosofías
En síntesis, las filosofías CISC y RISC representan enfoques contrastantes pero complementarios en el diseño de arquitecturas de procesadores. Su comprensión no solo es esencial para analizar el rendimiento y la eficiencia energética de los sistemas modernos, sino también para formar una base sólida en la enseñanza de arquitectura de computadoras, especialmente en contextos donde se emplean simuladores didácticos.