¿Son los programas de 64 bits más grandes y más rápidos que las versiones de 32 bits?


84

Supongo que me estoy centrando en x86, pero generalmente estoy interesado en el cambio de 32 a 64 bits.

Lógicamente, puedo ver que las constantes y los punteros, en algunos casos, serán más grandes, por lo que es probable que los programas sean más grandes. Y el deseo de asignar memoria en los límites de las palabras para mayor eficiencia significaría más espacio en blanco entre asignaciones.

También escuché que el modo de 32 bits en el x86 tiene que vaciar su caché cuando se cambia de contexto debido a posibles espacios de direcciones 4G superpuestos.

Entonces, ¿cuáles son los beneficios reales de 64 bits?

Y como pregunta complementaria, ¿128 bits sería incluso mejor?

Editar:

Acabo de escribir mi primer programa de 32/64 bits. Hace listas / árboles enlazados de objetos de 16 bytes (versión 32b) o 32 bytes (versión 64b) y realiza muchas impresiones en stderr; no es un programa realmente útil, ni algo típico, pero es el primero.

Tamaño: 81128 (32b) v 83672 (64b), por lo que no hay mucha diferencia

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

Actualizar:

Observo que se está desarrollando una nueva ABI híbrida x32 (Interfaz binaria de aplicación) que es 64b pero usa punteros 32b. Para algunas pruebas, el resultado es un código más pequeño y una ejecución más rápida que 32b o 64b.

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


1
Suma

1
Y el mío de hace unos días: stackoverflow.com/questions/2334148/…
Mr. Boy

Hay algo de superposición, estoy de acuerdo, pero todavía no hay interesados ​​en el caché de la CPU y las partes de 128 bits. Gracias Suma y John por los enlaces.
philcolbourn


"También escuché que el modo de 32 bits en el x86 tiene que vaciar su caché cuando se cambia de contexto debido a posibles espacios de direcciones 4G superpuestos". ¿Puede señalarme una referencia que hable de esto?
gkb0986

Respuestas:


29

A menos que necesite acceder a más memoria de la que le permitirá el direccionamiento 32b, los beneficios serán pequeños, si los hay.

Cuando se ejecuta en una CPU de 64b, obtiene la misma interfaz de memoria sin importar si está ejecutando un código 32b o 64b (está usando la misma caché y el mismo BUS).

Si bien la arquitectura x64 tiene algunos registros más que permiten optimizaciones más fáciles, esto a menudo se contrarresta por el hecho de que los punteros ahora son más grandes y el uso de cualquier estructura con punteros da como resultado un mayor tráfico de memoria. Calculo que el aumento en el uso general de memoria para una aplicación de 64b en comparación con una de 32b es de alrededor del 15-30%.


2
¿Cuál es su opinión sobre la ABI x32 propuesta?
philcolbourn

Creo que memcpy y strcpy serán más rápidos que la CPU de 32 bits porque leerá una palabra cada vez, ya que una palabra tiene 8 bytes en una CPU de 64 bits
Mark Ma

43

Por lo general, veo una mejora de la velocidad del 30% para el código de procesamiento intensivo en x86-64 en comparación con x86. Lo más probable es que esto se deba al hecho de que tenemos 16 registros de propósito general de 64 bits y 16 registros SSE en lugar de 8 registros de propósito general de 32 bits y 8 registros SSE. Esto es con el compilador Intel ICC (11.1) en un Linux x86-64; los resultados con otros compiladores (por ejemplo, gcc) o con otros sistemas operativos (por ejemplo, Windows) pueden ser diferentes, por supuesto.


1
Por "computación intensiva" ¿se refiere a gráficos, matrices, DFT?
philcolbourn

4
@phil: sí, principalmente procesamiento de imágenes, principalmente números enteros (punto fijo), mucho código SIMD, etc.
Paul R

He observado que los compiladores de 64 bits usan los registros SSE mientras que los compiladores de 32 bits usan la ALU estándar. Esto hace que el código de 64 bits sea más rápido debido al ancho de FP más estrecho (64 frente a 80) más instrucciones adicionales.
IamIC

16

