74 votes

Est-il possible de dire à la direction de la prédicteur comment elle est susceptible de suivre la direction?

Juste pour que ce soit clair, je ne vais pas pour toute sorte de portabilité ici, alors toutes les solutions qui permettront de m'attacher à une certaine zone est très bien.

En gros, j'ai une instruction if qui aura 99% du temps à true, et suis en train de gagner leur dernier horloge de performance, puis-je émettre une sorte de commande du compilateur (à l'aide de GCC 4.1.2 et le x86 ISA, si c'est important) pour dire à la direction de la prédicteur qu'il doit mettre en cache pour la branche?

75voto

hirschhornsalz Points 16306

Oui, mais cela n'aura aucun effet. Les Exceptions sont plus âgés (obsolète) architectures pré Netburst, et même alors, il ne veut pas faire quelque chose de mesurable.

Il y a une branche "hint" opcode Intel introduit avec l'architecture Netburst, et un défaut statique de la direction de la prévision pour le froid sauts (en arrière prédit pris, avant prédit non pris) sur certaines architectures plus anciennes. GCC met en œuvre avec l' __builtin_expect (x, prediction), où la prédiction est généralement de 0 ou 1. L'opcode émis par le compilateur est ignoré à tous les nouveaux processeur architecures (>= Core 2). Le petit coin de cas où cela ne fait que quelque chose est le cas du froid sauter sur l'ancienne architecture Netburst. Intel recommande maintenant de ne pas utiliser la statique de la direction générale des conseils, probablement parce qu'ils considèrent que l'augmentation de la taille du code plus nocif que le possible marginal de la vitesse.

En plus de ce qui est inutile, direction générale de l'indice pour le prédicteur, __builtin_expect a son utilisation, le compilateur peut réorganiser le code pour améliorer l'utilisation du cache ou économiser de la mémoire.

Il y a de multiples raisons, il ne fonctionne pas comme prévu.

  • Le processeur peut prévoir de petites boucles (n<64) parfaitement.
  • Le processeur est capable de prédire les petits motifs répétitifs (n~7) parfaitement.
  • Le processeur lui-même pouvez estimer la probabilité d'une branche au cours de l'exécution de mieux que le compilateur/programmeur lors de la compilation.
  • La prévisibilité (= probabilité qu'une branche obtiendrez prédit correctement) d'une branche est beaucoup plus important que la probabilité que la direction générale est prise. Malheureusement, cela est fortement dépendantes de l'architecture, et de prédire la prévisibilité de la branche est notoirement difficile.

Lire plus sur l'intérieur des œuvres de la direction de la prévision au Agner les Brumes de manuels. Voir aussi la gcc liste de diffusion.

60voto

Drakosha Points 6360

Oui. http://kerneltrap.org/node/4705

L' __builtin_expect est une méthode qui gcc (versions >= 2.96) offrir pour les programmeurs pour indiquer la direction de la la prédiction de l'information à la compilateur. La valeur de retour de __builtin_expect est le premier argument (ce qui ne pouvait qu'être un entier) passé.

if (__builtin_expect (x, 0))
                foo ();

     [This] would indicate that we do not expect to call `foo', since we
     expect `x' to be zero.

32voto

Peter Cordes Points 1375

Comme Drakosha dit, dire à gcc de la branche est le cas le plus courant, de sorte qu'il génère un code de meilleure qualité pour le cas où la direction de la prédicteur est froid, et ainsi de la voie rapide à travers la fonction est facile pour le PROCESSEUR à exécuter, est probablement très utile.

Pour info, Pentium 4 a direction de prédiction-conseils en tant que préfixes de la ccc instructions, mais seulement le netburst microarchitecture jamais rien fait avec eux. Voir http://ref.x86asm.net/geek32.html. Et L'article 3.5 de Agner Brouillard excellent asm opt guide, à partir de http://www.agner.org/optimize/. Il a publié un guide pour l'optimisation en C++, trop.

Pas beaucoup est officiellement publié sur exactement comment la direction générale des prévisions et de la branche cible-tampons dans la plus récente d'Intel et AMD, les Processeurs se comporter. L'optimisation des manuels (facile à trouver sur d'AMD et d'Intel sites web) donner quelques conseils, mais n'avez pas de document d'un comportement particulier. Certaines personnes ont des tests pour essayer de deviner la mise en œuvre, par exemple, combien de BTB entrées Core2 a... de toute façon, l'idée de la consigne le prédicteur explicitement a été abandonné (pour le moment). Ce qui est documenté est, par exemple, que Core2 a une branche de l'histoire de la mémoire tampon qui peut éviter mispredicting la boucle de sortie si la boucle s'exécute toujours une constante court nombre d'itérations, < 8 ou 16 IIRC. Mais ne soyez pas trop prompt à le dérouler, car une boucle qui s'inscrit dans 64bytes (ou 19uops sur Penryn) n'aura pas d'instruction fetch goulets d'étranglement parce qu'il rejoue à partir d'un tampon... allez lire Agner de la Brume des fichiers pdf, ils sont excellents.

7voto

Thomas Matthews Points 79

Je suggère plutôt que de vous inquiéter de la direction de la prévision, de profil, le code et optimiser le code pour réduire le nombre de branches. Un exemple est le déroulement de la boucle et l'autre à l'aide boolean techniques de programmation plutôt que d'utiliser if des déclarations.

La plupart des processeurs amour pour extraire des énoncés. Généralement, une branche de la déclaration de générer une anomalie dans le processeur amenant à rincer la prélecture de la file d'attente. C'est là la plus grande peine est. Pour réduire ce temps de pénalité, de réécriture (et la conception), le code de sorte que moins de branches sont disponibles. Aussi, certains processeurs peuvent exécuter conditionnellement instructions sans avoir à la branche.

J'ai optimisé un programme à partir de 1 heure de temps d'exécution à 2 minutes à l'aide du déroulement de la boucle et grand tampons d'e/S. Direction de la prévision n'aurait pas offert beaucoup d'économies de temps dans ce cas.

1voto

Lothar Points 4740

SUN Studio C a certains pragmas défini pour ce cas.

#pragma rarely_called ()

Cela fonctionne si une partie d'une expression conditionnelle est un appel de fonction ou commence par un appel de fonction.

Mais il n'y a aucun moyen de la balise générique si un énoncé

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