P6 Arquitectura - renombrado de registros a un lado, ¿el usuario limitado registros resultan en más operaciones pasó derramando / carga?

StackOverflow https://stackoverflow.com/questions/2460198

Pregunta

Estoy estudiando diseño JIT con respecto a los lenguajes dinámicos aplicación VM. No he hecho mucho Asamblea desde los días 8086/8088, sólo un poco aquí o allá, por lo que sería bueno si estoy de mal humor.

A mi entender, el x86 (IA-32), la arquitectura sigue teniendo el mismo conjunto de registros limitados básica hoy que siempre lo hacía, pero el recuento de registro interno ha crecido enormemente, pero estos registros internos no están generalmente disponibles y se utilizan con el cambio de nombre de registro para lograr la canalización paralela de código que de otro modo no podría ser paralelizable. Entiendo esta optimización bastante bien, pero mi sensación es que, mientras estas optimizaciones ayudan en el rendimiento general y para los algoritmos paralelos, el conjunto de registros limitados todavía estamos atascados con resultados en más registro que se derraman encima de la cabeza de tal manera que si X 86 tenía doble, o cuadruplicar los registros a nuestra disposición, no puede ser significativamente inferior códigos de operación de empuje / pop en un flujo de instrucciones típica? O hay otros optmizations procesador que también optimizan la distancia que soy consciente de? Básicamente, si tengo una unidad de código que tiene 4 registros para trabajar para el trabajo entero, pero mi unidad tiene una docena de las variables, tengo potencialmente un push / pop por cada 2 o más instrucciones.

Las referencias a los estudios, o mejor aún, experiencias personales?

EDIT: x86_64 tiene 16 registros, lo cual es el doble x86-32, gracias por la corrección y la información

.
¿Fue útil?

Solución

Además de cambiar el nombre de registros para ocultar burbujas debido a las latencias de instrucción, la mayoría de las arquitecturas x86 son lo suficientemente inteligentes como para contar empuja y pops y cambiar el nombre de las personas en los registros también. Recuerde que el decodificador de instrucciones x86 en la realidad realiza una especie de compilación JIT, convirtiendo el flujo de instrucciones x86 en un pequeño programa microcódigo almacenado en la memoria caché rastro. Parte de este proceso incluye la interceptación de cargas de pequeño desplazamiento de la pila y convertir los registros en también. Por lo tanto algo como (la patente tonto y puramente por ejemplo):

lwz eax,[ebp]
lwz ebx,[ebp+4]
add eax,[edx+0]
push eax 
lwz eax,[ebp+8]
add eax,ebx
pop ebx
add eax,ebx

cocineros en algo así como (hacer de registros internos se denominan por ejemplo, r0..r16):

lw r3, edx
lw r1, ebp
lw r2, ebp+4 ; the constant '4' is usually stored as an immediate operand
add r1,r2
or r4,r1,r1 ;; move r1 to r4
lw r1, ebp+8
add r1,r2
or r2,r4,r4
add r1,r2

Por supuesto, un decodificador mágicamente inteligente (a diferencia de la que realmente se ajusta a cuenta del transistor) se derrumbaría algunos de los movimientos innecesarios allí, pero el punto que estoy haciendo es que push / pop y tiendas / cargas a esp+(some small number) son en realidad se convirtió en registros de sombra.

Otros consejos

Dos puntos:

(1) x86-64 duplica el número de registros a 16

(2) en la CPU x86 modernos, una instrucción que utiliza una memoria en la cual ya está en caché L1 es casi más rápido que la misma operación con un operando de registro, por lo que casi se puede pensar L1 como "registro de memoria"

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top