Comment nous avons overclocké CAD COMPASS-3D → Partie 2

Dans la dernière partie, nous avons parlé de la naissance de KOMPAS-3D v18, quelque chose sur la sélection de critères et de modèles pour tester de nouvelles fonctions, et avons également abordé le sujet du rendu dans la version «Basic».
Continuons avec l'histoire de l'option de rendu «Amélioré».


Appeler des appels

Alexander Tulup, programmeur:
«Le principal problème des performances d'affichage de grandes scènes est associé à un grand nombre de soi-disant« appels de dessin ». L'ancienne version du rendu est construite au-dessus du modèle de données mathématiques. Ainsi, pour chaque primitive - points, arêtes, faces - une méthode distincte a été appelée pour son affichage.

Pour chaque appel de tirage, OpenGL (pilote) effectue une série de vérifications, traduisant simultanément les commandes entrantes dans un format compréhensible pour la carte vidéo, après quoi les appels sont ajoutés à la file d'attente et sont déjà exécutés.


Schéma de transfert de commande GPU dans OpenGL ( source )

Avec un grand nombre de détails, le nombre d'appels au CPU augmente tellement que les données n'ont tout simplement pas le temps d'arriver sur la carte vidéo. Nous obtenons une situation où sur une carte vidéo très forte, elle "ralentit" de la même manière que sur une carte moyenne ou plus faible.