Independientemente de los beneficios, le sugiero que siempre compile su programa para el tamaño de palabra predeterminado del sistema (32 bits o 64 bits), ya que si compila una biblioteca como un binario de 32 bits y la proporciona en un sistema, obligará a cualquiera que quiera vincularse con su biblioteca a proporcionar su biblioteca (y cualquier otra dependencia de la biblioteca) como un binario de 32 bits, cuando la versión de 64 bits es la predeterminada disponible. Esto puede ser una molestia para todos. En caso de duda, proporcione ambas versiones de su biblioteca.

En cuanto a los beneficios prácticos de 64 bits ... el más obvio es que obtienes un espacio de direcciones más grande, por lo que si mmap un archivo, puedes direccionar más a la vez (y cargar archivos más grandes en la memoria). Otro beneficio es que, asumiendo que el compilador hace un buen trabajo de optimización, muchas de sus operaciones aritméticas se pueden paralelizar (por ejemplo, colocando dos pares de números de 32 bits en dos registros y realizando dos sumas en una sola operación de suma), y grandes los cálculos numéricos se ejecutarán más rápidamente. Dicho esto, todo el asunto de 64 bits frente a 32 bits no lo ayudará en absoluto con la complejidad asintótica, por lo que si está buscando optimizar su código, probablemente debería mirar los algoritmos en lugar de los factores constantes como este.

EDITAR :
Ignore mi declaración sobre la adición paralelizada. Esto no se realiza mediante una declaración add ordinaria ... Estaba confundiendo eso con algunas de las instrucciones vectorizadas / SSE. Un beneficio más preciso, aparte del mayor espacio de direcciones, es que hay registros de propósito más general, lo que significa que se pueden mantener más variables locales en el archivo de registro de la CPU, que es mucho más rápido de acceder, que si coloca las variables en el pila de programas (lo que generalmente significa salir a la caché L1).


> "por ejemplo, colocar dos pares de números de 32 bits en dos registros y realizar dos sumas en una sola operación de suma" ¿Hay algún compilador que esté haciendo esto? Además, parece que se podría hacer lo mismo en x86 usando instrucciones SSE.
Suma

Pensar en tales "dos adiciones en una" más, es una tontería y ningún compilador puede hacerlo como una optimización, porque la adición de 32b inferiores podría desbordarse en 32b superiores. Necesita instrucciones SIMD para esto.
Suma

Supongo que si estuviera interesado, podría hacer aritmética múltiple de 16 bits en registros de 64 bits. Parecería desordenado, pero apuesto a que se ha hecho.
philcolbourn

'Factores constantes': suena como algo que diría Brian Harvey.
philcolbourn

5

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


4

Estoy codificando un motor de ajedrez llamado foolsmate . La mejor extracción de movimientos utilizando una búsqueda de árbol basada en minimax hasta la profundidad 9 (desde una posición determinada) tomó:

en Win32configuración: ~ 17.0s;

después de cambiar a la x64configuración: ~ 10.3s;

¡Esto es el 41% de la aceleración!


2

