Quel type de prédiction de branche est le plus important?

11

J'ai observé qu'il existe deux types différents d'états dans la prédiction de branche.

  1. En exécution superscalaire, où la prédiction de branchement est très importante et se situe principalement dans le délai d'exécution plutôt que dans le délai de récupération.

  2. Dans le pipeline d'instructions, où l'extraction est plus problématique car les instructions ne sont exécutées que plus tard.

Lequel de ceux-ci est très important (comme lequel de ceux-ci compte vraiment dans le CPU de nos jours)? Si les deux sont également importants ou dans le cas où le second est plus important, alors pourquoi n'avons-nous pas deux pipelines d'instructions (probablement de la moitié de la longueur), puis en fonction des branches, choisissez-en simplement une, puis recommencez la population à partir du début?

Kaveh
la source
1
Peut-être que les deux sont importants, selon les circonstances?
Raphael

Réponses:

6

Je ne sais pas quel cas est répandu, mais je voudrais faire quelques réflexions sur votre proposition de pipelines doubles.

Tout d'abord, vous auriez besoin du double du fil qui consommerait le double d'énergie et produirait le double de chaleur lorsqu'il est actif. Bien que non nécessaire, il serait en revanche totalement inutile. On pourrait donc dire que ce n'est pas une bonne utilisation des ressources qui sont rares sur les processeurs modernes.

Plus fondamentalement, à moins que vous ne préfériez une branche basée sur la probabilité, comment savez-vous par quelle version écrire? Si ce n'est pas le cas, vous risquez de ne rien enregistrer car d'autres processeurs devront peut-être attendre votre décision de toute façon. Si vous vous en tenez à l'un d'eux, vous avez essentiellement la même probabilité de retour en arrière et le même coût que vous en avez actuellement.

Faisons un calcul approximatif. Par souci de simplicité, supposons que la gestion de deux pipelines au lieu d'un n'entraîne pas de surcharge de gestion supplémentaire. Le coût attendu (par exemple énergie, chaleur) est avec un pipeline ( c le coût d'exécution de l'une ou l'autre alternative, p la probabilité de retour en arrière et c r le coût de retour en arrière sans le coût d'exécution l'autre alternative) mais soit 2 c ou même 2 c + p c r - soit beaucoupC=c+p(cr+c)cpcr2c2c+pcrplus grand que si p et c r sont relativement petits, et p l' est certainement (pour autant que je sache, les prédictions de branchement modernes ont des précisions supérieures à 90%). Et nous n'obtenons pas beaucoup pour ce coût! Les temps d'exécution attendus sont t + p ( t r + t ) avec un pipeline et t resp. t + p t r avec deux; comme p est petit, le gain de temps est négligeable.Cpcrpt+p(tr+t)tt+ptrp

Raphael
la source
Autant que je sache, Intel a essayé de "lire les instructions des deux côtés de la branche" et même "d'exécuter des instructions des deux côtés de la branche", et a cessé de le faire. Soit parce qu'elle n'a rien gagné, soit parce que le coût et la complexité étaient si élevés qu'ils pouvaient obtenir plus de gains de différentes manières pour le même coût.
gnasher729
@ gnasher729 Et c'était probablement avant que nous apprenions les failles de sécurité liées à des fonctionnalités comme celle-ci?
Raphael
2

Dans un sens, l'effet de la prédiction de branchement est plus critique dans la récupération des instructions car une instruction qui n'est pas récupérée ne peut pas être exécutée.

En ce qui concerne l'exécution des deux chemins d'une branche, cela s'appelle une exécution ardente et a fait l'objet de recherches assez substantielles. Augustus K. Uht et Vijay Sindagi "Disjoint Eager Execution: An Optimal Form of Speculative Execution" (1995) pourraient être dignes d'intérêt.

L'exécution désireuse pose plusieurs problèmes. Pour une spéculation profonde, le nombre de chemins qui doivent être suivis peut augmenter de façon exponentielle (chaque chemin de branche fourchue peut rencontrer une branche). La prédiction de branche est également souvent très précise (> 90% correcte), donc toujours exécuter les deux chemins serait un gaspillage. Une exécution désirée peut également «contaminer» les caches avec du contenu inutile. (Le document mentionné ci-dessus propose une exécution désireuse intelligemment limitée pour éviter certains de ces problèmes.) Une recherche désireuse limitée du chemin alternatif a moins de problèmes et peut être quelque peu intéressante pour réduire le délai de récupération des erreurs de prévision dans les pipelines plus courts.

Une autre approche qui a été proposée consiste à prédire dynamiquement les branches «hamac» (branches courtes vers l'avant qui se joignent au chemin principal du flux d'instructions). Artur Klauser et al., «Dynamic Hammock Predication for Non-predicated Instruction Set Architectures» (1998) pourrait valoir la peine d'être lu pour cette idée. (Hyesoon Kim et al. "Wish Branches: Combination Branchement conditionnel et prédiction pour une exécution prédictive adaptative" propose d'ajouter à une branche ISA qui facilite la prédication des hamacs et étend cette méthode de prédication aux branches de boucle difficiles à prédire.)

Paul A. Clayton
la source
Voilà une réponse vraiment sympa! Merci. :-)