2012-09-16 9 views
7

Lo siento si la pregunta suena estúpida. Solo soy vagamente consciente del problema de la alineación de datos y nunca he realizado ninguna programación de 64 bits. Estoy trabajando en un código x86 de 32 bits ahora mismo. Con frecuencia accede a una matriz de int. A veces se lee un entero de 32 bits. A veces se leen dos o más. En algún momento me gustaría hacer el código de 64 bits. Lo que no estoy seguro es si debo declarar esta matriz int como int o long int. Prefiero mantener el ancho del entero igual, por lo que no tengo que preocuparme por las diferencias. Aunque estoy algo preocupado de que leer/escribir una dirección que no está alineada con la palabra natural sea lenta.¿Hay una penalización de rendimiento que acceda a una matriz de enteros de 32 bits en x86-64?

+1

Si desea enteros de ancho fijo, intente: 'int32_t' en' ' – Mysticial

+0

' int' es el tipo natural para la arquitectura. A menos que tenga una buena razón para usar un tipo diferente, no lo haga. –

+0

@PeteBecker No, no lo es. 'int' todavía tiene 32 bits en la mayoría de los sistemas hoy en día. – Mysticial

Respuesta

7

Las penalizaciones por desalineación solo se producen cuando la carga o el almacén cruzan un límite de alineación. El límite es generalmente el menor de:

  • La palabra de tamaño natural del hardware. (32 bits o 64 bits *)
  • El tamaño del tipo de datos.

Si está cargando una palabra de 4 bytes en una arquitectura de 64 bits (8 bytes). No es necesario que esté alineado en 8 bytes. Solo necesita estar alineado a 4 bytes.

Del mismo modo, si está cargando un carácter de 1 byte en cualquier máquina, no es necesario alinearlo en absoluto.

* Tenga en cuenta que los vectores SIMD pueden implicar un tamaño de palabra natural más grande. Por ejemplo, SSE de 16 bytes aún requiere alineación de 16 bytes en x86 y x64. (Salvo explícitas cargas desalineadas/tiendas)


Así que en resumen, no usted no tiene que preocuparse acerca de los datos alineación. El lenguaje y el compilador hacen un gran esfuerzo para evitar que tengas que preocuparte por ello.

Así que simplemente quédate con el tipo de datos que tenga más sentido para ti.

3

Las CPU de 64 bits x86 siguen estando muy optimizadas para una manipulación eficiente de los valores de 32 bits. Incluso en sistemas operativos de 64 bits, el acceso a valores de 32 bits es al menos tan rápido como el acceso a valores de 64 bits. En la práctica, en realidad será más rápido porque se consume menos espacio en la memoria caché y el ancho de banda de la memoria.

1

Cada vez que accede a una ubicación de memoria, se lee una línea de caché completa en la caché L1, y cualquier acceso posterior a cualquier elemento en esa línea es lo más rápido posible. A menos que su acceso de 32 bits cruce una línea de caché (que no será si está en una alineación de 32 bits) será tan rápido como un acceso de 64 bits.

+0

No del todo. El acceso a 1 valor será el mismo. Si accede a * otro * valor de 32 bits que se encuentra en la misma línea de caché, ya estará allí; incluso lo indicará con "subsiguiente ...". El uso de tamaños de datos más pequeños generalmente es más compatible con la caché debido a la carga de más elementos de datos por línea de caché. – phkahler

Cuestiones relacionadas