2012-02-10 15 views
10

El conjunto de instrucciones x86-64 agrega más registros y otras mejoras para ayudar a optimizar el código ejecutable. Sin embargo, en muchas aplicaciones, el aumento del tamaño del puntero es una carga. Los bytes adicionales no utilizados en cada puntero obstruyen la caché e incluso pueden desbordar la RAM. GCC, por ejemplo, se construye con el indicador -m32, y supongo que este es el motivo.Punteros de 32 bits con el ISA x86-64: ¿por qué no?

Es posible cargar un valor de 32 bits y tratarlo como un puntero. Esto no necesita instrucciones adicionales, simplemente cargue/calcule los 32 bits y cargue desde la dirección resultante. El truco no será portátil, ya que las plataformas tienen diferentes mapas de memoria. En Mac OS X, se reserva todo el bajo espacio de direcciones de 4 GiB. Aún así, para un programa que escribí, añadí hackosamente 0x100000000L a "direcciones" de 32 bits antes de usar un rendimiento mejorado en gran medida en direcciones de 64 bits reales, o compilar con -m32.

¿Hay algún impedimento fundamental para tener una plataforma x86-64 de 32 bits? Supongo que apoyar tal quimera agregaría complejidad a cualquier sistema operativo, y cualquiera que quiera ese último 20% debería simplemente hacer que funcione ™, pero parece que este sería el mejor para una variedad de programas computacionalmente intensivos.

+0

Los datos de generación de perfiles en la mayoría de las aplicaciones sugieren que no hay pérdidas significativas debido al aumento del tamaño del puntero. – Puppy

+0

El Compilador Intel tiene la opción ['Qauto-ilp32'] (http://software.intel.com/sites/products/documentation/hpc/compilerpro/en-us/cpp/lin/compiler_c/copts/ccpp_options/option_qauto_ilp32 .htm) que "intenta" usar 32 bits para punteros, incluso en modo x64. – Mysticial

+0

@Mysticial, pero eso se parece más a los antiguos indicadores 'near' y' far', ¿verdad? Esa solución está bien, supongo, pero no es tan limpia como la que me refiero. – Potatoswatter

Respuesta

10

Hay un ABI llamado "x32" para Linux en desarrollo. Es una mezcla entre x86_64 e ia32 similar a lo que describes: espacio de direcciones de 32 bits mientras utilizas el conjunto de registros completo de 64 bits. Necesita un kernel personalizado, binutils y gcc.

Algunas ejecuciones de SPEC indican una mejora del rendimiento de aproximadamente el 30% en algunos puntos de referencia. Ver más información en https://sites.google.com/site/x32abi/

+0

Esta es una muy buena información. Me sentí un poco inseguro sobre hacer la pregunta, porque su frase posiblemente impidió una buena respuesta. Pero tener incluso una sola plataforma para apoyar a la quimera, solo en caso de que la diferencia sea lo suficientemente significativa, cambia el campo de juego. – Potatoswatter

-4

Se llama "emulación x86-32" o WOW64 en Windows (probablemente algo más en otros sistemas operativos) y es una marca de hardware en el procesador. No hay necesidad de ningún truco de modo de usuario aquí.

+0

¿Es eso una bandera accesible para el usuario? Entonces, ¿se requiere que el sistema operativo lo guarde/restaure y lo soporte? – Potatoswatter

+0

Ah, lo busqué - http://en.wikipedia.org/wiki/WOW64. No, eso solo está ejecutando el código x86 estándar, el antiguo ISA con solo 8 registros, en un sistema operativo de 64 bits. Justo lo mismo que '-m32'. No creo que otros sistemas operativos se molesten en darle un nombre a esa "característica". – Potatoswatter

+0

@Potatoswatter: ¿Y eso es significativamente diferente a lo que describes cómo, exactamente? En lugar de hacer hacks en modo de usuario para lograr el objetivo, el procesador lo logra en hardware. Eso siempre será más rápido. No hay indicador de compilación que logre esto, es una función de procesador de hardware. – Puppy

0

No espero que sea muy difícil admitir dicho modelo en el sistema operativo. Lo único que debe cambiar para los procesos de este modelo es la administración de páginas, las páginas deben asignarse por debajo del punto de 4 GB. El núcleo también debe asignar sus almacenamientos intermedios desde los primeros 4 GB del espacio de direcciones virtuales si los pasa a la aplicación. Lo mismo se aplica al cargador que carga e inicia las aplicaciones. Aparte de eso, un kernel de 64 bits debería ser capaz de manejar dichas aplicaciones sin grandes modificaciones.

El soporte del compilador tampoco debería ser un gran problema. Es principalmente una cuestión de generar código que puede usar los registros extra de la CPU y sus 64 bits completos y agregar los prefijos REX apropiados siempre que sea necesario.

Cuestiones relacionadas