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


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

Lógicamente, puedo ver que las constantes y 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 palabras para la eficiencia significaría más 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 cambia de contexto debido a la posible superposición de direcciones 4G espacio.

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

Y como pregunta complementaria, ¿sería aún mejor 128 bit?

Editar:

Acabo de escribir mi primer programa de 32/64 bits. Hace listas enlazadas/árboles de 16 bytes (versión 32b) o 32 bytes (versión 64b) objetos y hace una gran cantidad de impresión a stderr - no es un programa realmente útil, y no es algo típico, pero es el primero.

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

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

Actualización:

Observo que se está desarrollando un nuevo híbrido x32 ABI (Application Binary Interface) que es 64b pero utiliza punteros 32b. Para algunas pruebas resulta en 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 /

Author: philcolbourn, 2010-03-04

8 answers

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

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

Mientras que 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 resulta en una mayor tráfico de memoria. Estimaría 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 %.

 22
Author: Suma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-04 10:49:49

Normalmente veo una mejora de velocidad del 30% para el código con uso intensivo de computación en x86-64 en comparación con x86. Esto es muy probable debido al hecho de que tenemos 16 x 64 bit registros de propósito general y 16 x registros SSE en lugar de 8 x 32 bit registros de propósito general y 8 x 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.

 34
Author: Paul R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-05 08:52:11

Independientemente de los beneficios, sugeriría 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 de 64 bits, obligará a cualquiera que quiera vincularse con su biblioteca a proporcionar su biblioteca (y cualquier otra dependencia de biblioteca) como un binario de 32 bits, cuando la versión de 64 bits es la disponible por defecto. Esto puede ser una molestia para todos. En caso de duda, proporcione ambos versiones de tu biblioteca.

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

EDITAR :
Por favor, no haga caso de mi declaración sobre la adición paralela. Esto no se realiza mediante una instrucción add ordinaria... Estaba confundiendo eso con algunas de las instrucciones vectorizadas/SSE. A más el beneficio exacto, aparte del espacio de direcciones más grande, es que hay más registros de propósito 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 la pila del programa (lo que generalmente significa salir a la caché L1).

 14
Author: Michael Aaron Safyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-05 04:19:22

Además de tener más registros, 64-bit tiene SSE2 por defecto. Esto significa que 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.

 3
Author: amokcrow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-21 12:55:10

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 correrá más rápido. Esto se debe principalmente a que x86_64 no solo tiene registros de 64 bits, sino que también tiene el doble de registros. 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 cambiando los datos entre registros y memoria. x86_64 tiene mucho menos de eso, así que ocupa un poco menos de espacio y corre más rápido. Las instrucciones vectoriales de punto flotante y giro de bits 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ápido, y generalmente es más grande, tanto para el código como para el uso de memoria en tiempo de ejecución.

 2
Author: Andrew McGregor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-04 10:44:04

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 100s de usuarios simultáneos donde el límite de 2 GB se excederá con bastante rapidez cuando las aplicaciones se almacenen en caché para un mejor rendimiento. Este es el caso especialmente en el sistema operativo Windows donde integer y long sigue siendo de 32 bits (tienen nueva variable _int64. Solo los punteros son de 64 bits. De hecho, WOW64 está altamente optimizado en Windows x64 para que se ejecuten aplicaciones de 32 bits con baja penalización en el sistema operativo Windows de 64 bits. Mi experiencia en Windows x64 es que la versión de la aplicación de 32 bits se ejecuta 10-15% más rápido que 64 bits, ya que en el caso anterior, al menos para bases de datos de memoria propietarias, puede usar pointer arithmatic para mantener b-tree (la parte más intensiva del procesador de los sistemas de bases de datos). Aplicaciones intensivas de compuatación que requieren decimales grandes para una mayor precisión que no ofrece double en un sistema operativo de 32-64 bits. Estas aplicaciones pueden usar _int64 de forma nativa en lugar de emulación de software. Por supuesto, las bases de datos basadas en discos grandes también mostrarán mejoras sobre 32 bits simplemente debido a la capacidad de usar memoria grande para almacenar en caché planes de consulta y así sucesivamente.

 2
Author: GirishK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-02 03:20:44

Se transfieren más datos entre la CPU y la RAM por 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 para que aprovechen esto adecuadamente.

 1
Author: Rune Aamodt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-04 10:39:21

Cualquier aplicación que requiera el uso de la CPU, como la transcodificación, el rendimiento de la pantalla y la representación de medios, ya sea de audio o visual, sin duda requerirá (en este punto) y se beneficiará del uso de 64 bits frente a 32 bits debido a la capacidad de la CPU para hacer frente a la gran cantidad de datos que se lanzan en ella. No es tanto una cuestión de espacio de direcciones como lo es la forma en que se tratan los datos. Un procesador de 64 bits, dado el código de 64 bits, va a funcionar mejor, especialmente con matemáticamente cosas difíciles como la transcodificación y los datos VoIP - de hecho, cualquier tipo de aplicaciones 'matemáticas' deberían beneficiarse con el uso de CPU de 64 bits y sistemas operativos. Demuéstrame que me equivoco.

 0
Author: Dave Vanian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-16 09:33:49