Bonjour,
Je fais pas mal de tests sur processeurs Intel (Itanium 2 et Core 2). Avec certains collègues nous nous sommes aperçus de comportements un peu bizarres sur ces processeurs, à savoir : on effectue certains calculs (calcul matriciel, produits scalaires, multiplication de vecteurs par des constantes, etc). Rien que de très normal dans ma branche. Sauf que sur un Itanium 2 Montecito qui a son dernier niveau de cache (L3) à 12 Mo, on commence à avoir un grand nombre de défauts de cache autour de 6-8 Mo. J'ai à ma disposition des versions précédentes du processeur (Madison 3 Mo et 9Mo), et le même comportement peut être constaté sur la version à 9 Mo de cache L3 : ça fuit à partir de 6-8 Mo.
Diagnostic : Intel a rajouté plein de cache sur Itanium 2, mais a oublié (entre autres) d'augmenter la taille des entrées du TLB des données (DTLB niveau 2). C'est une énorme bourde, à laquelle un représentant d'Intel a répondu « no comment » quand un de mes collègues leur a fait remarquer. On pense aussi que certains effets étranges liés au paradoxe des anniversaires fait que les caches de données sont mal exploités (en gros, plutôt que prendre une ligne de cache « vierge », à cause des numéros d'adresse, on se retrouve à écraser une ligne de cache encore utile potentiellement).
Bon, sur canardplus, parler Itanium 2, c'est pas trop intéressant. Mais si je vous dis que sur Core 2 Duo je trouve à peu près le même comportement ? Voici ce que je mesure.
Sur un Xeon Woodcrest (5130) avec 4 Mo de cache, je fuis (défauts de cache en L2) vers 2 Mo. L'hypothèse du paradoxe des anniversaires tient toujours, mais par contre, je n'ai aucune idée de ce qui se passe du côté des TLB du core 2. En cherchant bien sur le net, on finit par voir que le TLB niveau 1 sur C2D fait 256 entrées (256 * 4k = 1Mo, ce qui est loin d'être suffisant pour adresser 4 Mo de cache), mais il semblerait que la taille du TLB de niveau 2 soit inconnue (je suppose qu'elle existe, même si elle est sans doute commune aux deux coeurs d'un même processeur C2D).
Donc voici mes questions :
- Quelqu'un sait-il quelle est la taille du L2D TLB ?
- Mis à part ces deux hypothèses -- TLB trop petit pour adresser toute la mémoire, et adresses trop similaires (en fait, il s'agit des LSB des adresses) et qui finissent par écraser des lignes de cache utiles -- auriez-vous une hypothèse ?
Je trouve que le problème est assez sérieux, étant donné que pour le moment on paie quand même 2 Mo de cache le plus souvent mal exploités non pas à cause des programmeurs (pour une fois ) mais des constructeurs ...