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

Contenu supprimé Contenu ajouté
Ligne 207 :
 
Il a existé des cartes graphiques AMD assez anciennes qui utilisaient des processeurs de type VLIW, mais ce n'est plus en odeur de sainteté de nos jours. Si on omet cette exception, les processeurs de shaders sont tous des processeurs SIMD ou des dérivés (la technique dites du SIMT est une sorte de SIMD amélioré). Notons que le jeu d'instruction SIMD utilisé pour coder les shaders a beaucoup évolué dans le temps. Les normes de Direct X et Open GL décrivent l'ensemble des opérations que la carte graphique doit pouvoir réaliser, et cet ensemble a évolué dans le temps. Les premières versions des shaders n'imposaient que quelques instructions très simples, 17 au total, toutes travaillant sur des nombres flottants. Il n'y avait même pas de branchements ou d'accès mémoire proprement dit. Mais avec le temps, l'ensemble s'est étoffé, chaque nouvelle version de Direct X ajoutant de nouvelles instructions aux précédentes. Les shaders actuels sont capables d'effectuer des calculs sur des nombres entiers, des branchements, des accès mémoire, disposent de modes d'adressages typiques des architectures SIMD et même des accès en scatter-gather des architectures vectorielles !
 
Les processeurs de shaders modernes sont de plus des processeurs multithréadés, c'est à dire conçus pour exécuter nativement plusieurs ''threads'' en parallèles, comme nous l'avons vu dans le chapitre sur les architectures multithreadées et l'''hyperthreading''. L'intérêt du multithreading sur une carte graphique tient dans la lenteur les accès mémoire. Les accès mémoire sont très lents sur une carte graphique, car les GDDR des cartes graphiques sont conçues pour avoir un débit absolument énorme mais une latence pas terrible. Après tout, il faut faire un compromis entre latence et débit, et le débit est plus important quand on manipule de très grandes quantités de donnée. Pour mitiger l’impact de la latence, les processeurs de shaders utilisent le multithreading : quand un thread attend la mémoire, le processeur en lance un autre pour combler le temps d'attente avec des calculs. Les processeurs de shaders sont capables de gérer nativement plusieurs dizaines, voire centaines de threads simultanément.
 
La microarchitecture des processeurs de shaders est de plus particulièrement simple. On n'y retrouve pas les fioritures des CPU modernes, tant utiles pour du calcul séquentiel : pas d’exécution dans le désordre, de renommage de registres, et autres techniques avancées. En conséquence, les unités de décodage et/ou de contrôle sont relativement simples, peu complexes. La majeure partie du processeur est dédié aux unités de calcul.
 
[[File:Cpu-gpu.svg|centre|vignette|upright=2.0|Comparaison entre l'architecture d'un processeur généraliste et d'un processeur de shaders.]]
 
Les processeurs de shaders modernes sont de plus des processeurs multithréadés, c'est à dire conçus pour exécuter nativement plusieurs ''threads'' en parallèles, comme nous l'avons vu dans le chapitre sur les architectures multithreadées et l'''hyperthreading''. L'intérêt du multithreading sur une carte graphique tient dans la lenteur les accès mémoire. Les accès mémoire sont très lents sur une carte graphique, car les GDDR des cartes graphiques sont conçues pour avoir un débit absolument énorme mais une latence pas terrible. Après tout, il faut faire un compromis entre latence et débit, et le débit est plus important quand on manipule de très grandes quantités de donnée. Pour mitiger l’impact de la latence, les processeurs de shaders utilisent le multithreading : quand un thread attend la mémoire, le processeur en lance un autre pour combler le temps d'attente avec des calculs. Les processeurs de shaders sont capables de gérer nativement plusieurs dizaines, voire centaines de threads simultanément.
 
===La hiérarchie mémoire d'une carte graphique===