¿Por qué los compiladores tienen que ser "más inteligentes" para la arquitectura del conjunto de instrucciones RISC?

¿Por qué los compiladores tienen que ser "más inteligentes" para la arquitectura del conjunto de instrucciones RISC?

La arquitectura de conjunto de instrucciones reducidas (RISC) tiene como objetivo reducir la cantidad de instrucciones, mejorando así el rendimiento. El único inconveniente de este enfoque es que los compiladores tienen que ser "más inteligentes".

¿Qué quiere decir mi profesora cuando dijo que "los compiladores tienen que ser más inteligentes" y por qué es así?

Respuesta1

RISC, cuando se dice honestamente, significa "Complejidad reducida del conjunto de instrucciones": la cantidad de instrucciones no se reduce necesariamente, pero cada instrucción es más simple, en términos de los ciclos de máquina necesarios para ejecutarla y en términos de la cantidad de puertas ( o almacén de microcódigos) dedicado a implementarlo.

La teoría (que se cumple al menos parcialmente) es que al reducir la cantidad de lógica de control, hay más espacio en el chip disponible para los registros y la ruta de datos. Por lo tanto, las máquinas RISC suelen tener entre 2 y 4 veces más registros que sus homólogas CISC.

Esto deja al compilador hacer el trabajo de esa lógica de control omitida, incluida la "programación" de operaciones (secuenciarlas) para que, por ejemplo, no hagas dos adiciones consecutivas, sino una adición, luego un desplazamiento (y sucesivamente). diferentes registros) para que tanto el sumador como la palanca de cambios se utilicen de manera óptima. Y el compilador también debe gestionar el conjunto de registros, para optimizar el movimiento de entrada y salida de registros, minimizando los accesos al almacenamiento. Además, el compilador debe saber cómo utilizar mejor las instrucciones extrañas (como "desplazar a la izquierda y enmascarar con literal"), ya que generalmente tienen algún escenario (quizás extraño) en el que son relativamente poderosas.

Como resultado, las instrucciones generadas por un buen compilador RISC son prácticamente imposibles de descifrar. Incluso si conoce bien el conjunto de instrucciones, descubrir que algún valor de hace media hora todavía está en el registro 12 es, en el mejor de los casos, difícil, incluso si no fuera por las complicadas operaciones de cambio y máscara que ocurren todo el tiempo.

(Para aquellos que aparentemente no creen que sé de lo que estoy hablando, estuve involucrado por primera vez en RISC con el IBM 801, a principios de los años 70, y me puse por mi nombre con George Radin y Marty Hopkins. .)

Respuesta2

Dado que hay menos instrucciones en una CPU RISC, hay menos posibilidades de que una sola declaración de alto nivel se traduzca bien a un único código de operación en lenguaje de máquina.

Un sinónimo de CPU RISC es "arquitectura de almacenamiento de carga". Básicamente, significa que las instrucciones RISC que realmente funcionan generalmente solo funcionan en registros. Si desea trabajar con valores almacenados en la RAM, debe emitir instrucciones LOAD explícitas, mientras que las CPU CISC como x86 tienen instrucciones que lo hacen automáticamente. Históricamente, las CPU RISC han tenido más registros que x86, y un buen código administrará bien los registros disponibles para evitar accesos innecesarios a la memoria, lo que significa que un compilador debe tener eso en cuenta.

Otra cosa es que las CPU RISC normalmente sólo proporcionan la "infraestructura" mínima necesaria para la vinculación.

Por ejemplo, las CPU x86 tienen la noción de una "pila", donde puede insertar valores y luego "sacarlos" (hay PUSHinstrucciones POP). También hay una CALLinstrucción: empujará el puntero de la instrucción actual en la pila y luego saltará a la dirección de destino, generalmente una subrutina o función. RETLuego se puede emitir una instrucción para quitar el puntero de instrucción guardado y reanudar desde la función original. Anidar subrutinas es conveniente y puede usar PUSHy POPponer parámetros para las subrutinas fácilmente.

En un MIPS, por ejemplo, todo lo que tiene es jal"Saltar y vincular": coloca el puntero de instrucción actual en un registro y luego salta a esa dirección. Si desea hacer algo como una pila o la CALLinstrucción x86, debe hacerlo manualmente. Esto requiere más inteligencia por parte del compilador.

Respuesta3

Los procesadores CISC (Computación de conjunto de instrucciones complejas) tienen una gama más amplia de instrucciones disponibles que los procesadores RISC (Computación de conjunto de instrucciones reducidas).

Un ejemplo de multiplicación en CISC sería: MUL 1:3, 4:2 (Multiplicar 1:3 y 2:4). Este comando cargaría el valor en la posición 1:3 en su registro, cargaría el valor en 4:2, los multiplicaría y lo almacenaría nuevamente en 1:3.

Las CPU RISC podrían tener que:

  • CARGA A, 1:3
  • CARGA B, 4:2
  • PROD A, B
  • TIENDA 1:3, A

...4 operaciones RISC por 1 operación CISC.

Debido a que RISC requiere más operaciones incluso para hacer el cálculo de multiplicación más simple, ¿imagina cuánto trabajo más se requiere para cosas como la renderización de un video o un juego?

Teniendo esto en cuenta, los compiladores que construyen el software a partir del código ingresado por un programador deben ser "más inteligentes" para saber cómo simplificar piezas complejas de código y comandos complejos para la arquitectura RISC.

Espero que esto tenga sentido. Para leer más, puede que valga la pena consultar: http://www.engineersgarage.com/articles/risc-and-cisc-architecture?page=5

información relacionada