32 votes

Comment l'architecture du PROCESSEUR évolution virtuelle affectée fonction de la performance de l'appel?

Il y a des années j'ai été l'apprentissage de l'assembleur x86, PROCESSEUR le pipelining, le cache, direction de la prévision, et tout ce jazz.

C'était un conte de deux moitiés. J'ai lu sur tous les merveilleux avantages de la longueur des pipelines dans le processeur, à savoir la réorganisation de l'instruction, de la mémoire cache de préchargement, la dépendance de l'entrelacement, etc.

L'inconvénient, c'est que toute déviation de la norme a été très coûteux. Par exemple, SI un certain processeur AMD dans le début de la gigahertz l'époque avait un 40 cycle de pénalité à chaque fois que vous avez appelé la fonction par l'intermédiaire d'un pointeur (!) et c'était apparemment normal.

Ce n'est pas négligeable "ne vous inquiétez pas à ce sujet" le nombre! Gardez à l'esprit que le "good design" signifie normalement "facteur de vos fonctions autant que possible" et "encoder de la sémantique dans les types de données", ce qui implique souvent des interfaces virtuelles.

Le compromis est que le code qui permet de ne pas effectuer de telles opérations peut obtenir plus de deux instructions par cycle. Ce sont des chiffres on veut avoir à s'inquiéter lors de l'écriture de haute performance code C++ qui est lourd sur l'objet de la conception et de la lumière sur les calculs.

Je comprends que le long-PROCESSEUR pipeline tendance a été d'inversion que nous entrons dans la faible puissance de l'époque. Voici ma question:

La dernière génération de processeurs compatibles x86 souffrent encore massive des sanctions virtuel pour les appels de fonction, mauvais branchement des prédictions, etc?

29voto

osgx Points 28675

Processeur AMD dans le début de la gigahertz l'époque avait un 40 cycle de pénalité à chaque fois que vous avez appelé la fonction

Hein.. donc en gros..

Il y a un "Indirects de la branche de prédiction" de la méthode, qui permet de prédire la fonction virtuelle sauter, SI il y avait la même indirecte saut il y a quelques temps. Il y a encore une pénalité pour la première et mispredicted virt. la fonction sauter.

Ce soutien varie du simple "prédit droit si et seulement si la précédente indirects de la branche a été exactement de même de" très complexe à deux niveaux des dizaines ou des centaines d'entrées avec la détection de périodique alternance de 2-3 adresse cible pour seul indirecte instruction jmp.

Il y a eu beaucoup d'évolution ici...

http://arstechnica.com/hardware/news/2006/04/core.ars/7

première apparition avec le Pentium M: ... indirects de la branche prédicteur.

L'indirects de la branche prédicteur

Car indirects branches de la charge de leur direction générale des cibles à partir d'un registre, au lieu d'avoir immédiatement disponibles comme c'est le cas avec les succursales directes, ils sont notoirement difficiles à prévoir. Core indirects de la branche predictor est un tableau qui stocke les informations de l'historique sur la cible préférée des adresses de chaque indirects de la branche de l'avant la fin de la rencontre. Ainsi, lorsque le front-end de rencontres indirects de la branche et de la prédit que, elle peut demander à l'indirects de la branche prédicteur de le diriger à l'adresse dans le BTB que la direction générale voudrez probablement.

http://www.realworldtech.com/page.cfm?ArticleID=rwt051607033728&p=3

Indirects direction de la prévision a été introduite avec Intel Prescott microarchitecture et plus tard, le Pentium M.

entre 16-50% de l'ensemble de la branche mispredicts étaient indirect (29% en moyenne). La valeur réelle de l'indirects de la branche les erreurs de prédiction est pour beaucoup de nouveaux scripts ou de haut niveau pour les langues, tels que Ruby, Perl ou Python, qui utilisent des interprètes. D'autres communes indirects de la branche les coupables les plus communs comprennent des fonctions virtuelles (utilisé en C++) et des appels à des pointeurs de fonction.

http://www.realworldtech.com/page.cfm?ArticleID=RWT102808015436&p=5

AMD a adopté certaines de ces améliorations, par exemple en ajoutant indirects de la branche prédicteur des tableaux à Barcelone et, plus tard, les processeurs. Cependant, le K8 a plus âgées et moins précis direction des prédicteurs que les Core 2.

http://www.agner.org/optimize/microarchitecture.pdf

3.12 Indirects saute sur les processeurs plus anciens Indirecte des sauts, des appels indirects, et les retombées peuvent aller à une adresse différente à chaque fois. L' méthode de prédiction pour un saut indirect ou indirect appel est, dans les processeurs âgés de plus de PM et K10, il suffit de prévoir qu'il va aller à la même cible que la dernière fois qu'il a été exécuté.

et même fichier pdf, page 14

Indirect saut de prédiction Un saut indirect ou d'appel est un transfert d'instruction qui a plus de deux les cibles. Un programme C++ pouvez générer un saut indirect ou appel avec... une fonction virtuelle. Un saut indirect ou d'appel est généré en assemblée par la spécification d'un registre ou mémoire d'une variable ou d'un tableau indexé en tant que destination d'un saut ou de l'instruction call. De nombreux processeurs de ne faire qu'un BTB entrée pour un saut indirect ou d'appel. Ce qui signifie qu'il sera toujours possible de prévoir d'aller à la même cible, comme il l'a fait la dernière fois. Comme la programmation orientée objet avec polymorphe classes est devenue plus commune, il existe un besoin croissant pour la prédiction des appels indirects à cibles multiples. Cela peut être fait par l'attribution d'un nouveau BTB entrée pour chaque nouveau saut cible rencontrée. L'histoire tampon et le modèle de l'histoire de la table doit avoir de l'espace pour plus d'un bit d'information pour chaque saut de l'incident afin de distinguer plus de deux cibles possibles. Le PM est le premier processeur x86 pour mettre en œuvre cette méthode. La règle de prédiction p. 12 s'applique, avec les modification que le maximum théorique période qui peut être prédite parfaitement mn, où m est le nombre de cibles par indirectes sauter, parce qu'il n'y sont mn différents possibles n-longueur de sous-séquences. Cependant, ce maximum théorique ne peut pas être atteint que si elle dépasse la taille de la BTB ou le modèle de l'histoire de la table.

Agner manuel a une longue description de la branche prédicteur dans de nombreux Processeurs modernes et l'évolution de la prédicteur dans les processeurs de chaque fabricant (x86/x86_64).

Aussi beaucoup de théorique "indirects de la branche de prédiction" méthodes (voir dans Google scholar); même wiki dit quelques mots à ce sujet http://en.wikipedia.org/wiki/Branch_predictor#Prediction_of_indirect_jumps /

Pour les Atomes de l'agner du micro:

La prédiction de l'indirect branches L'Atome n'a pas de modèle prédictif pour des dommages indirects branches selon mes tests. Indirect les branches sont prévus pour aller à la même cible que la dernière fois.

Donc, de faible puissance, indirects de la branche de prédiction n'est pas aussi avancé. Donc, ne Via Nano:

Indirect sauts sont prévus pour aller à la même cible que la dernière fois.

Je pense que la plus courte pipeline de lowpower x86, ont moins de peine, 7-20 les tiques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X