Pregunta

Supongo que me estoy enfocando en x86, pero en general estoy interesado en el pasar de 32 a 64 bits.

Lógicamente, puedo ver que las constantes de punteros y, en algunos casos, será mayor por lo que los programas son propensos a ser más grande.Y el deseo de asignar memoria en los límites de la palabra para la eficiencia significaría más de espacio en blanco entre las asignaciones.

También he oído que el modo de 32 bits en el x86 tiene que vaciar su caché cuando el cambio de contexto, debido a la posible superposición de 4G espacios de direcciones.

Así que, ¿cuáles son los beneficios reales de 64 bits?

Y como pregunta complementaria, sería de 128 bits ser aún mejor?

Editar:

Yo acabo de escribir mi primer 32/64 bits del programa.Hace listas enlazadas/árboles de 16 bytes (32b versión) o 32 bytes (64b versión) de los objetos y hace un montón de impresión a stderr - no es un buen programa, y no es algo típico, pero es mi primera vez.

Tamaño:81128(32b) v 83672(64b) - así que no hay mucha diferencia

Velocidad:17s(32b) v 24s(64b) - se ejecuta en 32 bits del sistema operativo (OS X 10.5.8)

Actualización:

Tomo nota de que un nuevo híbrido x32 ABI (Application Binary Interface) está siendo desarrollada que es 64b pero utiliza 32b punteros.Para algunas de las pruebas que se traduce en menores de código y de ejecución más rápido que cualquiera de los 32b o 64b.

https://sites.google.com/site/x32abi/

¿Fue útil?

Solución

A menos que necesite un acceso más memoria que abordar 32b le permitirá, de los beneficios será pequeño, en su caso.

Cuando se ejecuta en la CPU 64b, se obtiene la misma interfaz de memoria no importa si está ejecutando 32b o 64b código (que está utilizando el mismo caché y el mismo BUS).

Mientras que la arquitectura x64 tiene un poco más de registros que permite optimizaciones más fácil, esto es a menudo contrarrestada por los punteros de datos son ahora más grande y el uso de cualquier estructura con punteros como resultado un tráfico de memoria superior. Me gustaría estimar el aumento en el uso general de la memoria para una aplicación 64b en comparación con un 32b uno estar alrededor de 15-30%.

Otros consejos

Me suelen ver una mejora en la velocidad del 30% para el código informático intensivo en x86-64 comparación con x86. Esto es muy probablemente debido al hecho de que tenemos registros de propósito general de 16 x 64 bits y 16 registros x SSE en lugar de 8 x 32 Bit registros de propósito general y 8 registros x SSE. Esto es con el compilador Intel CPI (11.1) en una x86-64 Linux - resultados con otros compiladores gcc (por ejemplo), o con otros sistemas operativos (por ejemplo, de Windows), puede ser diferente, por supuesto

.

A pesar de los beneficios, sugeriría que siempre compilar el programa para el tamaño de texto predeterminado del sistema (32 bits o 64 bits), ya que si se compila una biblioteca como un binario de 32 bits y la proporcione en una sistema de 64 bits, que obligará a cualquier persona que quiera enlace con la biblioteca para proporcionar su biblioteca (y cualquier otro dependencias de bibliotecas) como un binario de 32 bits, cuando la versión de 64 bits es el valor predeterminado disponible. Esto puede ser una molestia para todos. En caso de duda, ofrecer dos versiones de su biblioteca.

En cuanto a los beneficios prácticos de 64 bits ... la más obvia es que se obtiene un espacio de direcciones más grande, por lo que si mmap un archivo, se puede tratar más de ella a la vez (y cargar archivos de mayor tamaño en la memoria). Otra ventaja es que, suponiendo que el compilador hace un buen trabajo de optimización, muchas de sus operaciones aritméticas se pueden parallelized (por ejemplo, la colocación de dos pares de números de 32 bits en dos registros y la realización de dos añade en una sola operación complemento), y grande cálculos numéricos se ejecutarán más rápidamente. Dicho esto, el conjunto de 64 bits vs 32 bits que no le ayudará con la complejidad asintótica en absoluto, por lo que si usted está buscando para optimizar el código, es probable que debe buscar en los algoritmos en lugar de los factores constantes de este tipo.

