Este artículo analiza de forma experimental cómo distintos patrones de acceso a memoria pueden degradar el rendimiento de una CPU al sumar los elementos de un arreglo de 2^26 enteros sin signo de 32 bits. La medición se realiza con el contador de ciclos rdtsc sobre un Intel Core Ultra 7 268V, con huge pages deshabilitadas, y evalúa únicamente el tiempo del bucle de acumulación, no el de generar el patrón.
El acceso lineal, con posiciones [0, 1, 2, ...], se completa en unos 133 millones de ciclos, ya que las CPU están muy optimizadas para lecturas secuenciales. El acceso aleatorio, mediante una permutación Fisher-Yates, tarda 1.570 millones de ciclos, más de diez veces más. A partir de ahí, el texto explora patrones que explotan las debilidades del prebuscador hardware y de la organización asociativa por conjuntos de la caché L1.
Separar los accesos por una línea de caché (64 bytes) obliga a usar solo 4 bytes de cada línea antes de pasar a la siguiente, lo que impide aprovechar la reutilización y eleva el tiempo a 719 millones de ciclos. Separar los accesos por una página completa (4096 bytes) va un paso más allá: bloquea el prebuscador en los saltos entre páginas y, además, hace que direcciones separadas exactamente por 4096 bytes compitan siempre por el mismo conjunto de la L1d, que en esta máquina tiene 64 conjuntos y 12 vías, provocando desalojos continuos. El resultado sube a 1.410 millones de ciclos, un 30% peor que el acceso puramente aleatorio.
El autor concluye que la combinación de saltos inter-página con coincidencia en el mismo conjunto de caché es la receta para maximizar la latencia de memoria, y deja el código disponible en GitHub para reproducir las pruebas.
