Llevando la emulación RISC-V al límite

Pushing the limits of RISC-V emulation

Llevando la emulación RISC-V al límite

Este artículo explora cómo acelerar la ejecución de programas RISC-V en máquinas no RISC-V, partiendo de un intérprete básico y eliminando capas de sobrecarga hasta lograr un recompilador anticipado que genera bloques básicos conectados con llamadas de cola y usa la convención de llamada `preserve_none` de Clang para mantener el estado del invitado en registros del host. El autor, trabajando en OpenVM de Axiom, compara el rendimiento con la ejecución nativa y detalla técnicas como predecodificación, computed goto, threading de llamadas de cola, y un backend en ensamblador, culminando en la generación de C para que Clang optimice cada bloque básico.

La forma más rápida de ejecutar un programa es apartarse de su camino y dejar que el hardware lo ejecute directamente.
  1. oso2k

    La técnica de intérprete más genial que vi fue una que ponía los cuerpos de las instrucciones en funciones estáticas que el bucle principal del "compilador" copiaba con memcpy el cuerpo de la función a código lineal que se ejecutaría desde memoria: un JIT de pobres. Todas las funciones de instrucción tenían los mismos argumentos y GCC emitía código independiente de posición con la misma convención de llamada de registros predecible. Frágil como el infierno, claro, pero con una gran velocidad de compilación y baja sobrecarga en tiempo de ejecución. Podía ejecutar código interpretado a 1/5 de la velocidad del código compilado, en comparación con 1/10 de velocidad para los típicos intérpretes de bucle con goto calculado altamente optimizados. No puedo encontrar un enlace, pero si alguien recuerda o escribió un intérprete JIT así, por favor que lo publique.

  2. beholdo

    Al final no es emulación sino recompilación estática (que, podría decirse, es más genial).

Más de este día

2026-08-06