editar :
Haga caso omiso de mi declaración acerca de la adición parallelized. Esto no se lleva a cabo mediante una declaración, complemento ordinaria ... me estaba confundiendo eso con algunas de las instrucciones vectorizados / SSE. Una de las ventajas más precisa, aparte del mayor espacio de direcciones, es que hay registros de propósito más general, lo que significa más variables locales se pueden mantener en el archivo de registro de la CPU, que es mucho más rápido de acceso, que si coloca las variables en el pila del programa (que por lo general significa salir a la caché L1).

Además de tener más registros, 64 bits tiene SSE2 de forma predeterminada. Esto significa que de hecho puede realizar algunos cálculos en paralelo. Las extensiones SSE tenían otras cosas también. Pero supongo que el principal beneficio es no tener que comprobar la presencia de las extensiones. Si se trata de x64, tiene SSE2 disponible. ... Si mi memoria no me falla.

La única justificación para mover la aplicación a 64 bits es la necesidad de más memoria en aplicaciones como grandes bases de datos o aplicaciones de ERP con al menos 100 usuarios simultáneos donde el límite de 2 GB será superado con bastante rapidez cuando las aplicaciones de caché para un mejor rendimiento.Este es el caso especialmente en el sistema operativo Windows donde integer y long todavía es de 32 bits (tienen nueva variable _int64.Sólo los punteros son de 64 bits.De hecho WOW64 es altamente optimizados en x 64 de Windows, por lo que 32 bits, las aplicaciones se ejecutan con bajo pena de 64 bits de Windows OS.Mi experiencia en x64 de Windows es de 32 bits versión de la aplicación se ejecute un 10-15% más rápido que el de 64 bits ya que en el caso anterior, al menos, de propiedad de la memoria de las bases de datos puede utilizar el puntero arithmatic para el mantenimiento de la b-tree (la mayoría de uso intensivo del procesador de la parte de sistemas de base de datos).Compuatation intensivo de aplicaciones que requieren grandes decimales para obtener una mayor precisión que no se otorgan por el doble en 32-64 bits del sistema operativo.Estas aplicaciones pueden usar _int64 en forma nativa en lugar de la emulación de software.Por supuesto, gran disco de bases de datos también muestran una mejoría a lo largo de 32 bits, simplemente debido a la capacidad de utilizar grandes cantidades de memoria para el almacenamiento en caché de los planes de consulta y así sucesivamente.

Más se transfieren datos entre la CPU y la RAM de memoria para cada fetch (64 bits en lugar de 32), por lo que los programas de 64 bits pueden ser más rápido, siempre que se escriben de forma que tengan adecuadamente ventaja de esto.

En el caso específico de x68 a x68_64, el programa de 64 bits será aproximadamente el mismo tamaño, si no un poco más pequeño, utilice un poco más de memoria, y correr más rápido. Sobre todo esto se debe a que x86_64 no sólo tiene 64 registros de bits, sino que también tiene el doble. x86 no tiene suficientes registros para hacer lenguajes compilados como eficientes como podrían ser, por lo que el código x86 gasta una gran cantidad de instrucciones y el ancho de banda de memoria de datos de desplazamiento hacia atrás y hacia adelante entre los registros y la memoria. x86_64 tiene mucho menos de eso, y por lo tanto se necesita un poco menos espacio y se ejecuta más rápido. punto flotante y las instrucciones de vectores de bits haciendo girar también son mucho más eficientes en x86_64.

En general, sin embargo, el código de 64 bits no es necesariamente más rápidamente y es generalmente más grande, tanto para el código y el uso de memoria en tiempo de ejecución.

Las aplicaciones que requieren el uso de CPU, como la transcodificación, el rendimiento de visualización y medios renderizado, ya sea de audio o visual, sin duda requieren (en este momento) y beneficiarse del uso de 64 bits frente a 32 bits, debido a la capacidad de la CPU de acuerdo con la enorme cantidad de datos que se lanzada contra él. No es tanto una cuestión de espacio de direcciones, ya que es la forma en que los datos están siendo tratados. Un procesador de 64 bits, partiendo de código de 64 bits, se va a obtener mejores resultados, sobre todo con las cosas matemáticamente difíciles, como la transcodificación y los datos de VoIP - de hecho, cualquier tipo de aplicaciones 'matemáticas' debería beneficiarse por el uso de CPU de 64 bits y sistemas operativos. Demostrar que estoy equivocado.

Estoy codificación de un motor de ajedrez. La mejor extracción de movimiento utilizando un árbol de búsqueda basada en Minimax a la profundidad 9 (a partir de una cierta posición) tomó ~ 17.0s en la configuración de Win32 y después de cambiar a x64 ahora toma ~ 10.3s. Este es el 41% de la aceleración!

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