« Fonctionnement d'un ordinateur/Les architectures à parallélisme de données » : différence entre les versions

Contenu supprimé Contenu ajouté
mAucun résumé des modifications
Ligne 52 :
</gallery>
 
Généralement, les données d'un vecteur sont placées les unes à coté des autres en mémoire et l'instruction peut utiliser le mode d''''adressage absolu'''. Avec le mode d'adressage absolu, les instructions ont juste à préciser l'adresse mémoire d'un vecteur, qui n'est alors qu'un paquet de données contigües en mémoire. Par exemple, si mon processeur manipule des vecteurs de 8 octets, chaque instruction d'accès mémoire utilisant le mode d'adressage absolu va lire ou écrire dans des blocs de 8 octets. L'adresse de départ de ces blocs n'est soumise à aucune contrainte d'alignement, ce qui n'est pas le cas sur les processeurs modernes utilisant des jeux d'instructions comme le SSE, le MMX, etc. La raison à cela est que gérer des accès non alignés en mémoire rend les circuits de lecture/écriture en mémoire plus complexes. En contrepartie, ces contraintes compliquent l'utilisation des instructions vectorielle. Par exemple, un compilateur aura plus de mal à utiliser des instructions de calcul vectorielle en présence de contraintes d'alignement.
Les modes d'adressages possibles pour les instructions d'accès mémoire sont au nombre de trois :
 
Mais d'autres modes de chargements et d'enregistrement de nos vecteurs sont disponibles. On peut notamment citer l'existence d'accès mémoires en stride et en scatter-gather. Ils permettent à une instruction de charger des données dispersées en mémoire pour les rassembler dans un vecteur. L''''accès en stride''' permet de charger ou d'enregistrer les données d'un vecteur qui sont séparées par un intervalle régulier d'adresses. Une instruction d'accès mémoire voulant utiliser ce mode d'accès a besoin de connaitre l'adresse initiale, celle du premier élément de notre vecteur, et la distance entre deux données en mémoire. Ce mode d'accès permet aux instructions de mieux gérer les tableaux de structures, ainsi que les tableaux multi-dimensionnels. Lorsqu'on utilise de tels tableaux, il arrive aussi assez souvent que l'on n'accède qu'à certains éléments tous séparés par une même distance. Par exemple, si on fait des calculs de géométrie dans l'espace, on peut très bien ne vouloir traiter que les coordonnées sur l'axe des x, sans accès sur l'axe des y ou des z. Nos instructions d'accès mémoire en stride permettent à notre processeur de gérer de tels cas efficacement.
* adressage contiguë ;
* adressage en stride ;
* adressage en scatter-gather.
 
Les processeurs vectoriels incorporent aussi un autredernier type d'accès à la mémoire, : le '''scatter-gather'''. !Les accès en Scatter-Gather peuvent être vus comme une généralisation de l'adressage indirect à registre aux vecteurs : chaque élément du vecteur est adressé via adressage indirect. Cet accès demande d'avoir une liste d'adresses mémoires des données. Quand une instruction exécute un accès en scatter, les données présentes dans ces adresses sont rassemblées dans un vecteur, et enregistrée dans un registre vectoriel. Bien sûr, il existe aussi l’inverse : on peut écrire les données d'un vecteur dans des emplacements mémoires dispersés : c'est l'accès en gather. Cet accès sert à mieux gérer les matrices creuses. Dans ces matrices, une grande partie des éléments sont nuls. Dans un souci d'optimisation, seuls les éléments non nuls de la matrice sont stockés en mémoire. Avec ce genre d'organisation, les instructions vectorielles ne seraient pas utilisables sur ce genre de matrices, sans Scatter-Gather
Généralement, les données d'un vecteur sont placées les unes à coté des autres en mémoire. L'instruction a juste à connaitre l'adresse du vecteur en mémoire pour faire la copie dans les registres. Il arrive aussi que l'on accède à certains éléments séparés par une même distance. Par exemple, si on fait des calculs de géométrie dans l'espace, on peut très bien ne vouloir traiter que les coordonnées sur l'axe des x, sans toucher à l'axe des y ou des z. De tels accès sont ce qu'on appelle des accès en stride. L'instruction a juste à dire au processeur de toujours charger la donnée située x cases plus loin, le x étant souvent fourni via l'instruction (il est incorporé dans la suite de de bits de l'instruction).
 
Les processeurs vectoriels incorporent aussi un autre type d'accès à la mémoire, le scatter-gather ! Cet accès demande d'avoir une liste d'adresses mémoires des données. Quand une instruction exécute un accès en scatter, les données présentes dans ces adresses sont rassemblées dans un vecteur, et enregistrée dans un registre vectoriel. Bien sûr, il existe aussi l’inverse : on peut écrire les données d'un vecteur dans des emplacements mémoires dispersés : c'est l'accès en gather.
 
[[File:Cuda4.png|centre|Adressage en scatter-gather]]