Cela a probablement à voir avec les conflits dans votre cache L2.
Les erreurs de cache sur matice1 ne sont pas le problème car elles sont accessibles de manière séquentielle. Cependant pour matice2 si une colonne complète tient dans L2 (c'est-à-dire lorsque vous accédez à matice2 [0, 0], matice2 [1, 0], matice2 [2, 0] ... etc, rien n'est expulsé) alors il n'y a pas de problème avec le cache manque non plus avec matice2.
Maintenant, pour aller plus loin dans le fonctionnement des caches, si l'adresse d'octet de votre variable est X, que la ligne de cache serait (X >> 6) & (L - 1). Où L est le nombre total de lignes de cache dans votre cache. L est toujours une puissance de 2. Le six vient du fait que 2 ^ 6 == 64 octets est la taille standard de la ligne de cache.
Maintenant qu'est-ce que cela signifie? Eh bien, cela signifie que si j'ai l'adresse X et l'adresse Y et que (X >> 6) - (Y >> 6) est divisible par L (c'est-à-dire une grande puissance de 2), ils seront stockés dans la même ligne de cache.
Maintenant, pour revenir à votre problème quelle est la différence entre 2048 et 2049,
quand 2048 est votre taille:
si vous prenez & matice2 [x, k] et & matice2 [y, k] la différence (& matice2 [x, k] >> 6) - (& matice2 [y, k] >> 6) sera divisible par 2048 * 4 (taille de flotteur). Donc une grande puissance de 2.
Ainsi, en fonction de la taille de votre L2, vous aurez beaucoup de conflits de ligne de cache et n'utiliserez qu'une petite partie de votre L2 pour stocker une colonne, vous ne pourrez donc pas réellement stocker la colonne complète dans votre cache, vous obtiendrez ainsi de mauvaises performances. .
Lorsque la taille est de 2049, la différence est de 2049 * 4, ce qui n'est pas une puissance de 2, vous aurez donc moins de conflits et votre colonne s'intégrera en toute sécurité dans votre cache.
Maintenant, pour tester cette théorie, vous pouvez faire deux choses:
Allouez votre matrice matrice2 comme celle-ci matice2 [razmor, 4096], et exécutez-la avec razmor = 1024, 1025 ou n'importe quelle taille, et vous devriez voir de très mauvaises performances par rapport à ce que vous aviez auparavant. En effet, vous alignez de force toutes les colonnes pour qu'elles soient en conflit les unes avec les autres.
Ensuite, essayez matice2 [razmor, 4097] et exécutez-le avec n'importe quelle taille et vous devriez voir de bien meilleures performances.