Fonctionnalités exotiques des GPU Sylvain Collange, Marc Daumas et David Defour Paris, 4 décembre 2008 Objectifs Simulateur many­cores type GPU Pour exploration micro­architecturale Existant Simulateurs GPU pour le rendu graphique Attila, UPC Barcelone Simulateurs pour multi­cœurs MPTLSim, Binghamton, NY CellSim, UPC Barcelone 2 Une architecture optimisée débit 200 Débit (Go/s) Intel Core i7 965 50 1,25 3 10 40 Nvidia GTX 280 160 100 Latence (ns) ×8 Bus texture +calcul d'adresse +filtrage +ordonnancement? ×64 L1 Crossbar +TLB 280 L2 380 DRAM ×6 500 ns 3 Conséquences GTX280 / Core i7 965 Puissance de calcul ×5 Débit mémoire×6 Latence ×8 Données en vol = parallélisme ×64 Nombre de registres en proportion Nvidia GT200 30 Kthreads AMD RV770 1,88 Mo 40 Kthreads? 2,50 Mo Défi important dans la conception d'un GPU 4 Composition d'un GPU Nvidia GT200, 576mm2 Coeurs 147mm2 25% Unités de calcul 50mm2 9% Contrôle >34mm2 >6% Registres 23mm2 4% Mémoires locales ~20mm2 ~3% Caches texture ~8mm 2 ~1% ROP RF TP L1C L1I SM TS ? FMA FP64? 8x MAD SP+AI +4MUL 5 Passage à l'échelle Vers le bas : dériver un GPU milieu de gamme à partir d'un GPU haut de gamme Diminuer le nombre de coeurs Nvidia, AMD Diminuer la largeur SIMD AMD, Intel Permet de faire varier le ratio ALU/Tex Nécessité d'une architecture “scalable” 6 Plan Enjeux, contraintes Ordonnancement des threads Registres 7 Masquer les latences : GT200 Assignation des blocs (setup) 32 contextes Ordonnanceur Cache instru­ ctions × 30 cœurs Exécution Cœur 1 Cœur 2 Ordonnanceur SMT distribué 32 voies (warps) / cœur Scalabilité Indépendance par rapport au compilateur Coût 8 Assembleur AMD RV770 ALU 0 x:MUL R1.x, R0.x, C0.x y:MAD T0.x, R0.y, R0.x, C0.z z:MAD ... w:MAD ... t:RCP T0.y, R0.x; 1 z:MAD R0.w, T0.y, T0.x, C0.y t:PREDGT ...; ALU 4 z:MAD ... t:MAD ...; 5 x:ADD ...; ALU 6 w:MAD ...; TEX 2 SAMPLE ... 3 SAMPLE ... JUMP ... ELSE ... LOOP_DX10 ... ENDLOOP ... POP ... Instruction VLIW Clause Programmes distincts ALU, Texture et Contrôle Découpage du code en clauses Langage très dépendant du matériel Évolution naturelle depuis les premiers shaders 9 Masquer les latences : RV770 Ordonnancement des clauses Caches instructions Séquenceur x2 Exécution ... Séquenceur x2 Texture 1 × 10 cœurs ... ... ... Cœur 1 Séq Setup Ordonnanceur centralisé : X clauses = groupes d'instructions Partage de matériel Scalabilité en nombre de cœurs limitée Ordonnanceur SMT x2 wavefronts/SIMD? 10 Plan Enjeux, contraintes Ordonnancement des threads Registres 11 AMD : registres temporaires Une clause ALU est ininterruptible Permet d'utiliser des registres internes aux clauses Partagés entre plusieurs threads Partitionnement statique entre registres extra­clauses et intra­ clauses ALU 0 x:MUL R1.x, R0.x, C0.x y:MAD T0.x, R0.y, R0.x, C0.z z:MAD ... w:MAD ... t:RCP T0.y, R0.x; 1 z:MAD R0.w, T0.y, T0.x, C0.y t:PREDGT ...; ALU 4 z:MUL T0.x, R0.z, r1.x t:MAD ...; 5 x:ADD R1.z, R0.w, T0.x; Réduction du nombre de registres matériels nécessaires 12 Bancs de registres : GT200 8 bancs de registres / coeur 1 banc / unité ? RF 8x8K Horloge / 2 : il faudrait 16 bancs, ou ports de 64 bits SIMD, même adresse pour chaque banc : équivalent à 1 banc avec port de 512 bits 1 banc 512 bits / ensemble de registres ? Test : ordonnancement et aléas indépendants des numéros de registres 1 banc 512 bits / ensemble de warps ? 0 conflit sur ordonnancement round­robin Test : opérandes lus séquentiellement Séparé en 2 x 4 ? Unités de calcul 13 AMD : banc de registres indexable Accès indirect : R[i] ALU 0 x:MOV AR.x, R0.x 1 x:MUL R1.x, R4[AR.x].x, C0.x y:MAD T0.x, R0.y, R0.x, C0.z 2 z:MAD R2[AR.x].w, T0.y, T0.x, C0.y t:PREDGT ...; Implémentation « naturelle » de l'indexage relatif des registres d'entrée/sortie des vertex shaders Le registre d'adresse AR est un vecteur Adresse potentiellement différente pour chaque voie SIMD Solution Nvidia non applicable 14 RV770 4 bancs de registres pour 4 SP Partagés en sous­bancs Un banc par composante X, Y, Z, W 3 opérandes lisibles dans chaque banc, séquentiellement RF 16x16 x1K SP 1 instruction / 4 cycles : 4 sous­bancs par composante 1 cycle pour l'écriture des résultats ? Et l'unité de texture? Calcul 16x5 AMD et Nvidia : exploiter la régularité SIMD pour se ramener à des mémoires multi­bancs, mono­ port 15 AMD : bypass explicite Alternance entre 2 warps Ne suffit pas à masquer la latence d'un aller­retour vers les registres AMD : bypass logiciel 2 registres spéciaux PV et PS : résultats de l'instruction précédente ALU 0 x:MUL R1.x, y:MAD _ , z:MAD ... w:MAD ... t:RCP _ , 1 z:MAD R0.w, t:PREDGT _, R0.x, C0.x R0.y, R0.x, C0.z R0.x; PV.y, PS , C0.y PV.x, R0.z; ALU 4 z:MUL T0.x, R0.z, r1.x t:MAD ...; 5 x:ADD R1.z, R0.w, PV.z; Évite la latence d'une écriture­lecture dans les registres Diminue la charge sur le banc de registres Et matériel Prédication Accès indirect / compteur de boucle Ne gère pas les accès indirects / registres 16 Conclusion Problématiques spécifiques au GPU Hiérarchie mémoire particulière Multithreading massif Espace microarchitural complexe Quantifier l'apport des différentes solutions Encore beaucoup d'inconnues Réponses apportées par le simulateur lui­même 17 Récapitulatif Nvidia GT200 SIMD x32 8 unités / core Superscalaire in­order 2 voies SMT x32 AMD RV770 SIMD x64 16 unités par core VLIW 5 voies Multithreading x64, SMT x2? 18 Langage assembleur GT200 Jeu d'instruction RISC Instructions sur 64 bits ou 32 bits Abstraction des branchements, dépendances Non documenté 19 Unités de calcul Calcul entier introduit tardivement Réutilisation du pipeline FPU Latences ALU élevées Réutilisation du contrôle FPU Latences ALU = latences FPU 20