Une architecture unifiée pour la divergence de contrôle et la divergence mémoire en SIMT Sylvain Collange Arénaire, LIP, ENS de Lyon SympA'14 11 mai 2011 Des GPU aux multi-cœurs hétérogènes Hier (2000-2010) Multi-cœurs homogènes GPU Aujourd'hui (2011-...) Intégration CPU+GPU sur puce CPU multi-cœur GPU ? Intel Sandy Bridge AMD Fusion Projet NVIDIA Denver/Maxwell Demain multi-cœurs hétérogènes Différence entre GPU et cœurs optimisés débit? Comment franchir ce pas? Cœurs optimisés latence Cœurs optimisés débit Multi-cœur hétérogène 2 Plan Architecture SIMT Modèle de GPU Gestion de la divergence : solutions existantes Gérer la divergence par PC multiples Motivation Politique d'ordonnancement Proposition d'architecture Unité d'arbitrage Fusion avec l'unité mémoire Résultats 3 Micro-architecture d'un GPU Logiciel Architecture : modèle de programmation multi-thread (SPMD) Microarchitecture SIMT Single Instruction, Multiple Threads Chemins de données en matériel : unités d'exécution SIMD Matériel 4 Architecture SIMT primitive. Musée GalloRomain de St-Romain-en-Gal, Vienne Notre modèle d'architecture SIMT Simplification, sans perte de généralité 1 séquenceur d'instructions n Processing Elements (PE) PE débrayables individuellement Pas de pipeline 1 PE = 1 thread Thread 0 1 instruction PE 0 Thread 1 PE 1 Thread 2 PE 2 Thread 3 PE 3 5 Gestion du contrôle : pile de masques Code Masques 1 bit d'activité / PE x = 0; // Condition uniforme 1111 if(tid > 17) { skip tid=2 tid=0 x = 1; 1111 } // Conditions divergentes if(tid < 2) { push if(tid == 0) { push x = 2; } pop else { push } pop } pop x = 3; tid=1 tid=3 1111 1100 1111 1100 1111 1100 1111 1100 1111 1100 1111 Variante : avec des compteurs d'(in)activité [Keryell-Paris 93] 1000 0100 6 Reconnaître la structure du contrôle? Il suffit de rajouter des instructions… MIPS j jal jr syscall NVIDIA Tesla (2007) NVIDIA Fermi (2010) Intel GMA Intel GMA Gen4 SB (2006) (2011) bar bra brk brkpt cal cont kil pbk pret ret ssy trap .s bar bpt bra brk brx cal cont exit jcal jmx kil pbk pret ret ssy .s jmpi if iff else endif do while break cont halt msave mrest push pop jmpi if else endif case while break cont halt call return fork AMD R500 (2005) jump loop endloop rep endrep breakloop breakrep continue AMD R600 (2007) push push_else pop loop_start loop_start_no_al loop_start_dx10 loop_end loop_continue loop_break jump else call call_fs return return_fs alu alu_push_before alu_pop_after alu_pop2_after alu_continue alu_break alu_else_after …ou de l'inférer dynamiquement [SympA'13] Complexe dans les deux cas AMD Cayman (2011) push push_else pop push_wqm pop_wqm else_wqm jump_any reactivate reactivate_wqm loop_start loop_start_no_al loop_start_dx10 loop_end loop_continue loop_break jump else call call_fs return return_fs alu alu_push_before alu_pop_after alu_pop2_after alu_continue alu_break alu_else_after 7 Plan Architecture SIMT Modèle de GPU Gestion de la divergence : solutions existantes Gérer la divergence par PC multiples Motivation Politique d'ordonnancement Proposition d'architecture Unité d'arbitrage Fusion avec l'unité mémoire Résultats 8 Qu'est-ce qui a changé en 20 ans ? Maspar MP-1 (1990) 1 instruction pour 16 384 PE PE : ~1 mm² en 1,6 µm /1000 NVIDIA Fermi (2010) ×50 1 instruction pour 16 PE PE : ~0,03 mm² en 40 nm Moins de PE mais PE plus gros Contrôle centralisé → contrôle distribué 9 Un compteur de programme / PE Compteurs de programme (PC) Code x = 0; tid= 0 1 2 3 0 0 0 if(tid > 17) { x = 1; } if(tid < 2) { if(tid == 0) { x = 2; PC 1 } else { x = 3; } } Employé dans les GPU Intel (Sandy Bridge, 2011) Structure du contrôle toujours explicite 10 Et du côté des architectures SMT? Fetch-combining R. Kumar, N. Jouppi, D. Tullsen. Conjoined-core Chip Multiprocessing. ISCA04. Partage du fetch entre plusieurs threads Comparaison des PC à chaque cycle T0 PC=4913 (0) mul T1 PC=4720 T2 PC=4913 (0-3) add IF (0-3) store ID (1) (2) mul T3 PC=4913 Fetch à l'adresse 4913 pour les threads 0, 2, 3 (3) mul EX Politique d'ordonnancement des threads inchangée 11 Politique min(SP:PC) Quel thread choisir comme « guide » ? Ordre de parcours du code Structures conditionnelles, boucles Parcours dans l'ordre des adresses min(PC) Fonctions Privilégier le niveau d'imbrication max min(SP) Source if(…) { } else { } Assembleur … p? br else … br endif else: … endif: while(…) start: { … } p? br start … … f(); … call f … void f() f: { … … ret } Ordre 1 2 3 1 2 3 4 1 3 2 12 Plan Architecture SIMT Modèle de GPU Gestion de la divergence : solutions existantes Gérer la divergence par PC multiples Motivation Politique d'ordonnancement Proposition d'architecture Unité d'arbitrage Fusion avec l'unité mémoire Résultats 13 Lecture et distribution des instructions Décodeur PC commun Cache L1 instructions Saut? 1 ligne / cycle PC++ PC, SP individuels Arbitre Instruction PE0 PE1 PE2 PE3 Arbitre : réduction parallèle Actif uniquement lors des instructions de saut Synchronisation conservée le reste du temps 14 Chemin d'accès aux données dans une architecture SIMT typique Décodeur Cache L1 données 1 ligne / cycle Arbitre Données Adresse: ligne de cache PE0 PE1 PE2 PE3 Partage entre PE d'un port dans le cache de données Arbitre : préfixe parallèle Actif uniquement lors des lectures et écritures 15 La revanche de Von Neumann PC++ Cache L1 instructions Cache L1 données Saut? Arbitre Données Instruction PE0 PE1 PE2 PE3 Adresses (code ou données) Unification du parcours des adresses La même unité traite les branchements et les accès mémoire 16 Avant/après : occupation des unités Simulation sous Barra Simulateur d'architecture NVIDIA CUDA Comparaison À pile, explicite (NVIDIA) À pile, implicite (SympA'13) PC multiples (Proposée) Effet secondaire : gain de 2% en efficacité (moyenne géo.) 17 Avant/après : conséquences Piles, compteurs Mémoire O(n), O(log n) n = profondeur d'imbrication 1 port L/E vers la mémoire Exceptions : débordement Sémantique SIMD (Bougé-Levaire) Langages spécifiques PC multiples Mémoire O(1) Pas d'état en dehors des PC/SP Possibilité de suspendre, redémarrer, migrer des threads Sémantique SPMD (multi-thread) Compilateurs adaptés Environnement logiciel classique Jeux d'instructions spécifiques Jeux d'instructions séquentiels 18 Conclusion et perspectives Convergence entre architectures SIMT et Chip MultiThreading CMP SIMD SIMT pile SIMT PC multiples CMT SMT Autres politiques d'ordonnancement Entrelacer / superposer l'exécution de branches Éviter les situations de famines L'ordonnancement choisi n'affecte pas la correction Politique heuristique possible : spéculation Ordonnanceur spéculatif = prédicteur de saut En cas de divergence, le prédicteur a toujours raison 19 Une architecture unifiée pour la divergence de contrôle et la divergence mémoire en SIMT Sylvain Collange Arénaire, LIP, ENS de Lyon SympA'14 11 mai 2011 Exemple: NVIDIA GeForce GTX 580 Niveau physique Niveau logique 16 SM / puce 48 warps / SM 2×16 cores (PE) / SM 32 threads / warp Warp 0 Warp 1 Warp 2 Warp 3 … PE 31 PE 17 Temps PE 16 Warp 46 PE 15 PE 1 PE 0 … … Warp 47 SM 0 SM 15 21 Pourquoi des unités SIMD? Régularité : similarité de comportement entre threads Irrégulier Régulier Régularité de contrôle 1 i=17 Thread 2 3 i=17 i=17 4 i=17 1 i=21 2 i=4 3 i=17 4 i=2 load A[8] load A[0] load A[11] load A[3] Time switch(i) { case 2:... case 17:... case 21:... } Régularité mémoire load A[8] load A[9] load load A[10] A[11] r=A[i] A Memory Rapide Correct « In making a design trade-off, favor the frequent case over the infrequent case. » [HP06] 22 Un pipeline SIMT Partage coopératif Lecture, décodage des instructions Accès mémoire (0-3) load IF T1 (0-3) store ID T2 T3 (0) mul (0) (1) mul (2) mul (1) (2) (3) mul EX (3) Memory T0 LSU Optimisé pour la régularité de contrôle et la régularité mémoire 23 Résumé Choix ordre de Statique parcours / Détection de la reconvergence Pile / compteurs SIMD classique PC multiples Dynamique SympA'13 GPU Intel Sandy Ce travail Bridge 24