2009-10-15 21 views
6

Quiero saber las actuaciones relativas de una aplicación normal C++ en los siguientes escenarios:¿Cómo debería funcionar la aplicación en las arquitecturas intel de 64 bits frente a las de 32 bits?

  1. construido como aplicación de 32 bits, se ejecutan en Intel de 64 bits del procesador (x64-64)
  2. construido como 32 aplicación de bits, se ejecuta en el procesador Intel de 32 bits (x86)
  3. Construido como aplicación de 64 bits.

Además, ¿qué factores debo tener en cuenta al modificar/desarrollar la aplicación para que funcione más rápido en los procesadores de 64 bits?

+0

Hmm. Votado sin comentarios. Si bien esta no es una pregunta muy precisa, podría haber alguna información interesante aquí. –

Respuesta

3

Es muy probable que el rendimiento dependa de su aplicación, y puede variar mucho, dependiendo de si utiliza o no bibliotecas que tengan optimizaciones para entornos de 64 bits. Si desea contar con la aceleración, debe enfocarse en mejorar sus algoritmos, en lugar de considerar la arquitectura del conjunto de instrucciones.

En cuanto a la preparación/revelado para 64 bits ... la clave es no hacer suposiciones con respecto a los tipos y sus respectivos tamaños. Si necesita un tipo con un tamaño específico, utilice los tipos definidos en < stdint.h >. Cada vez que vea funciones que usan size_t o ptrdiff_t, debe usar typedefs en lugar de otro tipo.

7

Respuesta breve: probablemente no notarás mucha diferencia.

Respuesta más larga: 64-bit x86 tiene más registros de propósito general, lo que le da al compilador más oportunidades de optimizar las variables locales en registros para un acceso más rápido. el compilador también puede asumir características más modernas, ej. no tener que optimizar el código para un 386, y puede suponer que su CPU tiene cosas como SSE en lugar de la antigua FPU x87 para matemáticas de coma flotante. pero los punteros serán el doble de ancho, lo que es peor para el caché.

+0

+1 por mencionar la longitud del puntero. Esto puede hacer una gran diferencia si se utilizan estructuras de puntero grande. – swegi

+0

Puede obtener algunas de esas optimizaciones del compilador (matemáticas escalares de escalado SSE, etc.) incluso en compilaciones de 32 bits especificando algunas opciones del compilador, como/arch: SSE2. – Crashworks

+0

... o para los usuarios de gcc, algo como '-march = core2 -msse2 -mfpmath = sse' – Tom

1

En general, no encontrará procesadores equivalentes que difieran solo en su compatibilidad con el funcionamiento de 64 bits, por lo que será difícil dar una comparación concreta entre 1) y 2). Por otro lado, la diferencia entre construir para el modo de 32 y 64 bits depende completamente de la aplicación. Una versión de 64 bits puede ser un poco más lenta o ligeramente más rápida que la versión de 32 bits. Si su aplicación usa muchas variables temporales, entonces el mayor conjunto de registros del modo de 64 bits puede hacer una gran diferencia en el rendimiento.

1

Por experiencia, he encontrado una compilación de 64 bits de una aplicación de 32 bits que generalmente hace que las cosas sean un 30% más rápidas. Es una cifra aproximada, pero es válida para una gran cantidad de aplicaciones que he transferido a 64 bits. Básicamente es por las razones explicadas anteriormente. Tienes más registros, lo cual es un regalo del cielo y permite mucho menos intercambio dentro y fuera de la memoria (que probablemente se almacenará en caché de todos modos, haciendo que la victoria sea bastante pequeña). Ciertas optimizaciones se pueden hacer mucho más fácilmente también. SIN EMBARGO, usted sufre el problema de punteros más grandes que borran parte de la ganancia, sin mencionar que al hacer un cambio de contexto se requiere más memoria para usar debido al conjunto de registros más grande.

Sin embargo, la optimización cuidadosa de la mano en 64 bits puede proporcionar ENORMES ganancias de rendimiento.

Su mejor plan es recompilar como de 64 bits y perfil. es decir, ver cuál es mejor.

5

Los programas intensivos en CPU pueden ser notablemente más rápidos en 64 bits.El procesador tiene 16 registros en lugar de 8 disponibles, que también son el doble de ancho (64 en lugar de 32 bits).

También el número de registros para las instrucciones SSE se dobla de 8 a 16, lo que ayuda a las aplicaciones multimedia u otras aplicaciones que realizan muchos cálculos de coma flotante.

Para más detalles, vea x86-64 en Wikipedia.

Una cosa que no se ha mencionado aún es que las versiones de 64 bits de los sistemas operativos como Windows y Linux usan un calling convention diferente para llamadas a funciones en sistemas de 64 bits; en lugar de pasar argumentos en la pila, los argumentos son (preferiblemente) pasados ​​en registros, que en principio es más rápido. Entonces, el software será más rápido porque hay menos sobrecarga de llamadas de funciones.

0

¿Ustedes saben algo acerca de la explosión de buses de datos concurrentes MC multicanal, IMC, y las características multi-core de las nuevas arquitecturas x86_64? al menos, memcpy puede optimizarse más rápido si es de 64 bits debido al uso de 64 bits de bus y registros independientemente de la ráfaga simultánea. al menos los nuevos archivadores pueden captar previamente los datos de múltiples módulos de memoria en el caché al mismo tiempo. y más ...

+0

consulte http://code.google.com/p/effogpled/downloads/list, nombre del documento EffoDesign_MemTest.pdf para obtener algunas ideas. – Test

1

¿Tiene algún requisito para> 4G de memoria? La explotación de trozos de memoria es realmente la gran razón para ir de 64 bits.

Cuestiones relacionadas