Diferencia entre Micro-Operaciones en procesadores RISC y CISC

He leído que los procesadores Intel modernos usan las instrucciones CISC en la parte superior, que se convierten en instrucciones más simples similares a RISC en forma de microoperaciones en el back-end.

Entonces, si las microoperaciones de Intel son controles de nivel de hardware simples similares a RISC, entonces, ¿qué hacen las microoperaciones ARM?

Debido a que las instrucciones ARM ya son bastante similares a RISC, ¿cómo se vería su forma de microoperaciones?

+1 Esta pregunta tiene una respuesta fácil, obvia (y correcta), pero eso no la convierte en una mala pregunta o candidata para ser cerrada.
ARM tiene una unidad de control cableada.

Respuestas (3)

Todos los microprocesadores y, de hecho, todos los circuitos digitales síncronos funcionan en lo que se denomina un "nivel de transferencia de registro". Básicamente, todo lo que hace cualquier microprocesador es cargar valores en registros de diferentes fuentes. Esas fuentes pueden ser la memoria, otros registros o la ALU (Unidad Lógica Artimática, una calculadora dentro del procesador). Algunos de los registros son registros simples dentro del procesador, algunos registros pueden ser registros de funciones especiales que se encuentran alrededor de la CPU, en 'periféricos' como puertos de E/S, unidad de administración de memoria, unidad de interrupción, esto y aquello.

En este modelo, las 'Instrucciones' son secuencias básicas de transferencias de registros. Normalmente no tiene sentido darle al programador la capacidad de controlar cada transferencia de registro individualmente, porque no todas las posibles combinaciones de transferencia de registros son significativas, por lo que permitir que el programador las exprese todas sería un desperdicio en términos de consumo de memoria. Básicamente, cada procesador declara un conjunto de conjuntos de transferencias de registros que le permite al programador pedirle al procesador que haga, y estos se denominan 'Instrucciones'.

Por ejemplo, ADD A, B, C podría ser una operación en la que la suma de los registros A y B se coloca en el registro C. Internamente, serían tres transferencias de registro: cargar la entrada izquierda del sumador de A, cargar la entrada derecha del sumador de B, luego cargar C desde la salida del sumador. Además, el procesador realiza las transferencias necesarias para cargar el registro de dirección de memoria desde el contador de programa, cargar el registro de instrucción desde el bus de datos de memoria y, finalmente, cargar el contador de programa desde el incrementador de contador de programa.

El 8086 usó una tabla de búsqueda de ROM interna para ver qué transferencias de registro realizan cada instrucción. Los diseñadores de la CPU 8086 programaron libremente el contenido de esa ROM, por lo que eligieron secuencias de instrucciones que parecían útiles para el programador, en lugar de elegir secuencias que serían simples y rápidas de ejecutar por la máquina. Recuerde que en esos días la mayoría del software se escribía en lenguaje ensamblador, por lo que tenía sentido hacerlo lo más fácil posible para el programador. Posteriormente, Intel diseñó el 80286, en el que cometieron, lo que ahora parece, un error crítico. Les quedaba algo de memoria de microcódigo sin usar y pensaron que también podrían llenarlo con algo, y se les ocurrió un montón de instrucciones solo para llenar el microcódigo. Esto los mordió al final, ya que todas esas instrucciones adicionales debían ser respaldadas por el 386, 486,

ARM es un diseño de procesador mucho más nuevo que el 8086 y la gente de ARM tomó una ruta de diseño diferente. Para entonces, las computadoras eran comunes y había muchos compiladores disponibles. Entonces, en lugar de diseñar un conjunto de instrucciones que sea bueno para el programador, eligieron un conjunto de instrucciones que es rápido para que la máquina lo ejecute y eficiente para que el compilador genere código. Y por un tiempo, el X86 y ARM eran diferentes en la forma en que ejecutaban las instrucciones.

Luego pasa el tiempo y las CPU se vuelven cada vez más complejas. Y también los microprocesadores se diseñan usando computadoras y no lápiz y papel. Ya nadie usa microcódigo, todos los procesadores tienen una unidad de control de ejecución cableada (lógica pura). Todos tienen múltiples unidades de cálculo de enteros y múltiples buses de datos. Todos traducen sus instrucciones entrantes, las reprograman y las distribuyen entre las unidades de procesamiento. Incluso los antiguos conjuntos de instrucciones RISC se traducen en nuevos conjuntos de operaciones RISC. Entonces, la vieja pregunta de RISC versus CISC ya no existe. Volvemos de nuevo al nivel de transferencia de registros, los programadores piden a las CPU que realicen operaciones y las CPU las traducen en transferencias de registros. Y si esa traducción se realiza mediante una ROM de microcódigo o una lógica digital cableada, realmente ya no es tan interesante.

