Happy birthday ZSet High performance computing dans ZSet F. Feyel & P. Gosselet
Architectures SMP NUMA memory memory memory Distribué memory memory 2 memory memory Hybride memory memory memory memory memory memory
Architectures 3
Architectures cpu cpu exemple AMD Opteron 2218 L1 L1 128 KB, accès en 1-3 cycles horloge L2 L2 main memory Latence disk network 1024 KB, 5-25 cycles horologe 8 GB, 30-300 cycles horloge ~ 12 millisecondes??? Minimiser les accès mémoire, préserver le cache 4
Architecture cpu cpu cpu cpu Intel Xeon E5462 L1 L1 L1 L1 16 KB L2 L2 main memory 2x6 MB 8 GB Votre portable favori repose sur ce schéma! 5
But du HPC CU CU CU CU CU CU CU Objectif du HPC : les faire toutes tourner! 6
Où gagner du temps? Deux grandes étapes dans Z implicite Intégration matériau Résolution du linéaire tangent Accélérer 7 la résolution de ces deux étapes
Deux cas différents cpu cpu cpu cpu L1 L1 L1 L1 L2 Votre portable, votre station de tra L2 main memory memory memory memory memory Votre cluster, calculateur... 8
Multi-threading cpu cpu cpu cpu L1 L1 L1 L1 L2 L2 main memory private memory thread thread private memory shared memory thread private memory 9 private memory thread
Multithreading Utilisation du multithreading «transparent» des librairies mathématiques top 15:10:26 up 11 days, 5:52, 3 users, load average: 5.67, 7.04, 6.99 Tasks: 298 total, 3 running, 295 sleeping, 0 stopped, 0 zombie Cpu(s): 13.9%us, 0.5%sy, 18.7%ni, 67.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 264278748k total, 145068744k used, 119210004k free, 377004k buffers Swap: 16386292k total, 0k used, 16386292k free, 86843244k cached PID USER PR NI VIRT RES SHR S % %MEM TIME COMMAND 18532 marcadon 39 17 20.8g 19g 29m R 198.5 7.6 226,49 Zebulon_cpp_Lin
Attention, dans «top», 100% = 1 coeur Commande shift+1 Tasks: 298 total, 3 running, 295 sleeping, 0 stopped, 0 zombie Cpu0 : 98.1%us, 1.9%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu1 : 1.9%us, 0.0%sy, 0.0%ni, 98.1%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu2 : 0.0%us, 1.9%sy, 0.0%ni, 98.1%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu3 : 1.9%us, 0.0%sy, 0.0%ni, 98.1%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu4 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu5 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu6 : 98.1%us, 1.9%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu7 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu8 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu9 : 0.0%us, 5.8%sy, 94.2%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu10 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu11 : 0.0%us, 1.9%sy, 98.1%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu12 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu13 : 0.0%us, 0.0%sy,100.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu14 : 0.0%us, 0.0%sy,100.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu15 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 264278748k total, 138580980k used, 125697768k free, 377004k buffers Swap: 16386292k total, 0k used, 16386292k free, 86843896k cached
Accélère tout ce qui utilise les fonctions BLAS Donc certains solveurs de Zébulon : dscpack, mumps, dissection Intégration Zrun smp 4 des lois de comportement, utilisation de
Le multithreading, c'est bien : Fonctionne «sans se fatiguer» Fonctionne bien Gains appréciables Par contre, suppose une mémoire partagée Donc restreint à une seule machine / noeud
Les solveurs linéaires directs dans Zset Trois solveurs linéaires creux (aboutis) Sym. DSCPack X Mumps X Dissection X Non-sym. Multithread DD // X X X X X X X D'autres solveurs plus vieux ou expérimentaux, à ne pas utiliser sauf cas particulier Frontal Sparse-direct
DSCPack Le premier solveur linéaire optimisé interfacé dans Zset En interne, pointeurs 32bits, donc limité en taille de problème Ne traite pas les modes rigides Sauf ruse, non utilisable en décomposition de domaines Très performant
Mumps Attention! Mumps ne détecte pas très bien les modes rigides Fonctionne pour des problèmes «pas trop tordus» Utilisation possible en décomposition de domaines (feti ou generic_dd) Mumps est aussi utilisable via la DD, en solveur direct Non extensible, mais plus robuste
Dissection «Dissection» Un nouveau solveur développé à l'onera Parallélisme massif Détection propre des modes rigides Performances similaires à DSCPack Optimisation en cours (Total+Intel)
Comparaison des principaux solveurs linéaires 700 MUMPS DSCPACK DISSECTION 600 Temps (s) 500 400 300 200 100 0 50000 100000 150000 200000 250000 Nb dofs 300000 350000 400000
Comparaison des principaux solveurs linéaires 4.5 4 DISSECTION DSCPACK MUMPS Speedup 3.5 3 2.5 2 1.5 1 1 2 3 4 5 # threads 6 7 8
Mémoire distribuée ZSet ZSet memory memory memory memory ZSet ZSet
Mémoire distribuée Le solveur Mumps Permet de faire du parallélisme en solveur direct ***linear_solver mumps **parallel 4 A lancer via Zrun smpi hostfile hfile cube.inp Intéressant sur des gros problèmes
Exemple, cube 25x25x25 quad, 204 828 ddls Mono-coeur : 194 s Multi-threads (8) : 62 s Parallèle (16 fois mono-thread) : 74 s Avantages facile pour l'utilisateur, fonctionne avec le contact (!), mémoire répartie (plus GROS) Inconvénients Non extensible
Vers l'extensibilité Pour les gros problèmes seule la mémoire distribuée est réaliste (clusters) Protocole MPI : chaque processeur est responsable de ses données et de ce qu'il échange avec les autres MPI send / recv : échanges ciblés MPI All gather / reduce : communications globales Pour obtenir bonnes performances, il faut des algorithmes qui minimisent le partage de données (privilégiant les échanges ciblés et de petites quantités) Deux ingrédients : décompositions de domaine et solveur itératif
Décomposition de domaine sans recouvrement Version mécanique de la partition de graphe : Utilisation de metis/splitmesh/scotch... (****mesher) L'attribution d'un sous-domaine par processeur (virtuel) permet de bien séparer les données Zrun -mpi toto.inp (avec mise en donnée adaptée) L'interface joue un rôle fondamental
Principe Trois groupes d'équations : Équilibre des sous-domaines sous l'effet des chargements imposés et des réactions des voisins Continuité des déplacements aux interfaces Équilibre des réactions (action-réaction) La première équation est un super-comportement qui lie les déplacements d'interface et les réactions Cette équation est satisfaite exactement (grâce à un solveur direct), le sous-domaine devient une boîte noire On Choisit d'une inconnue d'interface principale (dep/effort) puis on itère jusqu'à annuler l'erreur sur la quantité duale
Solveur itératif Deux grandes opérations : Produit opérateur vecteur : calcul local (descente remontée) + échange de vecteur d'interface avec voisin Produit scalaire produit scalaire + somme de scalaire all-to-all Peu de communication mais besoin de synchronisme entre les sous-domaines = équilibrage de charges Efficace si le nombre d'itération varie peu avec la taille des problèmes par sous-domaine 2 H k C (1+log ( )) h
Performance Les méthodes fonctionnent grâce à un préconditionnement à deux échelles Représentation fiable du voisinage immédiat Transmission globale des effets à grande longueur de pénétration. On assure que les problèmes de Neumann soient bien posés.
Exemple : approche primale
Exemple : approche primale u0 =0 Erreur = déséquilibre des réactions
Exemple : approche primale Erreur = déséquilibre des réactions Preconditionneur u0 =0
Exemple : approche primale Correction u1 Erreur = déséquilibre des réactions Preconditionneur u0 =0
Problème d'extensibilité Seul les voisins communiquent, l'information met du temps à se propager
Extensibilité Contrainte d'équilibre des torseurs des efforts extérieurs pour les sous-domaines flottants Initialisation + projection Résolution d'un problème grossier qui équilibre globalement les torseurs extérieurs Principe de Saint-Venant Extensibilité garantie en 2D/3D
Variantes mises en oeuvre Choix de l'inconnue d'interface FETI : efforts BDD : déplacement Mixte : condition de Robin (expérimental) Hybride : choix pour chaque ddl (recherche) Préconditionneurs Variantes optimales et sous-optimales Prise en compte de certaines hétérogénéités Problèmes grossiers (+/-) compliqués (2D/3D) Problèmes grossiers pour plaques (expérimental) Problèmes grossiers type FETIDP/BDDC (expérimental) Utilisable avec n'importe quel solveur itératif Gradient conjugué, GMRes, BiCG Accélérations
Mise en données typique ***linear_solver generic_dd **local_solver mumps no_option **dof_kind *dof all dual **precond lumped **scaling topological **projector_schur none **projector_scaling none **iterative_solver nncg *precision 1.e-06 *max_iteration 50
Quelques performances Passage du plus gros cube possible 375 000 ddl par domaine 1 domaine par noeud 8 threads par domaine
Insertion dans une résolution Les décompositions de domaine sont un solveur linéaire Elles s'insèrent dans n'importe quel processus non-linéaire pour remplacer le solveur tangent Recherches en cours (+/- stables) Résolution de problèmes non-linéaires par sous-domaine Réutilisation de l'information numérique pour accélérer une séquence de résolution (via le recyclage des sous-espaces de Krylov) Vérification de la qualité des calculs (estimation des erreurs de discrétisation)
Accélération Krylov Version linéaire de la réduction de modèle Après chaque résolution, tri de l'information la plus significative et réutilisation (déflation ou préco.) Encapsulage des solveurs classique **iterative_solver nnsrks *eps_srks 1.e-10 *base_solver nncg
Séquence de pb NL Tirage de coefficients matériaux Un speed-up de 40% en temps peut être raisonnablement espéré
Vérification Estimation a-posteriori de la qualité des maillages ZZ2 Erreur en relation de comportement (parallélisé) Objectifs : Donner un critère d'arrêt pour les DD en fonction de la discrétisation Remailler jusqu'à garantir une certaine qualité (en cours) Exploiter l'information pour accélérer les calculs fins
Résultats préliminaires
Zfuture Simplification DD comme solveur linéaire Vérification Accélérations Krylov Stabilisation Et des features actuellement expérimentaux Non-linéaire par sous-domaines Traitement différencié des ddl normaux et tangents Introduction des outils actuellement fonctionnels des derniers raffinements FETIDP pour le 3D Traitement des très grosses hétérogénéités / des interfaces chahutées aussi Remaillage parallèle Contact parallèle Parallélisme en temps