Metafor

ULiege - Aerospace & Mechanical Engineering

User Tools

Site Tools


commit:2014:07_09

Commit 2014-07-10

Optimisation du temps CPU des assemblages

Introduction

Au commit 1992, il a été mis en avant que, pour une simulation lagrangienne d’un modèle de profilage de grande taille, la gestion des interactions de contact était responsable d’un large écart de performances en termes de temps CPU. Le temps d’horloge était en effet réduit de 61 % en faveur de la gestion dynamique des interactions. La comparaison des 2 diagrammes de répartition du temps CPU a mis en évidence que ce gap de performances ne provenait pas seulement de la détection du contact mais aussi du calcul des forces internes, externes, d’inertie et de la matrice de raideur.

Objectif

L’objectif de ce commit est double : d’une part, réduire à nouveau le temps de calcul des simulations et d’autre part refermer le gap de performances entre les 2 modes de gestion des interactions de contact du modèle de profilage lagrangien.

Pour ce faire, les opérations d’assemblage de Metafor sont optimisées en éludant les contributions d’assemblage nulles. Les opérations d’assemblage sont donc limitées aux seules contributions non-nulles.

Routines d’assemblage

Les routines d’assemblage de forces de Metafor sont écrites de manière très généraliste. L’assemblage des vecteurs de forces internes, externes et d’inertie est en effet réalisé dans un tronc commun dans le code source. Outre les forces externes d’un élément de contact, il est ainsi possible de demander des forces d’inertie ou internes d’un élément de contact et d’en réaliser l’assemblage dans les vecteurs structuraux. Or, ces derniers sont nuls et l’assemblage de vecteurs nuls est une opération inutilement coûteuse en temps CPU.

Toutefois, dans les routines d’assemblage des vecteurs de forces et de la matrice de raideur, on peut remarquer que l’assemblage n’est réalisé que si l’élément a des forces. Pour ce faire, l’élément interroge la méthode hasForces().

Les réponses de hasForces()

Auparavant, un élément répondait à la question hasForces par le booléen vrai. Pour le cas particulier d’un élément de contact, la réponse était fonction du type d’interaction de contact. Deux cas étaient possibles. Dans le cas d’interaction de contact de type défo-défo ou self contact, la réponse était donnée par le flag de contact. Dans le cas d’interactions de contact de type rigide-défo ou rigide-défo piloté en forces, la réponse était toujours vrai.

Désormais, la dépendance au type d’interactions de contact est éliminée. Un élément de contact répond à la question par le booléen du flag de contact. Grâce à cette modification, les assemblages pour des éléments de contact d’interactions rigide-défo et rigide-défo piloté en forces sont esquivés s’ils n’ont effectivement pas de forces.

Outre la méthode hasForces() au niveau élémentaire, je l’ai ajoutée à un niveau supérieur, c’est-à-dire au niveau de l’interaction. Dans le cas général d’une interaction, la réponse apportée est toujours vrai. Dans le cas d’interactions de contact, la réponse est fonction du type de forces demandées. Si les forces demandées sont des forces externes ou dissipatives, alors la réponse est vraie. Dans le cas contraire, la réponse est faux.

Les utilisations de hasForces()

La méthode hasForces() a aussi un usage autre que celui d’éviter des assemblages inutiles. Elle est utilisée en effet pour la connectivité des ddls (méthodes build() de StrMatrixBase et fillElements() de ConnexionBuilder).

La modification de la méthode hasForces() n’était pas sans conséquence pour la connectivité des ddls dans le cas d’interactions de contact rigide-défo piloté en forces. Plutôt que de renvoyer toujours vrai par la méthode hasForces() pour ce type d’interaction et ainsi perdre les bénéfices de temps CPU, j’ai traité explicitement ce cas dans les méthodes build() de StrMatrixBase et fillElements() de ConnexionBuilder.

Résumé

En bref, l’assemblage est à présent éludé :

  • au niveau de l’interaction pour le calcul des forces internes et d’inertie si l’interaction est de type contact.
  • au niveau élémentaire pour le calcul des forces externes et de la matrice de raideur si l’élément est un élément de contact pour lequel aucun contact n’est détecté.

Analyse et comparaison des performances en temps CPU des simulations de profilage

Les modifications de ce commit apportent un gain indéniable sur le temps de calcul des simulations lagrangiennes de profilage. Pour le même cas-test de profilage que les précédents commits, le temps d’horloge est réduit globalement de 29 % avec une gestion dynamique des interactions de contact. Conformément à nos attentes, le gain est concentré sur le calcul des forces externes, d’inertie et internes et sur le calcul de la matrice de raideur. De plus, on remarque que les secteurs relatifs au temps d’horloge passé dans les routines de calcul des forces internes et d’inertie sont désormais plus petits que celui du calcul des forces externes. Auparavant, le temps de calcul des forces affichait une répartition quasiment égale entre les forces internes, externes et d’inertie.

