Troisième génération de Streaming Multiprocesseur

La troisième génération SM introduit plusieurs innovations au sein de l’architecture
512 CUDA cores Haute Performance
Chaque SM dispose de 32 processeurs CUDA une concentration quatre fois supérieure au design SM précédent.
Chaque processeur CUDA dispose d’une unité logique arithmétique sous pipeline pour les entiers (ALU) ainsi qu’une unité pour virgule flottante (FPU).
A la différence, qu’au préalable les GPUs utilisaient le standard pour l’arithmétique à virgule flottante de type IEEE 754-1985. L’architecture Fermi utilise le nouveau standard IEEE 754-2008 disposant de l’instruction multiplication-addition (FMA) fusionnée pour simple et double précision arithmétique.
FMA améliore les instructions multiplication-addition (MAD) avec une simple étape finale sans perte de précision dans l’addition. FMA est plus précis que l’exécution des opérations séparées. Pour mémoire le GT200 disposait d’une double précision FMA.
A contrario du GT200 dont la valeur de l’entier ALU était limité à 24-bit de précision pour les opérations de multiplications, Fermi supporte pleinement 32bit de précision pour toutes les instructions, en accord avec les pré-requis des langages de programmation.
Le ALU est optimisé pour les opérations 64-bit et à précision étendu. Beaucoup d’autres sont supportées, comme : Boolean ; shift ; move ; compare ; convert ; bit-field extract ; bit-reverse insert et population count.
16 Unités de chargement/stockage
Chaque SM a 16 unités de chargement/stockage, ce qui permet un calcul de l’allocation des adresses source et destination pour 16 tâches par cycles Supportant par unités la charge et le stockage des données à chaque adresses du cache ou de la DRAM.
Quatre unités de fonctions spéciales
Les « Spécial Function Units (SFUs) exécutent les instructions comme sin, cosine, reciprocal et racine carré. Chaque SFU exécute une instruction par tâche, par cycle ; un ensemble s’exécute sur huit horloges. Le pipeline SFU est découplé de l’unité de répartition (dispatch), ce qui permet à l’unité de répartition de transmettre à une autre unité d’exécution pendant que le SFU est occupé.
Conçu pour la double précision
L’arithmétique à double précision est le cœur des applications HPC comme l’algèbre linéaire, la simulation numérique et la chimie quantique. L’architecture Fermi a été spécialement désignée pour offrir des performances sans précédent dans la double précision ; jusqu'à 16 opérations multiplication-addition fusionnées peuvent être exécutées par SM, par cycle, un bon en avant par rapport au GT200.

Planificateur Dual Warp
Le SM planifie les tâches en groupe de 32 tâches parallèles appelés « warps » (chaînes). Chaque SM dispose de deux planificateurs warp et de deux instructions d’unités de répartition, ce qui permet à deux warps d’êtres assigné et exécutées en même temps.
Le planificateur double du Fermi sélectionne deux warps et assigne une instruction pour chacun des warp à un groupe de 16 cores, 16 unités de chargement/stockage, ou quatre SFUs.
Parce que les warps s’exécutent indépendamment, le planificateur du Fermi n’a pas besoin de vérifier les dépendances du flux d’instruction. En utilisant ce modèle de double-assignation, Fermi réussie des pointes de performances.

Beaucoup d’autres instructions peuvent être doublement assignées.
64KB de mémoire partagée configurable et cache L1
Un des points clé de l’architecture qui permet une grande amélioration aussi bien pour les performances que pour les applications GPU c’est la mémoire partagée on-chip (sur-puce).
La mémoire partagée permet aux tâches au sein d’un même bloc de tâches de coopérer, faciliter la réutilisation des données on-chip et de grandement réduire le traffic off-chip et donc d’économiser de l’énergie.
La mémoire partagée est l’élément déterminant pour beaucoup d’applications hautes performances CUDA.
A titre de comparaison le G80 et le GT200 ont 16KB de mémoire partagée par SM. Dans l’architecture Fermi, chaque SM a 64KB de mémoire on-chip qui peuvent être configurés à 48KB de mémoire partagée avec 16KB de cache de niveau 1 (L1) ou a 16KB de mémoire partagée avec 48KB de cache L1.
De par le triplement des yields de mémoire partagée, les applications gourmandes en mémoire partagée se retrouvent avec des améliorations de performances significatives.
En fait, les applications et logiciels comme les gestionnaires de cache, peuvent prendre avantage du cache hardware, pendant qu’ils peuvent toujours accéder au 16KB de mémoire partagée.
Encore plus fort, les applications qui n’utilisent pas la mémoire partagée, bénéficient automatiquement du cache L1, permettant la construction de programmes CUDA haute performance en un minimum de temps et d’efforts.
Résumé