La única justificación para mover su aplicación a 64 bits es la necesidad de más memoria en aplicaciones como grandes bases de datos o aplicaciones ERP con al menos cientos de usuarios simultáneos donde el límite de 2 GB se excederá con bastante rapidez cuando las aplicaciones se almacenan en caché para un mejor rendimiento. Este es el caso especialmente en el sistema operativo Windows, donde integer y long siguen siendo de 32 bits (tienen una nueva variable _int64. Solo los punteros son de 64 bits. De hecho, WOW64 está altamente optimizado en Windows x64, por lo que las aplicaciones de 32 bits se ejecutan con una penalización baja en Windows de 64 bits. SO. Mi experiencia en Windows x64 es que la versión de la aplicación de 32 bits se ejecuta entre un 10 y un 15% más rápido que la de 64 bits, ya que en el primer caso, al menos para las bases de datos de memoria patentadas, puede usar la aritmática de punteros para mantener el árbol b (la mayoría de los procesadores son parte de los sistemas de bases de datos) . Aplicaciones intensivas de compilación que requieren grandes decimales para obtener la mayor precisión que no ofrece el doble en el sistema operativo de 32-64 bits. Estas aplicaciones pueden usar _int64 de forma nativa en lugar de la emulación de software. Por supuesto, las bases de datos basadas en discos grandes también mostrarán una mejora con respecto a 32 bits simplemente debido a la capacidad de usar una gran memoria para almacenar en caché planes de consulta, etc.


Primero, intpermanece de 32 bits en todas partes, independientemente del tamaño de palabra del entorno de ejecución. ¿Para qué compilador sigue longsiendo de 32 bits cuando se compila para 64 bits? ¿Está afirmando que MSVC hace esto? AFAIK, esto está cubierto [aproximadamente] en el estándar C ++ 11: sizeof(long) == sizeof(void*)Por favor, alguien, corríjame si me equivoco, ya que no tengo fácil acceso a MSVC.
Matthew Hall

3
@Matthew Hall: su estándar de sistema operativo Windows de 64 bits y, por lo tanto, MSVC sigue este modelo LLP64 (frente a LP64 para variantes de Unix). Consulte ( msdn.microsoft.com/en-us/library/3b2e7499(v=vs.100).aspx ).
GirishK

1

Se transfieren más datos entre la CPU y la RAM para cada recuperación de memoria (64 bits en lugar de 32), por lo que los programas de 64 bits pueden ser más rápidos siempre que se escriban de manera que aprovechen esto adecuadamente.


11
En realidad, esto no es así: el bus de memoria tiene cualquier ancho, lo que no tiene nada que ver con el ancho de los registros del procesador. Algunos sistemas de 32 bits obtienen 128 bits a la vez, hay sistemas de 64 bits que obtienen 32 a la vez e incluso sistemas de 32 bits que obtienen memoria no más de 8 bits a la vez.
Andrew McGregor

Bien, no era consciente de eso, aún así, ¿no es correcto que una sola instrucción mov transfiera 64 bits en una cpu de 64 bits y 32 bits en una cpu de 32 bits? Entonces, al copiar una gran cantidad de memoria del punto A al punto B, esto al menos significaría que se necesitarían ejecutar menos instrucciones mov en una CPU de 64 bits (incluso si el bus de memoria es el cuello de botella).
Rune Aamodt

2
Cuando mueva una gran cantidad de memoria, utilizará instrucciones SIMD de 128b en x86 y x64.
Suma

¿Cuáles son exactamente los "sistemas de 64 bits que obtienen 32 a la vez"? Por favor, nombre algunos. Si los hay, ¿son realmente "sistemas de 64 bits"?
Johnny

1

En el caso específico de x68 a x68_64, el programa de 64 bits tendrá aproximadamente el mismo tamaño, si no un poco más pequeño, usará un poco más de memoria y se ejecutará más rápido. Principalmente, esto se debe a que x86_64 no solo tiene registros de 64 bits, también tiene el doble. x86 no tiene suficientes registros para hacer que los lenguajes compilados sean tan eficientes como podrían ser, por lo que el código x86 gasta muchas instrucciones y ancho de banda de memoria intercambiando datos entre registros y memoria. x86_64 tiene mucho menos de eso, por lo que ocupa un poco menos de espacio y se ejecuta más rápido. Las instrucciones vectoriales de punto flotante y de giro de bits también son mucho más eficientes en x86_64.

Sin embargo, en general, el código de 64 bits no es necesariamente más rápido y suele ser más grande, tanto para el uso del código como de la memoria en tiempo de ejecución.


2
No entiendo bien lo que estás diciendo. Inicialmente (primera oración), dice que los programas de 64 bits generalmente se ejecutarán más rápido, pero luego su última oración parece estar retrocediendo todo eso para decir "no realmente"
SN

1

Cualquier aplicación que requiera el uso de la CPU, como la transcodificación, el rendimiento de visualización y la representación de medios, ya sea de audio o visual, ciertamente requerirá (en este punto) y se beneficiará del uso de 64 bits en lugar de 32 bits debido a la capacidad de la CPU para lidiar con la pura cantidad de datos que se le arrojan. No se trata tanto de una cuestión de espacio de direcciones como de la forma en que se tratan los datos. Un procesador de 64 bits, con un código de 64 bits, funcionará mejor, especialmente con cosas matemáticamente difíciles como la transcodificación y los datos de VoIP; de hecho, cualquier tipo de aplicación 'matemática' debería beneficiarse del uso de CPU y sistemas operativos de 64 bits. Prueba que estoy equivocado.


No . No lo hará. Si el requisito de RAM supera los 4 GB, solo será más rápido. Puede buscar fácilmente una matriz de enteros de 1000 millones en menos de 4 GB de datos en una arquitectura de 32 bits. Entonces, usar una máquina de 64 bits aquí se ralentizará
sapy
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.