Accès mémoires, prefetchers
Les accès mémoires de l’architecture Core étaient soumis à plusieurs restrictions en termes de performances : le processeur était optimisé pour accéder à des adresses mémoires alignées sur des frontières de 64 octets, la taille d’une ligne du cache. Non seulement l’accès à des données non alignées était peu performant, mais la simple exécution d’une instruction de chargement ou de rangement non aligné était plus coûteuse que celle de la version alignée et ce quelle que soit l’alignement réel des données en mémoire. La raison est que ces instructions généraient plusieurs µops au niveau des décodeurs ce qui diminuait le débit de ce type d’instructions, les compilateurs évitaient donc de générer ce type d’instructions en les substituant par des séries d’instructions moins coûteuses.
Ainsi les lectures mémoires qui étaient à cheval sur deux lignes du cache avaient une pénalité d’environ 12 cycles contre 10 pour les écritures dans le même cas de figure. Les ingénieurs d’Intel ont optimisé ces accès pour les rendre plus rapides : tout d’abord il n’y a plus aucune pénalité à utiliser les versions non alignées des instructions de chargement/rangement dans le cas où les données sont alignées en mémoire, ensuite dans le cas contraire Intel a optimisé ces accès pour diminuer l’impact sur les performances comparé à son architecture précédente.
Des prefetchers plus efficaces
Avec son architecture Conroe Intel était particulièrement fiers de ses prefetchers matériels. Pour rappel le prefetch est un mécanisme consistant à observer les schémas d’accès à la mémoire et, en fonction de ces résultats, à essayer d’anticiper les données qui seront nécessaires plusieurs cycles en avance. L’objectif est de les ramener dans le cache où elles seront accessibles plus rapidement par le processeur tout en essayant de maximiser l’utilisation de la bande passante en l’utilisant lorsque le processeur n’en a pas besoin.
Cette technique offrait des résultats remarquables dans la plupart des applications personnelles, pourtant dans le monde serveur le résultat était souvent une perte de performance. Les raisons de cette inefficacité sont multiples. Tout d’abord les accès mémoires des applications serveurs sont souvent moins faciles à prévoir : ceux d’une base de données par exemple ne sont pas linéaires, lorsqu’une donnée est accédée en mémoire les données suivantes seront moins fréquemment nécessaires ce qui limite l’efficacité des prefetchers. Mais le problème principal venait surtout de la bande passante mémoire dans les configurations multi-socket. Comme nous l’avons vu dans ce cas il y avait déjà un goulot d’étranglement entre les processeurs, mais en plus de ça les prefetchers ajoutaient une pression supplémentaire à ce niveau : lorsqu’un microprocesseur n’accédait pas à la mémoire, les prefetchers se déclenchaient afin d’utiliser la bande passante qu’ils supposaient disponible. Ils n’avaient aucun moyen de savoir qu’à ce moment l’autre processeur pouvait avoir besoin de la bande passante ! Les prefetchers pouvaient donc priver un processeur d’une bande passante qui était déjà une denrée rare dans ce genre de configurations. Pour résoudre le problème Intel n’avait rien de mieux à proposer que de désactiver les prefetchers dans ces situations, autant dire que ce n’était pas vraiment une solution satisfaisante.
Intel affirme avoir résolu le problème mais ne détaille pas le fonctionnement de ses nouveaux algorithmes de prefetch, on apprendra juste qu’il ne sera plus nécessaire de les désactiver dans les configurations serveurs. Dans tous les cas même si Intel n’a rien modifié le simple gain dû à la nouvelle organisation mémoire et à la bande passante plus importante qui en découle devrait limiter l’impact négatif des prefetchers.
- Processeur,
- Intel,
- Core ,
- i7 ,
- Nehalem ,
- architecture
Et la tu prend un dolipran.
Article très complet qui rejoins bien l'article d'Hardware.fr
Je suis pressé de le voir en fonctionnement
Merci!
Après plus de dix ans à vouloir faire mieux que les autres avec une architecture "innovante", Intel revient aux conclusions des ingénieurs de Digital Equipment Corporation : plutôt amusant...
Et la tu prend un dolipran. Article très complet qui rejoins bien l'article d'Hardware.frJe suis pressé de le voir en fonctionnement Merci!
C'est rare mais personnellement, je suis pressé d'acheter
Grosso merdo, c'est le meme nombre que les bits egaux a 1, quoi
En binaire, oui !!
"tout d’abord le buffer est désormais plus important puisqu’il peut stocker 28 instructions"
Ce ne sont pas des instructions mais des µops. De plus, est-ce vraiment sûr qu'un buffer de 28 *ops soit plus gros qu'un buffer de 18 instructions ?
Je me doute que ça doit dépendre des instructions, mais en moyenne ça donnerait quoi ?
Grosso merdo, c'est le meme nombre que les bits egaux a 1, quoi
Oui dans le cas du binaire, mais disons que POPCNT est une version un peu spécifique du poids de Hamming qui recherche dans une chaîne, le nombre de symboles différents du 0 de l'alphabet utilisé. Donc j'ai gardé la définition générique
"tout d’abord le buffer est désormais plus important puisqu’il peut stocker 28 instructions"Ce ne sont pas des instructions mais des µops. De plus, est-ce vraiment sûr qu'un buffer de 28 *ops soit plus gros qu'un buffer de 18 instructions ?Je me doute que ça doit dépendre des instructions, mais en moyenne ça donnerait quoi ?
Tout à fait c'est une bonne remarque, je le précise un peu plus loin ("Le Loop Stream Detector du Nehalem ne stocke donc plus des instructions x86, mais des µop.") et je voulais souligner qu'effectivement le gain pratique était plus faible que ce qu'il semblait au premier abord mais c'était difficile à évaluer.
La grosse majorité des instructions x86 ne génèrent qu'une seule µop c'est la raison pour laquelle il y a 3 décodeurs simples qui ne peuvent traiter que ces instructions contre un seul pour les instructions générant de 2 à 4µop. Comme tu le notes le rapport instruction x86 / µop dépend fortement de l'application, la moyenne qui circule est de 1.36 µop générées par instruction x86. Dans ce cas le buffer est en fait à peine plus grand que celui du Core 2 duo (~20.6 instructions). Cependant ces chiffres sont assez anciens et datent du Pentium III, depuis il y a eu pas mal de progrès en la matière que ça soit au niveau des instructions SSE qui génèrent moins de µops, ou de la fusion (micro et macro) donc le rapport a du baisser. Je pense qu'on peut considérer que ce buffer est l'équivalent d'un buffer x86 de 22 instructions à la louche mais c'est qu'une grossière estimation.
Et vue qu'en plus on évite l'étape de décodage, c'est effectivement tout benef
Moi, ça me rappelle le P4 cette histoire ...
Plus de puissance, plus de puissance, plus de puissance ... Au détriment de la vitesse.
Désolé