commit:2018:01_26
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
commit:2018:01_26 [2018/01/26 17:39] – crutzen | commit:2018:01_26 [2018/01/29 10:18] (current) – crutzen | ||
---|---|---|---|
Line 11: | Line 11: | ||
Figure 2: Répartition du temps d' | Figure 2: Répartition du temps d' | ||
- | Toutefois, ces petites modifications du code a priori anodines ont débouchés | + | Toutefois, ces petites modifications du code a priori anodines ont débouché |
Pour parvenir à identifier l’origine de ces plantages, il nous faut récupérer l’erreur à l’aide du débogueur de Visual Studio. Pour ce faire, deux options sont possibles : | Pour parvenir à identifier l’origine de ces plantages, il nous faut récupérer l’erreur à l’aide du débogueur de Visual Studio. Pour ce faire, deux options sont possibles : | ||
Line 28: | Line 28: | ||
L’objectif de l’implémentation proposée dans ce commit est de permettre des agrandissements et accès concurrents de la base de données. L' | L’objectif de l’implémentation proposée dans ce commit est de permettre des agrandissements et accès concurrents de la base de données. L' | ||
- | Dans l’implémentation originelle, l’allocation en mémoire | + | ==== Instanciation |
- | L’agrandissement du vecteur de la classe '' | + | Dans l’implémentation originelle, l’allocation en mémoire des objets |
- | L’hypothèse fondamentale | + | Ici, nous avons fait le choix d’une allocation dès à présent directe des objets '' |
+ | ==== Agrandissement de la base de données ==== | ||
+ | |||
+ | L’agrandissement du vecteur de la classe '' | ||
+ | |||
+ | L’avantage de ce patron de conception est que le coût du verrou n’est pas significatif : nous en payons le prix uniquement au premier accès de l’élément, | ||
+ | |||
+ | Il est important de noter que la taille du vecteur se doit d’être déclarée comme une variable atomique, que ce soit par la librairie TBB ou bien par le C++11. Dans le cas contraire, si cette variable n’est pas déclarée comme atomique, il n’est pas garanti que le patron de conception ait le comportement attendu. | ||
+ | |||
+ | ==== Vecteur std ==== | ||
+ | L’hypothèse fondamentale d’un vecteur de type concurrent est d’éviter toutes réallocations de la mémoire lors de l’agrandissement du vecteur. Un vecteur concurrent ne déplace jamais ses éléments existants lorsqu’il s’agrandit. Il alloue une série de tableaux contigus. Ainsi, nous pouvons agrandir le vecteur dynamiquement pendant d’autres accès concurrents. | ||
+ | |||
+ | A contrario, avec un vecteur '' | ||
+ | |||
+ | Toutefois, nous avons fait le choix de nous affranchir du type concurrent du vecteur de la base de données, c’est-à-dire de retourner à un simple vecteur '' | ||
+ | |||
+ | Pour ce faire, la solution retenue consiste à réserver l’espace mémoire nécessaire des différents vecteurs de la base de données avant d’exécuter les parties concurrentes du code. Ainsi, nous empêchons toute réallocation de la mémoire au cours des accès à la base de données. | ||
+ | Par conséquent, | ||
+ | * Nous avons pris la taille du vecteur '' | ||
+ | * Pour les champs '' | ||
+ | * La capacité mémoire des champs '' | ||
+ | |||
+ | Enfin, il faut ajouter que cette préallocation de la mémoire est réalisée dans les cas suivants : | ||
+ | * Dans '' | ||
+ | * Dans '' | ||
+ | * Dans '' | ||
+ | |||
+ | ==== Conclusions ==== | ||
Finalement, les efforts investis ont été récompensés puisque, outre la gestion dès à présent thread-safe des accès à la base de données, nous avons engrangé des progrès en performances très significatifs par rapport à l’implémentation originelle (voir Figure 3 ci-dessous). Cette Figure 3 illustre le gain apporté par les seules modifications de l’implémentation de la base de données par rapport à la révision officielle précédente. | Finalement, les efforts investis ont été récompensés puisque, outre la gestion dès à présent thread-safe des accès à la base de données, nous avons engrangé des progrès en performances très significatifs par rapport à l’implémentation originelle (voir Figure 3 ci-dessous). Cette Figure 3 illustre le gain apporté par les seules modifications de l’implémentation de la base de données par rapport à la révision officielle précédente. | ||
Ici, les gains affichés ne prennent pas en compte les gains apportés par l’implémentation concurrente des mises à jour du maillage volumes finis, autrement dit cette partie du code reste exécutée de manière purement séquentielle par un seul et unique thread. La version implémentée dans ce commit correspond à la courbe "Meta H Std" de couleur turquoise sur la Figure. | Ici, les gains affichés ne prennent pas en compte les gains apportés par l’implémentation concurrente des mises à jour du maillage volumes finis, autrement dit cette partie du code reste exécutée de manière purement séquentielle par un seul et unique thread. La version implémentée dans ce commit correspond à la courbe "Meta H Std" de couleur turquoise sur la Figure. | ||
Line 44: | Line 71: | ||
===== Interaction partielle ===== | ===== Interaction partielle ===== | ||
- | Il est à noter que la mise en place de l’implémentation expliquée ci-dessus a eu un des effets collatéraux | + | Il est à noter que la mise en place de l’implémentation expliquée ci-dessus a eu un effet collatéral |
L’erreur rencontrée est que les interactions partielles (utilisées pour le transfert de données) ont leur attribut '' | L’erreur rencontrée est que les interactions partielles (utilisées pour le transfert de données) ont leur attribut '' | ||
commit/2018/01_26.1516984775.txt.gz · Last modified: by crutzen