Table of Contents

Commit 2016-09-26

Ce commit est pour la parallélisation de la détection du contact et des opérateurs de projection.

Contexte

Jusqu'à présent, il n'était pas possible d'appeler un opérateur de projection depuis plusieurs threads différents puisque nous avions fait l'hypothèse que cette classe était statique pour une entité géométrique. Autrement dit, si on projette dix points sur un arc de cercle, l'opérateur de projection utilisé est toujours le même (même adresse en mémoire) mais ses arguments d'entrée et d'options sont différents en fonction du contexte. Dès lors, on devait à chaque fois le remettre à zéro avant son utilisation et le reconfigurer comme on le voulait avant d'effectuer la projection. Pour éviter deux appels en même temps à cette fonction, nous avions un flag setThisStaticValueIsUsed() pour vérifier si il était utilisé ou pas. Dans le même ordre d'idée, il n'y avait pas de copie/constructor et de assignement operator pour les opérateurs de projection (DISABLE COPY) puisqu'il n'existait qu'une seule instance par entité géométrique.

La première grosse modification fut d'éliminer le flag “setThisStaticValueIsUsed()” et d'ajouter des constructeurs propres pour chaque opérateur de projection et ainsi que le copie/constructor et l'assignement operator.

Après avoir effectué cette modification, j'ai du m'assurer que nous ne modifions pas l'entité géométrique (point commun de tous les opérateurs de projection instanciés) sur laquelle on est en train de projeter. J'ai constaté deux points importants liés aux modifications : la mise à jour des boites et la mise à jour des shortcuts.

Voici un exemple de reliquat pourri qui fut éliminer par ma recherche sur les modifications de l'entité géométrique :

Configuration localConfig(config);
if(config.getConfiguration() != Configuration::LAST_KEPT &&
   config.getConfiguration() != Configuration::FIRST_KEPT)
{
   getSphere().keepPosition(config);
   localConfig.setConfiguration(Configuration::LAST_KEPT);
   localConfig.setNo(0);
   localConfig.setLastKeptConfiguration(config.getConfiguration());
}


if(config.getConfiguration() != Configuration::LAST_KEPT &&
   config.getConfiguration() != Configuration::FIRST_KEPT)
{
    getSphere().releasePosition(localConfig);
}
Il est possible sans problème de paralléliser les opérations de projection à condition de mettre à jour toutes les boites (si elles sont utilisées (Par défaut ce n'est pas le cas !)) et de mettre à jour les shortcuts de l'entité géométrique avant de faire les projections !

Interface

Pour lancer un cas test en parallèle pour le contact, il suffit d'indiquer cette commande là dans notre jeux de données :

ContactInteraction.useTBB()

Performance

Les performances dépendent fortement du cas test mais j'ai utilisé le procédé d'hydroformage (tube T : 4 x 80 x 120) pour faire les comparatifs entre la version en série optimisée des opérateurs de projection (variable statique), la version en série nouvelle des opérateurs de projection (sans variable statique) et la version parallèle. Le solveur linéaire est le DSSSolver.

Fichiers ajoutés/supprimés

[a]:
[r]:

Cas tests ajoutés/supprimés

[a]:
[r]:

gaëtan 2016/09/26 16:00