Table of Contents
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.
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.
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