Skip to content

026-G12 — optimisation contrôlée de l’assemblage linéaire

Périmètre et décision technique

Le diagnostic Lot-2 identifiait le chemin Python d’assemblage des charges et du bilan load_balance comme premier poste mesurable. Cette optimisation reste limitée à la route linear_static, famille TET4, et conserve la formulation élémentaire, la méthode de résolution, les seuils de convergence, les valeurs par défaut et la taille des blocs d’assemblage.

Les changements autorisés sont :

  • accumulation directe des charges nodales sans vecteur global temporaire lorsque les vecteurs individuels ne sont pas demandés ;
  • voie vectorisée pour les charges de translation contiguës et voie indexée pour les ensembles de DDL mixtes ;
  • cache sensible aux mutations pour les métriques de qualité dépendant uniquement de la géométrie, de la connectivité et des seuils.

Aucune modification de formulation, de physique, de Newton/TL, de contact, de l’eigensolver, de la politique numérique ou des autres gates n’est incluse.

Comparaison A/B

Les deux points ont la même topologie, les mêmes DDL, les mêmes charges et les mêmes conditions aux limites. actual_dofs est la valeur réellement construite par le générateur ; le point demandé 10 000 produit 10 125 DDL.

actual DOFs A assembly (s) B assembly (s) assembly speedup A load balance (s) B load balance (s) B total wall (s) total speedup RSS ratio nnz/checksum
3 000 2.671346 0.400887 6.664× 2.394764 0.000996 1.770523 2.341× 1.0185× equal/equal
10 125 19.296384 1.363555 14.152× 18.149961 0.002477 6.093912 3.993× 1.0047× equal/equal

Les speedups load_balance correspondants sont environ 2 404× et 7 327×. Les checksums de déplacement sont identiques (d1ef…2584f et b0ab…8d3e72), les global_stiffness_nnz sont identiques (95 172 et 338 727), les résidus relatifs sont inchangés (8.5852e-12 et 6.0232e-12) et toutes les métriques sont finies.

Les valeurs complètes et les SHA de provenance sont dans qualification/0_2_6/g12_optimization_evidence.json.

Scaling full solve optimisé

cible DOFs actual DOFs assembly (s) validation mesh (s) load assembly (s) load balance (s) solve (s) wall (s) RSS (MiB) global nnz résultat
3 000 3 000 0.400887 1.226609 0.002586 0.000996 0.019903 1.770523 91.65 95 172 PASS
10 000 10 125 1.363555 4.410178 0.005211 0.002477 0.091505 6.093912 125.29 338 727 PASS
30 000 31 944 4.668655 15.261603 0.011839 0.007941 0.769673 21.351989 240.97 1 233 480 PASS
100 000 107 811 17.097760 54.182970 0.029244 0.029153 3.578757 76.864999 638.49 3 813 789 PASS

Les exposants log-log observés sur ces quatre points sont environ 1.050 pour l’assemblage, 1.487 pour la résolution, 1.056 pour le temps total et 0.544 pour le RSS du processus parent. Ils décrivent cette campagne et ne sont pas des garanties générales pour toutes les topologies ou toutes les familles.

Probes de très grande taille

Les probes 300 000 et 1 000 000 sont explicitement assembly_only : aucune résolution ni construction de charges n’est exécutée.

  • 300 000 demandés : 311 469 DDL, 584 016 éléments, 11 168 199 entrées non nulles, 135 264 268 octets de stockage CSR, 46.278 s d’assemblage et 222.959 s de wall ; PASS, 1 483 046 912 octets de RSS parent.
  • 1 000 000 demandés : arrêt contrôlé après 300 s sans rapport enfant ; RESOURCE_LIMITED, 1 472 012 288 octets de RSS parent. Ce résultat n’est pas présenté comme un succès et n’est pas une exécution full solve.

La politique d’arrêt est 300 s ou 4 GiB RSS dans un processus enfant isolé, avec arrêt après la première limite. Voir scripts/benchmark_g12_assembly.py et qualification/0_2_6/g12_optimization_assembly_probes.json.

Profil et cache

Le profil propre à 10 125 DDL après optimisation donne, avec l’overhead de cProfile, environ 71.43 % pour la validation de qualité du maillage, 23.75 % pour l’assemblage, 0.08 % pour load_balance et 0.89 % pour la résolution. Le goulot mesuré suivant est donc le calcul des métriques de qualité TET4, pas le bilan de charges.

Sur le même modèle et le même LinearStaticSolver, le premier passage a pris 6.810739 s et le second 2.177550 s ; checksum et résidu sont identiques et les deux statuts sont PASS. Le test de mutation de la géométrie invalide le cache et force le recalcul. Le cache ne contient aucune donnée dépendant de l’état de résolution.

Intégrité numérique et validation

La preuve A/B vérifie le statut, le nombre global d’entrées CSR, le checksum de déplacement, le résidu relatif fini et la finitude des métriques. Les tests de charges distribuées et de charges nodales mixtes couvrent la voie générique ; le test de validation vérifie la réutilisation et l’invalidation du cache.

La même commande de suite complète a donné 1 828 PASS / 184 SKIP / 20 FAIL sur c967903… et 1 830 PASS / 184 SKIP / 20 FAIL sur le SHA de mesure 7860ade…; les 20 noms de tests en échec sont identiques. Après extraction du runner, le contrôle final B donne 1 831 PASS / 184 SKIP / 19 FAIL : la seule différence est un test d’audit de pack qui est sensible au snapshot généré par l’environnement. Il n’y a aucun FIX_ONLY_FAILURE ni différence de comportement numérique. Les échecs de release/audit historiques (version publique, audit de publication, registre contrôlé et limite de taille de certains scripts) sont suivis séparément ; ils ne constituent pas une preuve de défaut numérique de cette optimisation. La table A/B et les extraits d’erreurs sont dans g12_optimization_regression_triage.json.

Limites et travaux différés

La cache de métriques TET4 est volontairement limitée aux dépendances géométriques immuables et sensibles aux mutations. La vectorisation d’autres familles, la réduction du coût des métriques qualité, la normalisation des DDL et toute optimisation sparse sont différées : elles nécessiteraient une nouvelle campagne et ne sont pas présumées sûres par cette preuve.

Cette preuve G12 ne ferme pas automatiquement une gate globale et ne change aucune maturité d’élément ou de route.