Les processeurs vectoriels , certaines architectures SIMD (telles que AVX2 et AVX-512 ) et les GPU en général utilisent intensivement la prédication, en appliquant un bit d'un masque conditionnel aux éléments correspondants des registres vectoriels traités. En revanche, la prédication scalaire dans les jeux d'instructions scalaires ne nécessite qu'un seul bit de prédicat. L'intérêt majeur des masques de prédicat en traitement vectoriel réside dans la possibilité, grâce à un tableau de codes de condition (un par élément vectoriel), de réinjecter des masques de prédicat qui sont ensuite appliqués aux instructions vectorielles suivantes.
des programmes informatiques contiennent du code conditionnel , qui ne s'exécute que sous certaines conditions, en fonction de facteurs imprévisibles, comme par exemple les entrées de l'utilisateur. La majorité des processeurs exécutant simplement l' instruction suivante dans une séquence, la solution traditionnelle consiste à insérer des instructions de branchement permettant au programme de bifurquer conditionnellement vers une autre section de code, modifiant ainsi l'étape suivante. Cette solution était suffisante jusqu'à ce que les concepteurs cherchent à améliorer les performances en implémentant le pipeline d'instructions , une méthode ralentie par les branchements. Pour une description plus détaillée des problèmes rencontrés et une solution courante, voir l'article « Prédicteur de branchement » .Heureusement, l'un des modèles de code les plus courants qui repose normalement sur des branchements a une solution plus élégante. Considérez le pseudocode suivant :
- Les fonctions traditionnellement calculées à l'aide d'opérations arithmétiques simples et d'opérations bit à bit peuvent être calculées plus rapidement à l'aide d'instructions prédicatives.
- Les instructions prédicées avec des prédicats différents peuvent être combinées entre elles et avec du code inconditionnel, permettant une meilleure planification des instructions et donc des performances encore meilleures.
- L'élimination des instructions de branchement inutiles peut accélérer l'exécution des branchements nécessaires, tels que ceux qui constituent les boucles, en réduisant la charge sur les mécanismes de prédiction de branchement .
- Élimination du coût d'une mauvaise prédiction de branchement, qui peut être élevé sur les architectures profondément pipelinées.
- Les jeux d'instructions qui possèdent des codes de condition complets générés par les instructions peuvent réduire davantage la taille du code en utilisant directement les registres de condition dans ou comme prédication.
Inconvénients
Le principal inconvénient de la prédication réside dans l'espace mémoire supplémentaire qu'elle requiert. Dans les implémentations classiques, chaque instruction réserve un champ de bits pour le prédicat, spécifiant les conditions d'exécution de cette instruction. Lorsque la mémoire disponible est limitée, comme sur les systèmes embarqués , ce coût en espace peut s'avérer prohibitif. Cependant, certaines architectures, telles que Thumb-2, parviennent à contourner ce problème (voir ci-dessous). Parmi les autres inconvénients, on peut citer :
- La prédication complexifie le matériel en ajoutant des niveaux de logique aux chemins critiques et peut potentiellement dégrader la fréquence d'horloge.
- Un bloc prédité inclut des cycles pour toutes les opérations, de sorte que les chemins plus courts peuvent prendre plus de temps et être pénalisés.
- Une lecture de registre supplémentaire est nécessaire. Une addition non prédite lit deux registres dans un fichier de registres, tandis qu'une addition prédite doit également lire le fichier de registres de prédicat. Cela augmente les risques d'erreur lors d' une exécution hors séquence .
- La prédication n'est généralement pas spéculée et entraîne une chaîne de dépendances plus longue. Pour des données ordonnées, cela se traduit par une perte de performance par rapport à une branche prévisible.
La prédication est plus efficace lorsque les chemins sont équilibrés ou lorsque le chemin le plus long est le plus fréquemment exécuté, mais déterminer un tel chemin est très difficile au moment de la compilation, même en présence d' informations de profilage .
Histoire
Les instructions prédicatives étaient courantes dans les ordinateurs européens des années 1950, notamment le Mailüfterl (1955), le Zuse Z22 (1955), le ZEBRA (1958) et l' Electrologica X1 (1958). L' IBM ACS-1 de 1967 intégrait un bit de « skip » dans ses formats d'instructions, et le processeur flexible CDC de 1976 intégrait trois bits d'exécution conditionnelle dans ses formats de micro-instructions.
L'architecture PA-RISC de Hewlett-Packard (1986) disposait d'une fonctionnalité appelée nullification , permettant de prédiquer la plupart des instructions par l'instruction précédente. L'architecture POWER d' IBM (1990) proposait des instructions de déplacement conditionnel. Son successeur, PowerPC (1993), a abandonné ces instructions. L'architecture Alpha de Digital Equipment Corporation (1992) intégrait également des instructions de déplacement conditionnel. MIPS a bénéficié de ces instructions en 1994 avec la version MIPS IV ; et SPARC a été étendu dans la version 9 (1994) avec des instructions de déplacement conditionnel pour les registres entiers et à virgule flottante. RISC-V ne disposait initialement d'aucune prédication, mais la version 2.0 de l'ISA non privilégiée l'a intégrée grâce à une extension (Zicond) contenant des instructions de mise à zéro conditionnelle permettant la synthèse d'arithmétique et de sélection conditionnelles.
Dans l' architecture Hewlett-Packard / Intel IA-64 , la plupart des instructions sont prédiquées. Les prédicats sont stockés dans 64 registres de prédicats dédiés ; l'un de ces registres est toujours à vrai, de sorte que les instructions non prédiquées sont simplement des instructions auxquelles on a attribué la valeur « vrai ». L'utilisation de la prédication est essentielle à l'implémentation du pipeline logiciel dans l'architecture IA-64, car elle évite d'avoir à écrire du code séparé pour les prologues et les épilogues.x86 , une famille d'instructions de déplacement conditionnel ( CMOVet FCMOV) a été ajoutée par le processeur Intel Pentium Pro (1995). Ces CMOVinstructions copiaient le contenu du registre source vers le registre de destination en fonction d'un prédicat fourni par la valeur du registre d'indicateur.
Dans l' architecture ARM , le jeu d'instructions 32 bits d'origine offre une fonctionnalité appelée exécution conditionnelle . Celle-ci permet à la plupart des instructions d'être prédiquées par l'un des 13 prédicats, eux-mêmes basés sur une combinaison des quatre codes de condition définis par l'instruction précédente. Le jeu d'instructions Thumb d'ARM (1994) a abandonné l'exécution conditionnelle afin de réduire la taille des instructions à 16 bits. Son successeur, Thumb-2 (2003), a résolu ce problème grâce à une instruction spéciale dont le seul effet est de fournir les prédicats des quatre instructions suivantes. Le jeu d'instructions 64 bits introduit dans ARMv8-A (2011) a remplacé l'exécution conditionnelle par des instructions de sélection conditionnelle.
SIMD, SIMT et prédiction vectorielle
Plus d articles de Worldlex Wiki
Revenez a l index pour explorer davantage de pages sur l histoire, la science, la culture, la geographie et la societe en francais.
Explorer l index