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.
fuente
Respuestas:
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%.
fuente
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.
fuente
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).
fuente
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.
fuente
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
Win32
configuración: ~17.0s
;después de cambiar a la
x64
configuración: ~10.3s
;¡Esto es el 41% de la aceleración!
fuente
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.
fuente
int
permanece de 32 bits en todas partes, independientemente del tamaño de palabra del entorno de ejecución. ¿Para qué compilador siguelong
siendo 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.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.
fuente
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.
fuente
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.
fuente