GPU code
WOLFGPU est une version GPU du code WOLF2D. Il est écrit en Python et OpenGL 4.6.
Architecture
Le code GPU peut s’appuyer sur deux structures d’entrée différentes:
une modélisation WOLF2D compatible avec le Fortran, ce qui permet de réutiliser des modélisations existantes
une structure plus simple, appelée “SimpleSimulation”, qui permet de le mettre en place facilement par l’API
Une instance GLSimulation est créée à partir de l’une de ces structures. Cette instance est ensuite utilisée par le SimulationRunner pour piloter la simulation.
Les résultats sont affichés en temps réel dans une fenêtre OpenGL.
Le reporting des résultats est géré par le ResultStore qui assure l’écriture et la relecture des inconnues de calcul mais également des métadonnées associées (pas de temps, temps total simulé…).
Note
Les résultats sont actuellement stockés sous la forme de matrices Numpy au format Compressed Sparse Row.
Ceci peut cependant évoluer sans préavis. La rétro-compatibilité sera assurée via le ResultStore uniquement.
Une autre classe Python gère l’affichage des résultats dans la fenêtre graphique du viewer. Cette classe peut potentiellement mettre les résultats en cache afin d’accélérer l’analyse sur plusieurs pas de temps.
Synthèse des fonctionnalités (GPU)
Schéma de discrétisation en espace : volumes finis
Méthode de reconstruction des inconnues : constante par maille
Lois de frottement : Manning/Strickler
Discrétisation spatiale : grillage cartésien, taille de maille unique
Discrétisation temporelle : RK21, RK22
Précision de calcul : virgule flottante simple précision (32 bits)
Conditions aux limites : débits spécifiques, hauteurs d’eau, altitude de surface libre, Froude
Zones d’infiltration/exfiltration : nombre illimité, interpolation linéaire ou constant par palier
Mise à jour de la topographie en cours de calcul : oui
Note
Le pas de temps est calculé automatiquement par le code en fonction de la vitesse de propagation des ondes de gravité et de la vitesse de l’écoulement. Il est possible de spécifier un nombre de Courant cible pour ajuster la stabilité du calcul.
Ordre de grandeur :
vitesse de calcul : 500 millions de mailles / seconde en RK22 sur un processeur Intel i9 et carte RTX3090
pas de temps : de 0.01 à 0.1 seconde pour des écoulements de type crue sur maillage de 1 mètre
Benchmarking
Une option de benchmarking est disponible pour tester les performances du code sur différentes cartes graphiques.
Le benchmarking consiste à exécuter le code sur des grilles carrées de tailles:
512 x 512
1024 x 01024
2048 x 2048
4096 x 4096
5120 x 5120
6144 x 6144
7168 x 7168
8192 x 8192
Le problème est un bac aux parois impermaéables avec une hauteur d’eau initiale nulle, sauf sur une colonne centrale.
Les résultats sont enregistrés dans un fichier CSV.
Note
Pour information, la machine de test la plus puissante est équipée du matériel suivant:
processeur Intel i9-12900KF (16 coeurs)
carte mère Asus Prime Z690-P
128 Go DDR5 4800
Disque SSD Samsung 980 Pro 1To + HDD WD 4To
Windows 11 Pro 64 bits
Cinq cartes graphiques ont été testées sus Windows10/11:
Nvidia RTX3090 (PC ci-dessus)
Nvidia RTX3060
Nvidia RTX4060
Nvidia GTX1080Ti
Intel Iris Xe (Portable Surface Pro 8)
Les caractéristiques des cartes graphiques sont les suivantes:
Le graphique suivant montre les performances des différentes cartes sur base du nombre de noeuds calculés par seconde en fonction de la taille du problème.
Note
Il est possible d’obtenir un code plus rapide en exploitant certains paramètres liés notamment à la gestion de l’assèchement (-dry-up-loops) ou au tiling (-tile-size ; -no-tiles-packing). Il est toutefois du ressort du modélisateur de faire ces choix en connaissance de cause.
Des travaux sont encore en cours afin de poursuivre l’optimisation du code (utilisation mémoire et vitesse pure).
Exécution de l’application
L’application peut être exécutée en utilisant la commande suivante :
wolfgpu
Il est également possible de lancer le code via un appel python:
python -m wolfgpu.cli
Il est possible de spécifier des options pour l’application. Pour obtenir la liste des options disponibles, il est possible d’utiliser la commande suivante :
wolfgpu --help
Scenario intégré :
Exécution du scenario “cube drop” disponible avec le code
Note
Ceci est peut-être anodin pour certains mais il est bon de remarquer que le code reste totalement symétrique sur toute la durée de l’exécution.
Premier modèle
Un modèle simple sur base d’un Jupyter Notebook
est disponible.
Ce fichier illustre les étapes pour préparer les données, lancer le code de calcul et accéder aux résultats par 2 moyens différents.
Exécution de l’application sur une machine équipée de plusieurs cartes graphiques
A l’heure actuelle, l’application wolfgpu n’exploite qu’une seule carte graphique. Seules les cartes NVidia (GTX ou supérieure) et une carte intégrée Intel ont été testées.
Warning
Toute carte avec des capacités OpenGL 4.6 devrait pouvoir exécuter le code.
Toutefois, la compilation du code est effectuée sur la carte et par le driver du constructeur. Il n’est donc pas possible de garantir le bon fonctionnement de l’application sur toutes les cartes graphiques du marché.
De même, l’implémentation des opérateurs mathématiques dépend également du constructeur de la carte graphique. Aucune garantie de reproductibilité totale, c’est-à-dire une stricte comparaison binaire des résultats pour plusieurs exécutions succesives ou sur des machines différentes, n’est donc possible sans test approfondi du matériel.
Si la machine est équipée de plusieurs cartes graphiques, il est normalement possible de spécifier la carte à utiliser en utilisant le panneau de contrôle (par exemple “NVidia Control Panel”) et en particularisant la carte à utiliser pour le rendu OpenGL.
Cette option est normalement disponible pour un exécutable en particulier.
Note
Afin de le rendre applicable sur nos PC, il a été nécessaire de dupliquer l’exécutable python.exe, par exemple python1.exe, python2.exe…
Après avoir adapté le paramètre “Processeur graphique de rendu OpenGL” dans le panneau de contrôle NVidia, il est possible d’exécuter l’application avec la commande python1.exe -m wolfgpu.cli.
Dupliquer le script wolfgpu.exe ne semble pas fonctionner sans pour autant en avoir déterminé la raison exacte.