Assemblage original

Assemblage modifié

En ce qui concerne le gap de performances entre les deux modes de gestion des interactions de contact ‘byRoll’ du modèle de profilage lagrangien, celui-ci est bien réduit. Grâce à l’effet combiné des boîtes gigognes et des modifications opérées dans ce commit, le gap passe en effet de 61 % à 35 % (cf. diagramme ci-dessous). Les performances sont donc en demi-teinte : la réduction du gap est appréciable mais ce dernier reste élevé et plus grand qu’attendu. Il pose à nouveau question. Les performances en termes de temps CPU restent donc à ce jour lourdement émaillées par le nombre important d’éléments de contact dans les simulations lagrangiennes de profilage.

Gestion non dynamique des interactions de contact 'byRoll'

Gestion dynamique des interactions de contact 'byRoll'

Batterie

Dans le cadre de la batterie, on a pu remarquer des temps CPU erratiques sur thorgal. Ils sont listés ci-dessous avec un tri selon la différence absolue de temps CPU.

Test Old New Abs Diff % Diff
fabulous.tests.crashPlan2Blade - User CPU Time 443.63 565.22 121.6 27.4
arcelor.tests.stochastic.parametric.omegaMesh - Opti CPU time 1314.378411 1421.257292 106.9 8.1
abrawal.testsBattery.frequencyAnalysisBlade18ERForce - User CPU Time 1810.71 1892.75 82 4.5
newac.tests.sulzer.aube3DGeoOK - User CPU Time 358.42 417.46 59 16.5
arcelor.tests.stochastic.parametric.omegaMaterial4x200 - Opti CPU time 2266.278791 2324.537401 58.3 2.6
apps.imp.long - User CPU Time 438.78 477.51 38.7 8.8
apps.welding.fsw_3D_CircularPin_ThermoRigidTool - User CPU Time 103.31 141.68 38.4 37.1
apps.qs.maevaSatellite - User CPU Time 321.84 356.97 35.1 10.9
newac.tests.techspace.aube8bRS - User CPU Time 109.86 139.46 29.6 26.9
apps.bImp.cyl3DVP - User CPU Time 543.43 571.54 28.1 5.2
apps.imp.taylor3dPk2Cons - User CPU Time 312.15 338.09 25.9 8.3
apps.composite.impactQuartPlaque - User CPU Time 130.17 153.39 23.2 17.8
newac.tests.techspace.aube8RS - User CPU Time 75.66 96.2 20.5 27.1
apps.biomec.boisdecerf - User CPU Time 61.01 80.75 19.7 32.4
newac.largeTests.techspace.aube3b - Impameta Import CPU 47.54602194 66.171736 18.6 39.2
fabulous.tests.crashPlan2Lame - User CPU Time 449.49 467.78 18.3 4.1
apps.welding.fsw_2D_TriflutePin - User CPU Time 209.96 227.87 17.9 8.5
newac.tests.complexTa.aube1RS_1 - User CPU Time 65.7 82.35 16.6 25.3
apps.externalMeshers.tetgenTest2Regions1 - User CPU Time 49.27 65.32 16 32.6
newac.tests.techspace.aube2b - User CPU Time 99.87 115.82 15.9 16
apps.imp.poteau - User CPU Time 281.95 297.63 15.7 5.6
newac.tests.techspace.aube2RS - User CPU Time 59.64 74.7 15.1 25.3
arcelor.tests.rollForming.profilageF02_10x50x1 - User CPU Time 708.33 723.17 14.8 2.1
newac.tests.techspace.aube7RS - User CPU Time 38.25 52.97 14.7 38.5
apps.bImp.cylPlastLineSearchPk2 - User CPU Time 77.69 92.23 14.5 18.7
newac.tests.complexSn.blisk1_1 - User CPU Time 99.2 113.7 14.5 14.6
arcelor.tests.pst.gent3d - User CPU Time 138.56 152.2 13.6 9.8
apps.bImp.taylor3dPk20P4 - User CPU Time 255.36 268.79 13.4 5.3
newac.tests.snecma.blisk11 - User CPU Time 120.68 134.05 13.4 11.1
newac.tests.snecma.blisk2RS - User CPU Time 94.67 108.03 13.4 14.1
newac.tests.snecma.blisk4RS - User CPU Time 94.99 108.3 13.3 14
apps.bIe.taylor3dImplExplSmg - User CPU Time 76.58 89.67 13.1 17.1
newac.tests.snecma.blisk2 - User CPU Time 99.71 112.18 12.5 12.5
newac.tests.snecma.blisk4 - User CPU Time 99.79 112.01 12.2 12.2
newac.tests.techspace.aube2bRS - User CPU Time 100.07 112.18 12.1 12.1
newac.tests.sulzer.aube3DSulzerNoWearBladeRot1 - User CPU Time 357.86 369.61 11.8 3.3
apps.thixo.hExtrusion - User CPU Time 204.68 215.4 10.7 5.2
apps.imp.taylor2dPk2QuadTri - User CPU Time 33.45 42.94 9.5 28.4
apps.bIe.aube2_VACONSISTANT - User CPU Time 37.63 46.63 9 23.9
apps.externalMeshers.tetgenTest2Regions2 - User CPU Time 49.37 58.26 8.9 18
apps.bImp.bounce3dDss - User CPU Time 24.76 33.34 8.6 34.7
newac.tests.complexSn.testMiseRotation_1 - User CPU Time 98.16 105.03 6.9 7
apps.bImp.cylPlastDiss - User CPU Time 33.31 39.98 6.7 20
arcelor.tests.stochastic.parametric.omegaMaterial - Opti CPU time 415.259547 421.0531619 5.8 1.4
apps.bIe.aube3 - User CPU Time 48.41 53.66 5.2 10.8
apps.bIe.aube3LineSearch - User CPU Time 61.03 65.97 4.9 8.1
apps.imp.chute7000 - User CPU Time 67.01 71.95 4.9 7.4
newac.tests.sulzer.aube2DSulzerUnderWearing - User CPU Time 118.6 123.36 4.8 4
apps.biomec.longBone.boneMaterialMapping - User CPU Time 173.73 178.4 4.7 2.7
fabulous.tests.celluleT1W1wTh4 - User CPU 41.3 45.95 4.7 11.3
apps.biomec.boneRemodeling.femur3D - User CPU Time 107.87 112.41 4.5 4.2
apps.composite.dcb12plis - User CPU Time 90.5 95.01 4.5 5
newac.tests.sulzer.aube2DSulzerGeo2 - User CPU Time 95.77 100.12 4.4 4.5
apps.ie.tireSteering - User CPU Time 102.65 106.96 4.3 4.2
apps.contactMec.contact3dAbradByPointRevSurfSinY - User CPU Time 113.86 118.08 4.2 3.7
apps.bImp.cylPlast - User CPU Time 26.38 30.43 4.1 15.4
arcelor.tests.stochastic.EmboutOmega4x200 - User CPU Time 329.15 333.14 4 1.2
apps.ale.lamiRD - User CPU Time 159.32 163.23 3.9 2.5
apps.bIe.aube2 - User CPU Time 49.63 53.52 3.9 7.8
apps.bImp.cylPlastLineSearchPk2Cons - User CPU Time 83.63 87.56 3.9 4.7
apps.bIe.taylor3dImplExplIrea - User CPU Time 13.8 17.49 3.7 26.7
apps.rupture.tractionGrandeVitesseTrip800Endo - User CPU Time 137.65 141.26 3.6 2.6
newac.largeTests.techspace.aube6 - Impameta Import CPU 21.77063704 25.3786819 3.6 16.6
apps.qs.godetNumisheetHill48v2 - User CPU Time 541.5 544.97 3.5 0.6
arcelor.tests.rollForming.profilUALE - User CPU Time 47.96 51.48 3.5 7.3
geniso.tests.dents - Total CPU time 292.440968 295.922534 3.5 1.2
newac.largeTests.techspace.aube3bRS - Impameta Import CPU 17.23786497 20.680691 3.4 20
apps.bImp.bounce3d - User CPU Time 36.26 39.54 3.3 9
arcelor.tests.complex.springback_1 - User CPU Time 33.05 36.24 3.2 9.7
techspace.tests.impameta.mesh1Fix2 - User CPU Time 115.1 118.29 3.2 2.8
apps.bImp.cylElastFrot - User CPU Time 21.91 25.06 3.1 14.4
apps.bImp.cylPlastLineSearch - User CPU Time 41.5 44.62 3.1 7.5
fabulous.tests.celluleT066W1wTh4 - User CPU Time 28.9 31.97 3.1 10.6
geniso.tests.dents - Surface Mesh Generation CPU time 275.47 278.6 3.1 1.1
apps.contactMec.contact3dAbradByPointRevSurfSinYReverseRot - User CPU Time 108.36 111.37 3 2.8
mtSuperElement.tests.Beam2DCompTY_FY - User CPU Time 23.15 26.12 3 12.8

Fichiers ajoutés/supprimés

 

Yanick Crutzen 2014/07/10

commit/2014/07_09.txt · Last modified: 2016/03/30 15:23 (external edit)