commit:2011:04_05
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
commit:2011:04_05 [2011/04/05 14:44] – créée boman | commit:2011:04_05 [2018/05/04 16:34] (current) – [Commit] boman | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Commit 2011-04-05 ====== | ||
+ | |||
+ | ===== Intel TBB ===== | ||
+ | |||
+ | J'ai remis un coup sur mon travail FABULOUS pour avancer un peu sur le parallélisme dans Metafor. Depuis un bout de temps, j' | ||
+ | * OpenMP est initialement prévu pour du FORTRAN. Il est bien sûr possible de l' | ||
+ | * OpenMP (2.x ou 3.0) n'est pas utilisable avec tous les compilateurs. Par exemple, gcc 4.1 sous '' | ||
+ | * Même en OpenMP 3.0, les problèmes ne sont pas résolus: le code doit être rendu tout laid pour fonctionner et le support des tâches complexes (récursion par exemple) reste extrêmement limité. | ||
+ | * Les perfs OpenMP sous Windows sont abominables (un peu moins avec le compilateur Intel que personne utilise sauf moi). Mon rapport FABULOUS en témoigne. | ||
+ | * Linux a vraiment du mal à gérer les threads sur les machines NUMA. C'est encore pire quand l' | ||
+ | |||
+ | dans ce contexte bien décevant, j' | ||
+ | * TBB est conçu pour le C++ avec une philosophie très comparable à la STL de Stroustrup. Les boucles C++ un peu tordues comme nous en avons dans Metafor sont par exemple tout à fait envisageables. Elles doivent néanmoins être réécrites, | ||
+ | * TBB est utilisable avec tous les compilateurs (gcc 4.1 et le msvc de bilou!). On peut donc même se passer du compilateur Intel dont la nouvelle version n'est toujours pas vraiment supportée par Incredibuild et qui prend un temps fou pour compiler les wrappers de '' | ||
+ | * Outre les boucles parallèles de base ('' | ||
+ | * Les perfs TBB ont l'air bien supérieures à OpenMP. Mes premiers tests sur des opérations matricielles me donnent de meilleurs résultats qu' | ||
+ | * Le scheduler inclus dans TBB semble beaucoup mieux gérer les machines NUMA et l' | ||
+ | * TBB propose, en plus de son système de tâches, une lib d' | ||
+ | |||
+ | Quels sont les défauts de TBB? | ||
+ | * Il n'est pas possible de compiler sans TBB (du moins sans mettre des ''# | ||
+ | * TBB est GPL ou payant (un peu comme Qt avant Nokia). Comme on aura des licences avec le cluster ça posera pas de problème. Aujourd' | ||
+ | * TBB est propriété d' | ||
+ | |||
+ | Bilan très positif donc! Metafor a été mis à jour et nécessite maintenant TBB. Le nombre de threads est géré en ligne de commande par l' | ||
+ | |||
+ | <note important> | ||
+ | |||
+ | |||
+ | ===== Parallélisation Gen4 ===== | ||
+ | |||
+ | J'ai parallélisé le mailleur Gen4 avec Intel TBB. J'ai pris ça comme un exercice " | ||
+ | Deux routines ont été parallélisées: | ||
+ | * La routine d' | ||
+ | * La routine de recherche d' | ||
+ | |||
+ | <note important> | ||
+ | |||
+ | ===== Amélioration Gen4 ===== | ||
+ | |||
+ | La visu permet de voir l' | ||
+ | |||
+ | ===== Parallélisation de Metafor ===== | ||
+ | |||
+ | Je me suis attaqué à la parallélisation de Metafor. Le solveur linéaire étant déjà parallèle, il fallait paralléliser le calcul des forces et le calcul de la matrice de raideur tangente. Il restera ensuite la détection du contact pour que tout soit parallèle. | ||
+ | |||
+ | ==== Calcul des forces ==== | ||
+ | |||
+ | Dans Metafor, le calcul des forces est effectué par la classe '' | ||
+ | * soit utiliser un '' | ||
+ | * soit utiliser un '' | ||
+ | |||
+ | Actuellement, | ||
+ | |||
+ | Au niveau des exceptions qui peuvent se produire pendant le calcul des forces (plasticité non convergée, jacobien négatif, etc.), l' | ||
+ | |||
+ | Une fois que la boucle d' | ||
+ | * Il existe des variables statiques qui sont utilisées pour accélérer le code en évitant des allocations de mémoire à tout bout de champ. J'ai dû les supprimer... le code série devient donc inévitablement plus lent (8% sur la batterie). | ||
+ | * Les matériaux utilisent des variables temporaires pour permettre le précalcul de certaines grandeurs tout en évitant de retrouver ces grandeurs dans tous les appels de fonction. La solution n'est pas simple à trouver. Il y a plusieurs manières de résoudre le problème. En voici 2 parmi d' | ||
+ | * Soit on laisse une liberté totale au programmeur de matériau (qui, pour la plupart, ne liront jamais ces lignes). Il faut alors dupliquer efficacement le matériau pour chaque thread. C'est faisable mais c'est un gros travail qui risque de provoquer un ralentissement du code. De plus, ça nécessite de coder des constructeurs par copie pour tous les matériaux; ce qui peut être relativement complexe dans les cas où des classes auxiliaires sont utilisées ('' | ||
+ | * Soit on garde un seul "objet matériau" | ||
+ | |||
+ | __Modification au niveau des éléments: | ||
+ | * Modification de '' | ||
+ | * Suppression des variables statiques de l' | ||
+ | * Suppression du caractère statique de '' | ||
+ | |||
+ | __Modifications au niveau des matériaux: | ||
+ | * Suppression des variables membres du matériau utilisées comme variables temporaires de '' | ||
+ | |||
+ | |||
+ | ==== Calcul de la raideur ==== | ||
+ | |||
+ | Pour le calcul de la raideur, il n'y a pas de problème particulier mis à part dans le cas de la matrice de raideur tangente numérique qui ne peut pas être parallélisée actuellement puisque chaque perturbation est directement effectuée dans la base de données, commune à tous les éléments. | ||
+ | |||
+ | C'est l' | ||
+ | |||
+ | |||
+ | ==== ALE ==== | ||
+ | |||
+ | * '' | ||
+ | * L'algo de convection ALE est toujours parallélisé en OpenMP (je préfère modifier ça après le passage de Philippe) | ||
+ | |||
+ | ==== Conclusion sur le parallèle ==== | ||
+ | |||
+ | * Dans la version commitée, seul Gen4 est utilisable en parallèle (je ne le conseille cependant pas puisque le nombre de mailles générées est alors incertain!). | ||
+ | * La boucle d' | ||
+ | * Tous les tests non thermomec avec raideur analytique et utilisant la loi classique de type " | ||
+ | * On observe une perte de perfs qui devra être analysée par la suite (+8% CPU sur la batterie). | ||
+ | * Commencez à réfléchir à vos matériaux si vous comptez utiliser Metafor en parallèle. Ils ne peuvent plus utiliser des variables temporaires stockées directement en tant que variables membres (ou alors protégées par mutex). | ||
+ | * La détection du contact n'a pas été modifiée et elle est donc toujours séquentielle pour un certain temps. | ||
+ | * Dans certains cas, j' | ||
+ | * Le " | ||
+ | |||
+ | |||
+ | |||
+ | ===== Divers ===== | ||
+ | |||
+ | * Correction de bugs dans '' | ||
+ | * Augmentation de la pénalité de '' | ||
+ | * Modif des makefiles de '' | ||
+ | * Modif de '' | ||
+ | * Amélioration du test '' | ||
+ | |||
+ | --- // | ||
+ | |||