Table of Contents

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'étais arrivé à la conclusion que l'utilisation d'OpenMP n'était vraiment pas intéressante pour faire du parallélisme de type SMP en C++:

dans ce contexte bien décevant, j'avais vu quelques infos sur la bibliothèque Threading Building Blocks (TBB) dans les pubs que je reçois d'Intel et ça me semblait plutôt (très) bien ficelé. Je m'étais dit que j'allais essayer, ou plutôt que j'allais faire essayer ça à un TFiste si j'en trouvais un. Finalement, à défaut d'étudiant, j'ai décidé de me lancer moi-même là dedans et le résultat est vraiment très intéressant. Tous les points mentionnés ci-dessous sont résolus:

Quels sont les défauts de TBB?

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'option “-j” ou, dans le jeu de données, par une classe IntelTBB similaire aux classes Blas et OpenMP. Par défaut, si on ne spécifie rien, TBB alloue un nombre de threads qui dépend de la charge machine (et qui peut varier en cours de calcul!). Je me suis donc arrangé pour que TBB n'alloue qu'un seul thread par défaut. Ca permet d'avoir une batterie de test reproductible.

La compilation de Metafor requiert maintenant la présence de Intel TBB dans vos libs

Parallélisation Gen4

J'ai parallélisé le mailleur Gen4 avec Intel TBB. J'ai pris ça comme un exercice “réduit” avant de m'attaquer à Metafor et sa boucle d'assemblage élémentaire. Deux routines ont été parallélisées:

Suite à ces modifs, Gen4 ne produit plus exactement les mêmes maillages.

Amélioration Gen4

La visu permet de voir l'état du maillage pendant de sa construction. L'affichage est mis à jour tous les 0.3 sec. Évidemment, cet affichage ralentit légèrement le mailleur (le thread graphique n'est pas un thread séparé comme dans Metafor - le mailleur est donc arrêté pendant cette mise à jour de l'affichage). Pour obtenir les meilleures perfs, il faut donc désactiver la visu. Par contre, si on l'utilise pour débuguer, on voit enfin ce qui se passe.

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 StrVector et plus particulièrement sa fonction membre generalForce. J'ai modifié la boucle sur les éléments pour qu'elle soit compatible avec TBB. A ce niveau, deux choix étaient possibles:

Actuellement, je me suis orienté vers un parallel_do mais ce choix n'est peut-être pas définitif.

Au niveau des exceptions qui peuvent se produire pendant le calcul des forces (plasticité non convergée, jacobien négatif, etc.), l'exception est interceptée par TBB et convertie en une tbb::exception. On perd donc le type de l'exception (du moins, dans la version actuelle - Intel corrigera ça dans les versions futures). En pratique, ce n'est pas trop grave. L'important est de savoir que ça a merdouillé pour récupérer la sauce.

Une fois que la boucle d'assemblage de StrVector est parallélisée, il faut être certain que les éléments peuvent calculer leurs forces indépendamment les uns des autres. Bien sûr, ca n'a pas marché du premier coup:

Modification au niveau des éléments:

Modifications au niveau des matériaux:

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'objet MatrixStrBase qui se charge du calcul de la matrice. La boucle a été modifiée selon la syntaxe imposée par Intel TBB, avec un spin_mutex pour l'assemblage. Le parallel_do est actuellement désactivé et remplacé par une boucle série qui utilise néanmoins le nouveau contenu de boucle.

ALE

Conclusion sur le parallèle

Divers

Romain BOMAN 2011/04/05 11:35