Cómo afecta la alineación de memoria al rendimiento SIMD

Fuentes: Performance impact of Alignment

La alineación de los accesos a memoria influye de forma directa en el rendimiento de cualquier forma de vectorización SIMD, ya sea automática o explícita. Un acceso se considera alineado cuando su dirección es múltiplo del tamaño del acceso (por ejemplo, 64 bytes para un vector de 16 enteros de 4 bytes). Aunque las CPU modernas suelen permitir accesos no alineados casi sin penalización, cuando un acceso cruza una frontera de línea de caché se divide en dos operaciones, lo que puede reducir el rendimiento hasta la mitad si la unidad de memoria es el cuello de botella.

El artículo, basado en benchmarks del autor en el JDK, analiza los casos en los que la alineación importa más. Las pruebas, realizadas en un equipo x64 con AVX-512, muestran un patrón repetitivo cada 16 elementos y revelan una diferencia de rendimiento del 50% entre el mejor caso (cargas y almacenes alineados) y el peor (ambos desalineados). Cuando solo se puede alinear uno de los dos, alinear los almacenes ofrece alrededor de un 20% más de rendimiento que alinear las cargas.

Con vectores de 64 bytes, la diferencia entre alineación y desalineación supera el 100%, mientras que con vectores de 8 bytes se reduce al 20%. Esto se debe a que los vectores más grandes cruzan con mayor frecuencia las fronteras de línea de caché. En máquinas Aarch64 con NEON, el efecto es menor, en torno al 10%, e incluso se observa un comportamiento ligeramente mejor al alinear las cargas. El texto también recuerda que algunas arquitecturas antiguas exigían accesos alineados y que el compilador debía demostrar la alineación para usar instrucciones vectoriales, lo que complica notablemente la vectorización.