Cela a probablement à voir avec des conflits dans votre cache L2.
Les ratés du cache sur matice1 ne sont pas le problème car ils sont accédés séquentiellement. Cependant, pour matice2, si une colonne complète tient dans L2 (c'est-à-dire que lorsque vous accédez à matice2[0, 0], matice2[1, 0], matice2[2, 0] ... etc, rien n'est évincé), il n'y a pas de problème d'absence de cache avec matice2 non plus.
Maintenant, pour aller plus loin dans le fonctionnement des caches, si l'adresse d'octet de votre variable est X, alors la ligne de cache pour celle-ci sera (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 6 vient du fait que 2^6 == 64 octets est la taille standard d'une ligne de cache.
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), elles seront stockées dans la même ligne de cache.
Pour en 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 du float). Donc une grande puissance de 2.
Ainsi, en fonction de la taille de votre L2, vous aurez beaucoup de conflits de lignes de cache, et n'utiliserez qu'une petite partie de votre L2 pour stocker une colonne, donc vous ne serez pas en mesure de stocker la colonne complète dans votre cache, donc vous obtiendrez 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. Ainsi, vous aurez moins de conflits et votre colonne tiendra en toute sécurité dans votre cache.
Pour tester cette théorie, il y a deux choses que vous pouvez faire :
Allouez votre tableau matice2 comme ceci matice2 [razmor, 4096], et exécutez avec razmor = 1024, 1025 ou n'importe quelle taille, et vous devriez voir de très mauvaises performances par rapport à ce que vous aviez avant. Ceci est dû au fait que vous avez aligné de force toutes les colonnes pour qu'elles entrent en conflit les unes avec les autres.
Essayez ensuite matice2 [razmor, 4097] et exécutez-le avec n'importe quelle taille et vous devriez voir de bien meilleures performances.