Esto probablemente tenga que ver con conflictos en su caché L2.
Los errores de caché en matice1 no son el problema porque se accede secuencialmente. Sin embargo, para matice2 si una columna completa encaja en L2 (es decir, cuando accede a matice2 [0, 0], matice2 [1, 0], matice2 [2, 0] ... etc., nada se desaloja) que no hay ningún problema con el caché falla con matice2 tampoco.
Ahora, para profundizar en el funcionamiento de los cachés, si la dirección de byte de su variable es X, la línea de caché sería (X >> 6) y (L - 1). Donde L es el número total de líneas de caché en su caché. L es siempre una potencia de 2. El seis proviene del hecho de que 2 ^ 6 == 64 bytes es el tamaño estándar de la línea de caché.
Ahora, que significa esto? Bueno, significa que si tengo la dirección X y la dirección Y y (X >> 6) - (Y >> 6) es divisible por L (es decir, una gran potencia de 2), se almacenarán en la misma línea de caché.
Ahora, para volver a su problema, ¿cuál es la diferencia entre 2048 y 2049?
cuando 2048 es tu talla:
si toma & matice2 [x, k] y & matice2 [y, k] la diferencia (& matice2 [x, k] >> 6) - (& matice2 [y, k] >> 6) será divisible por 2048 * 4 (tamaño de flotador). Entonces una gran potencia de 2.
Por lo tanto, dependiendo del tamaño de su L2, tendrá muchos conflictos de línea de caché y solo utilizará una pequeña porción de su L2 para almacenar una columna, por lo que no podrá almacenar la columna completa en su caché, por lo que obtendrá un mal rendimiento .
Cuando el tamaño es 2049, la diferencia es 2049 * 4, que no es potencia de 2, por lo que tendrá menos conflictos y su columna se ajustará de forma segura a su caché.
Ahora, para probar esta teoría, hay un par de cosas que puedes hacer:
Asigne su matriz matriz matice2 como esta matice2 [razmor, 4096], y ejecute con razmor = 1024, 1025 o cualquier tamaño, y debería ver un rendimiento muy malo en comparación con lo que tenía antes. Esto se debe a que alinea con fuerza todas las columnas para que entren en conflicto entre sí.
Luego pruebe matice2 [razmor, 4097] y ejecútelo con cualquier tamaño y debería ver un rendimiento mucho mejor.