son resumen quienes porque países paises movimiento los llaman guerra fundadores fria cuales conforman caracteristicas alineados performance memory x86 alignment memory-alignment

performance - resumen - porque se llaman paises no alineados



¿Cuál es el efecto real de los accesos no alineados exitosos en x86? (3)

Siempre escucho que los accesos no alineados son malos porque causarán errores de ejecución y colapsarán el programa o ralentizarán los accesos a la memoria. Sin embargo, no puedo encontrar ningún dato real sobre cuánto retrasarán las cosas.

Supongamos que estoy en x86 y tengo una parte (aún desconocida) de accesos no alineados. ¿Cuál es la peor desaceleración posible y cómo lo calculo sin eliminar todos los accesos no alineados y comparando el tiempo de ejecución de dos versiones de código?


Depende de las instrucciones, para la mayoría de las instrucciones de carga / almacenamiento de SSE x86 (excluyendo las variantes no alineadas), causará un error, lo que significa que probablemente bloqueará su programa o generará muchos viajes de ida y vuelta a su controlador de excepciones ( lo que significa que casi todo el rendimiento se pierde). Las variantes de carga / almacenamiento no alineadas se ejecutan al doble de la cantidad de ciclos IIRC, ya que realizan lecturas / escrituras parciales, por lo que se requieren 2 para realizar la operación (a menos que tenga suerte y esté en caché, lo que reduce en gran medida la penalización).

Para las instrucciones generales de carga / almacenamiento de x86, la penalización es la velocidad, ya que se requieren más ciclos para leer o escribir. la desalineación también puede afectar el almacenamiento en caché, lo que lleva a la división de la línea de caché y la separación de límites de caché. También evita la atomicidad en las lecturas y escrituras (que están garantizadas para todas las lecturas / escrituras alineadas de x86, las barreras y la propagación son otra cosa, pero el uso de instrucciones BLOQUEADAS en datos no alineados puede causar una excepción o aumentar considerablemente la penalización ya masiva del bu incurre en el bloqueo), que es un no-no para la programación concurrente.

El manual de optimizaciones de Intels x86 y x64 ofrece una gran cantidad de detalles sobre cada problema mencionado anteriormente, sus efectos secundarios y cómo remediarlos.

Los manuales de optimización de Agner Fog deben tener los números exactos que está buscando en términos de rendimiento de ciclo sin procesar.


En algunas microarquitecturas de Intel, una carga que se divide por un límite de cacheline toma una docena de ciclos más de lo habitual, y una carga que se divide por un límite de página lleva más de 200 ciclos más. Ya es bastante malo que si las cargas se desalinean constantemente en un bucle, vale la pena hacer dos cargas alineadas y fusionar los resultados manualmente, incluso si palignr no es una opción. Incluso las cargas no alineadas de SSE no te salvarán, a menos que se dividan exactamente en el medio.

En AMD, esto nunca fue un problema, y ​​el problema desapareció en su mayoría en Nehalem, pero todavía hay muchos Core2 por ahí también.


En general, estimar la velocidad en los procesadores modernos es extremadamente complicado. Esto es cierto no solo para accesos no alineados sino en general.

Los procesadores modernos han desarrollado arquitecturas, desordenadas y posiblemente ejecución paralela de instrucciones y muchas otras cosas que pueden afectar la ejecución.

Si el acceso no alineado no es compatible, se obtiene una excepción. Pero si es compatible, puede o no obtener una ralentización dependiendo de muchos factores. Estos factores incluyen qué otras instrucciones estaba ejecutando antes y después de la no alineada (porque el procesador puede comenzar a buscar sus datos mientras ejecuta las instrucciones anteriores o seguir adelante y seguir las instrucciones posteriores mientras espera).

Otra diferencia muy importante ocurre si el acceso no alineado ocurre a través de los límites de la línea de caché. En general, cuando se produce un acceso 2x al caché para un acceso no alineado, la desaceleración real es si el acceso cruza un límite de cacheline y provoca una falta de caché doble. En el peor de los casos, una lectura no alineada de 2 bytes puede requerir que el procesador elimine dos archivos de la memoria y luego lea 2 clases de la memoria. Eso es un montón de datos en movimiento.

La regla general para la optimización también se aplica aquí: primero el código, luego la medición, luego si y solo si hay un problema, encuentra una solución.