Estoy escribiendo un código SSE2 y me topé con una presentación [1] para desarrolladores de AMD que habla sobre Barcelona desde el punto de vista de optimización.
[1]
http://developer.amd.com/assets/GDC2...lticore_JB.pdf
Y aparte de lo que ya es popularmente sabido, la FPU de 128 bits, mencionan que en Barcelona se pueden leer bloques de 128 bits desde la memoria sin penalización por alineamiento.
Explicaré un poco más por si no se entiende, en SSE para leer un vector desde memoria hay dos clases de instrucciones, MOVAPD que leen de una dirección de memoria que esta alineada a 16 bytes (es decir, la direccion es multiplo de 16) y otra MOVUPD que lee de cualquier dirección de memoria.
Hasta ahora en todas las implementaciones de SSE2, la primera instrucción es muchisimo más eficiente que la segunda, tanto que Intel recomienda no usar MOVUPD y reemplazarla por dos lecturas secuenciales.
A la hora de programar, el alineamiento es un lio, por que no siempre es posible saber (para el compilador o para el programador) si la dirección de memoria está o no alineada y por lo tanto hay que usar MOVUPD o hacer malabares para tener direcciones alineadas.
Pero en Barcelona, MOVUPD cuesta escencialmente lo mismo que MOVAPD y por lo tanto permite un mayor rendimiento, flexibilidad a la hora de programar y aprovechar mejor la unidad de punto flotante, que requiere usar vectores SSE completos.
Probablemente esto no se verá reflejado de inmediato en el rendimiento, por que los programas y compiladores estan optimizados para usar MOVAPD, pero a futuro probablemente se verá.
Nota: Aca usé como ejemplo MOVAP/MOVUPD, pero lo mismo es valido para las otras versiones de estas instrucciones: MOVUPS y MOVDQU.