J'ai refait un test avec des matrices de taille 1000 (soit 12 Mo en mémoire, un peu moins que la taille de L3). Et j'obtiens en faisant plusieurs mesures successives 12.41s, 12.46s, 12.4s... Donc on dirait effectivement que le phénomène de variation du temps d'exécution n'intervient qu'à partir du moment ou j'utilise la RAM.
Voici comment fonctionne mon programme :
Mesure du temps t1
Allocation des matrices (malloc)
Initialisation des matrices
Mesure du temps t2 et affichage de t2-t1
Mesure t3
Calcul de la multiplication
Mesure t4 et affichage de t4-t3
Libération de la mémoire (free)
Avec les matrices de taille 2500 j'obtiens t2-t1=0.05s et t4-t3=260s puis ça diminue vers 110s (voir premier post). J'ai pu vérifier en désassemblant le code que je mesurais les bonnes sections. Cela semble appuyer ma théorie selon laquelle le temps de l'allocation et d'initialisation des matrices est négligeable devant le temps de calcul de la multiplication. A moins que ça soit une illusion de Linux et que l'allocation se fait pendant le calcul. Mais comme j'initialise les matrices avec des valeurs non-nulles, je pense qu'elles sont allouées pendant la phase d'initialisation.
De plus comme tu l'as fait remarquer, le temps d'exécution semble plus lent qu'attendu. Mon cpu ayant une fréquence de 2GHz, avec des matrices de taille 1000 et avec une opération par cycle cpu, il lui faut NbreDeCalculs/Fréquence=1000*1000*2*1000/(2*10(9))=1s pour faire le calcul. Du coup je me demande si il n'y a pas une erreur dans mon programme. Peut-être qu'il ne garde pas les matrices en totalité dans la mémoire ?
Le mystère reste entier pour aujourd'hui :) (PAUSE !!!) En tout cas merci pour tes conseils, ça m'aide à réfléchir.