Vous pouvez y faire face en réduisant le nombre de rendus (transitions d'états) - regrouper par matériau, combiner une géométrie commune ( instanciation ), etc.

N'oublions pas que de toute la scène, nous n'en voyons qu'une partie. Des algorithmes de détection d'objets invisibles sont applicables ici (abattage tronconique, abattage d'occlusion, etc.)

Inspirés par l'exemple de The Road to One Million Draws et AZDO , nous avons décidé d'emprunter une voie assez inhabituelle: se débarrasser autant que possible des changements d'état côté CPU. Maintenant, presque tout est fait sur la carte graphique. Tous les attributs nécessaires sont directement extraits de la mémoire vidéo tout en puisant dans le shader lui-même ( shader ), ce qui a été rendu possible grâce à l'augmentation de la mémoire vidéo ( VRAM ) et à l'avènement du SSBO .


1000000 de dés

Parmi les avantages de cette approche: la vitesse d'affichage est devenue très élevée. La vitesse n'est limitée que par les capacités du GPU, à savoir la quantité de données qu'il est capable de traiter.

Il a également permis de mettre en œuvre assez efficacement des mécanismes de détourage pour les objets invisibles. Les résultats du contrôle de visibilité sont enregistrés directement dans la mémoire vidéo et à partir de là, les commandes de dessin sont formées en fonction de celles-ci. Autrement dit, du côté du processeur, vous n'avez pas besoin d'attendre.

L'un des principaux inconvénients de cette approche est la grande complexité du développement. Beaucoup doit être mis en œuvre à nouveau, en tenant compte de l'approche choisie. De plus, nous avons souvent dû faire face à une situation où le même code de shader fonctionnait différemment ou ne fonctionnait pas du tout sur les cartes vidéo de différents fabricants. Souvent, cela a été "traité" par la mise à jour du pilote, mais parfois après un long débogage, il était nécessaire de réécrire le code.

Naturellement, les exigences pour la carte vidéo ont également augmenté. La prise en charge d'OpenGL 4.5 est une clé, mais pas la seule exigence.
Ci-dessous, nous présentons les résultats de la vitesse de rendu lors de la rotation de l'assemblage. Rappelons que 24 images par seconde (ips) sont considérées comme des indicateurs confortables pour l'œil humain.
Ci-après, des mesures ont été prises sur un PC avec la configuration suivante:
Processeur: Intel Core i7-6700K 4,00 GHz
RAM: 32 Go
GPU: NVidia Quadro P2000
Système d'exploitation: Microsoft Windows 10 x64 Professional
Tableau 1. Fréquence d'images (images par seconde, ips) sur divers modèles. Plus c'est mieux. Mode d'affichage: Demi-teinte + filaire, mode simplifié désactivé, qualité anti-aliasing: moyenne (MSAA 8x)
ModèleLa quantité
composants
Fréquence d'images, fps
V16.1v17.1v18
image
Voiture
broyage de mosaïque
27644.14.7124,9

PGU-410
1083370,30,428,6

Tombereau de voiture
173421,11.4124,7

Trolleybus
97831,92,4124,9

Marée nord
centrale électrique
484450,30,576,1

L'installation
vide technologique
71891,92,3124,9

Réducteur de navire
centrale électrique
64142.63,6123,9


Ajout de composants à un grand assemblage


Le scénario avec l'ajout de composants à un grand assemblage est finalement devenu le test dit complexe, décrit dans le tableau 2.

Tableau 2. Scénario avec l'ajout de composants à un grand assemblage. Critères de test.
CritèreDescription du critère
Vitesse d'ouverture des fichiersLe composant ajouté à l'assemblage doit être chargé à partir du disque
Vitesse de renduL'assemblage et le composant inséré doivent être positionnés, pour cela vous devez faire pivoter / déplacer / zoomer l'image
Vitesse de sélection des objetsPour créer des contraintes, vous devez sélectionner les objets de base: faces, plans, arêtes, etc.
Vitesse de synchronisation avec l'arbre de constructionLe composant ajouté à l'assemblage et ses interfaces doivent être représentés dans l'arbre de construction
Vitesse de synchronisation du module de spécificationLe composant ajouté à l'assemblage doit être pris en compte dans la spécification.

Dans le tableau, vous pouvez voir les points (dessin, ouverture) qui, dès le début, ont été sélectionnés comme directions d'accélération distinctes. Mais les améliorations nécessitaient d'autres composants.

Un temps important a été pris par synchronisation avec un arbre. Nous avons résolu le problème en implémentant une mise à jour partielle.

Une autre difficulté a été l'impact significatif de la spécification sur les performances de KOMPAS-3D. Dans certains scénarios de test complexes, ce composant était le principal (50% ou plus).
Spécification
La spécification est le module système KOMPAS-3D, qui est responsable de la formation du document de conception du même nom. Il est développé par une équipe distincte.

En particulier, l'équipe a accéléré la synchronisation lors de l'insertion en repensant les mécanismes internes du module de spécification.


Quelques résultats


Ajoutez des composants à l'assemblage «Réducteur de la centrale électrique du navire».


Test complet pour l'assemblage "Réducteur d'une centrale marine".
Les chiffres indiquent: 1 - support, 2 - rondelle, 3 - boulon.

Tableau 3. Temps d'insertion des composants dans un grand assemblage en secondes. Moins c'est mieux.
ComposantActionHeure s
V16.1v17.1v18
Insérer
composant
Bracket

Chargement2.03.02.2
Passer en mode d'appairage0,60,40,4
Premier appariementSélection du premier objet0,41,00,2
Le choix du deuxième objet0,51,10,2
Sélectionnez le bon appariement3.83,61,0
Deuxième appariementSélection du premier objet0,51.40,5
Le choix du deuxième objet0,51.40,2
Sélectionnez le bon appariement3,63.01,2
Troisième appariementSélection du premier objet0,50,50,5
Le choix du deuxième objet0,31,10,3
Sélectionnez le bon appariement3,73.21,1
Confirmer la création d'insertion7.85.22,3
Insert de support total24,224,610.1
Insérer
rondelles
de la bibliothèque
standard
les produits



Première sélection d'appariement6,42,40,4
Sélection de la deuxième paire4.23,10,4
Confirmer la création d'insertion15,79.24.4
Total pour rondelles d'insertion26,314,75.2
Insérer
boulons

Chargement2.02.72.0
Passer en mode d'appairage0,50,50,5
Premier appariementSélection du premier objet0,41,00,2
Le choix du deuxième objet0,41,10,2
Sélectionnez le bon appariement3.42.71,0
Deuxième appariementSélection du premier objet0,41,20,4
Le choix du deuxième objet0,50,50,4
Sélectionnez le bon appariement3,72.91,0
Troisième appariementSélection du premier objet0,51,00,5
Le choix du deuxième objet0,51,00,2
Sélectionnez le bon appariement4.23.91,2
Confirmer la création d'insertion32,55,42.2
Total pour l'insertion des boulons4921,29,8
L'insertion totale des trois composants99,560,525,1


Un test complet peut être considéré comme l'un des scénarios d'édition de l'assemblage (à partir du nombre de scénarios courants).

De plus, la reconstruction de l'assemblage s'est accélérée. Maintenant, si vous modifiez une opération, l'assemblage entier ne sera pas complètement reconstruit - seuls les objets modifiés seront mis à jour. Pour déterminer les opérations dépendantes, c'est-à-dire les opérations dont le résultat pourrait être affecté par le résultat de l'opération modifiée, un algorithme spécial est utilisé pour établir des relations entre les opérations, les corps et les insertions.

Ouverture des assemblages


L'idée principale pour augmenter la vitesse de lecture des fichiers est de faire en sorte que KOMPAS-3D ne lise que ce dont l'utilisateur a besoin pour le moment.

Par exemple:

  • lecture seule de l'exécution en cours pour les insertions d'assemblage,
  • pour les types de téléchargement, lisez uniquement les informations nécessaires: triangulation ou triangulation + résultats ( B-rep ).

Tout cela a nécessité un raffinement de la structure des données dans le fichier afin que ses différentes parties puissent être lues.

Anton Sidyakin, programmeur, chef d'équipe:

«Depuis quelque temps, le fichier KOMPAS-3D est une archive combinant plusieurs fichiers de service. L'un d'eux contient des données de modèle / document d'assemblage organisées en arborescence. La possibilité de naviguer dans cette structure existait déjà. Pour une lecture partielle, il fallait assurer l'indépendance des pièces les unes par rapport aux autres. Ainsi, les parties reçues n'auraient pas dû se référer entre elles, sinon la partie avec le lien serait devenue «inférieure».

Par conséquent, pour plus de détails, il a été possible de séparer les performances du document et les unes des autres. Dans les assemblages, le conteneur d'inserts et de contraintes est mis en surbrillance séparément. A l'intérieur des exécutions, il a également été possible de séparer les données initiales de la construction et les résultats sous forme de triangulation et de corps.



Si nous parlons de types de chargement simplifiés, l'assemblage modifiable est entièrement chargé, et seule la triangulation et, selon le type, la représentation des limites (B-rep) sont chargées à partir de ses insertions. L'affichage des insertions avec des variables externes modifiées dans ce mode était d'une certaine difficulté, car elles étaient précédemment obtenues à la volée en reconstruisant lors de la lecture, et dans les types de chargement simplifiés, il n'y a pas de données pour cela. La solution consistait à noter les résultats de la reconstruction de ces inserts dans l'assemblage. Cela a donné une accélération et en raison du manque de reconstruction.

La division décrite du document en pièces ne permettait de charger dans l'assemblage que les performances sélectionnées dans les inserts.
En plus d'accélérer l'ouverture des fichiers, la lecture partielle a également permis de réduire les ressources consommées - principalement la RAM.

Sur la base des améliorations, un nouveau type de chargement d'assemblage est apparu - «Partiel». Dans ce type de chargement, seuls les résultats (corps, surfaces) et la triangulation sont soustraits du fichier. Le chargement partiel vous permet de créer des paires et est proche en termes de fonctionnalité du chargement complet des composants.

Après avoir implémenté des améliorations sur la lecture partielle, la création de types de chargement personnalisés devient prometteuse.

Indice
Les types de démarrage personnalisés sont des combinaisons de méthodes système pour charger un composant. Cette fonction n'est pas nouvelle, mais les améliorations apportées à la v18 vous permettent d'obtenir des bonus importants de son utilisation.


Pour les composants qui ne sont pas importants pour les futures générations, le type de charge «Vide» peut être appliqué. Il peut s'agir de composants cachés à l'intérieur des autres («vnutryanka»). Dans la version 18, les composants (et les assemblages entiers) avec le type de démarrage «Vide» s'ouvrent presque instantanément.

Tableau 4. Temps d'ouverture des assemblages avec les types de démarrage «Vide» et «Dimension» en secondes. Moins c'est mieux.
ModèleType de téléchargementHeure d'ouverture, s
V16.1v17.1v18

L'installation
vide technologique
Vide12,811,72,5
La taille21,220,82.6

Réducteur de navire
centrale électrique
Vide31,015,97.2
La taille371,5114,87.3


Les composants restants, qui sont nécessaires pour comprendre l'apparence du produit ou qui seront utilisés comme objets de support pour une construction ultérieure, peuvent être chargés «complètement» ou «partiellement».

En tant qu'outil de préparation de types de démarrage personnalisés, vous pouvez utiliser de nouvelles commandes pour sélectionner des composants «invisibles». Nous appliquons la commande puis utilisons le menu contextuel pour changer le type de chargement des composants sélectionnés en «Vide».

Projection


Lors de l'accélération de la projection, nous nous sommes posé la question du filtrage des données reçues en entrée du noyau mathématique.

Tout d'abord, nous avons décidé de filtrer les composants / corps invisibles. À cette fin, le mécanisme d'occlusion-élimination a été utilisé - il vous permet de savoir si le corps qui sera projeté est visible ou s'il se ferme et se trouve à l'intérieur d'un autre corps. Cette opération est effectuée sur le côté de la carte vidéo.

Le plus grand effet sera lors de la création de projections de modèles avec un grand nombre de composants cachés dans des volumes fermés, par exemple:

  • entraînements complexes, boîtes de vitesses, etc.,
  • véhicules
  • les bâtiments
  • armoires avec équipement électrique.

Pour l'inclusion, l'option "Rough projection" est responsable. Le nom n'est pas accidentel - des pièces relativement petites (par exemple, un boulon à l'échelle d'une centrale électrique) peuvent ne pas être projetées à l'échelle d'un assemblage. Pour de nombreux utilisateurs, cette situation conviendra, en particulier dans le cas de la création de dessins dimensionnels et de dessins généraux.

En savoir plus sur l'option Rough Projection.
L'option n'est disponible que pour les projections standard. Pour spécifier des images (sections, sections, vues à distance), la "projection grossière" n'est pas impliquée.


Même sans utiliser cette option, la projection est sensiblement plus rapide par rapport à V16 et v17. Cela a été aidé par des améliorations du côté du noyau mathématique.

Tableau 5. Temps nécessaire pour créer trois projections standard en quelques secondes. Moins c'est mieux.
ModèleIl est temps de créer trois projections standard, s
V16.1v17.1v18
Inclus
brouillon
projection
v18
Éteint
brouillon
projection

L'installation
vide technologique
124,147,512,934,6

Réducteur de navire
centrale électrique
25641038,454,4

Multi-usages
unifié
corps de boîte
99,9123,444,953,5


Toujours en v18, la possibilité de reconstruire des espèces associatives individuelles a été implémentée.

Dans un dessin contenant de nombreuses vues associatives, l'utilisateur a la possibilité de reconstruire des vues individuelles non pertinentes. Par exemple, celui auquel il souhaite ajouter des annotations. Vous pouvez également spécifier les vues créées avec l'option Projection grossière activée.

Reconstruire une vue unique


Cette fonctionnalité ne s'applique pas aux accélérations explicites, mais permet à l'utilisateur de gagner du temps.

Résultat du travail effectué pour accélérer la projection du modèle Installation technologique sous vide dans le dessin:


Dans la partie suivante, nous décrirons comment nous avons accéléré le calcul des caractéristiques de centrage de masse (MTC), la contribution du noyau géométrique c3dlabs aux performances COMPAS-3D, les modifications apportées à C3D Modeler et également le matériel adapté à la v18.

Source: https://habr.com/ru/post/fr447516/


All Articles