"Ya nadie usa microcódigos"... Yo uso un procesador x86 y recibo actualizaciones de microcódigos a menudo. Entonces creo que esa afirmación es falsa.
Shashank, sí, bueno, el mundo ha cambiado una vez más. Hoy en día hay tantos tipos diferentes de programabilidad (tejido FPGA, etc.), por lo que la declaración debe cambiarse a "Ya nadie usa ROM de microcódigo", lo que aún sería al menos algo cierto. Pero sí, la reprogramabilidad se está introduciendo cada vez más, especialmente en las unidades de traducción de códigos de operación. En ese sentido, los viejos tiempos están regresando. Alguien que crea en el tiempo circular debería estar feliz...

La idea de que "hay un RISC dentro del x86 moderno" es bastante engañosa. Tengo la impresión de que Intel lo dijo por primera vez como una estrategia de marketing cuando lanzaron el i486, que fue el primer x86 canalizado y podía ejecutar muchas instrucciones en 1 ciclo, como las CPU RISC contemporáneas.

El problema es que RISC y CISC se tratan de conjuntos de instrucciones (que son visibles para el programador de ensamblaje), no de microarquitectura interna. x86 se ha diseñado como microcodificado (8086), segmentado (80486), OoO con microoperaciones (PentiumPro), VLIW (Transmeta)...

Volviendo a la pregunta.

Las microoperaciones realmente no forman un conjunto de instrucciones, son más bien similares a las señales que atraviesan una tubería, seleccionando registros de lectura y escritura, operaciones ALU...

La mayoría de las instrucciones ARM se pueden ejecutar en un solo paso, mientras que muchas instrucciones x86 deben descifrarse en una secuencia de 2 o más microoperaciones, pero hay poca diferencia.

En las CPU OoO, partes de esta información se almacenan en FIFO y búferes como colas de reserva, búfer de reordenación... Estas partes de las instrucciones son bastante similares en principio entre ARM y x86, pero no hay un "RISC interno".

La idea de la implementación de RISC dentro de CISC comenzó con micro-ops. Creo que todavía tengo el folleto en algún lugar almacenado. Se refiere a la arquitectura de microoperaciones: los diseñadores de CPU son libres de diseñar una CPU RISC rápida y luego agregar un traductor (Intel lo llamó la etapa "crack") para convertir las instrucciones CISC en un conjunto equivalente de instrucciones RISC para la CPU central para ejecutar.

¡¡Los ARM no usan microoperaciones!!

ARM usa microoperaciones. Lo que no usa es microcódigo. Una unidad de control cableada no tiene microcódigo, pero eso no excluye la posibilidad de microoperaciones. En ARM, las instrucciones se decodifican en microoperaciones mediante un control cableado.
@Kraken: Si bien existe la posibilidad, dudo mucho que cualquier variante de ARM use microoperaciones. Esto se debe a que cada instrucción ARM ya es una microoperación. En cambio, lo que tienen algunos chips ARM es lo opuesto a las microoperaciones: las instrucciones del pulgar se EXPANDEN en una instrucción ordinaria equivalente. La decodificación de instrucciones en señales es solo eso: decodificación. En esa etapa ya no es una "operación", son solo señales. Algunas CPU bloquean las señales decodificadas en un registro intermedio (el Elbrus soviético, por ejemplo), pero esa señal decodificada se parece más a una instrucción VLIW que a una microoperación.
@slebetman Eso tiene sentido, por supuesto. Pero hace un tiempo estaba leyendo este documento sobre un procesador de corteza que tiene microoperaciones para funcionalidades complejas. Por eso hice esta pregunta. Puede ser que estén usando el término para referirse a otra cosa...
@Kraken: En casos como ese, en realidad son microoperaciones. Lo siento, no estaba al tanto de eso. Lo que sucede es que algunas funcionalidades como la raíz cuadrada no se implementan directamente en el hardware para ahorrar espacio. En cambio, las instrucciones activan trampas/interrupciones. A partir de ahí, el diseñador tiene dos opciones: insertar una serie de instrucciones que calcularán el resultado deseado en el flujo de instrucciones (microoperaciones) o simplemente documentar la trampa y dejar que los programadores del sistema operativo/escritores de compiladores implementen la función en el software ( emulación).