commit:2018:01_26
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
commit:2018:01_26 [2018/01/26 17:05] – created crutzen | commit:2018:01_26 [2018/01/29 10:18] (current) – crutzen | ||
---|---|---|---|
Line 3: | Line 3: | ||
===== Contexte ===== | ===== Contexte ===== | ||
- | En refaisant le point sur les performances du parallélisme en formalisme ALE, j’ai pu remarquer que le temps passé dans les multiples mises à jour du maillage volumes finis occupe une place significative de plus en plus importante au sein des algorithmes de convection à mesure que le nombre de threads augmente (voir Figure | + | En refaisant le point sur les performances du parallélisme en formalisme ALE, j’ai pu remarquer que le temps passé dans les multiples mises à jour du maillage volumes finis occupe une place significative de plus en plus importante au sein des algorithmes de convection à mesure que le nombre de threads augmente (voir '' |
- | Ajouter une figure !!! | + | {{: |
+ | Figure 1: Répartition du temps d' | ||
- | Toutefois, ces petites modifications du code a priori anodines ont débouchés | + | {{: |
+ | Figure 2: Répartition du temps d' | ||
+ | |||
+ | 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 20: | Line 24: | ||
Le défi a été particulièrement difficile à relever. Notre batterie de cas-tests exécutée sur les différentes stations de travail a été décisive pour nous assurer que les solutions implémentées étaient véritablement thread-safe. Une implémentation peut sembler en effet fonctionner sur une station de travail mais pas sur une autre. Cela dépend, entre autres, du compilateur utilisé et du système d’exploitation utilisé. | Le défi a été particulièrement difficile à relever. Notre batterie de cas-tests exécutée sur les différentes stations de travail a été décisive pour nous assurer que les solutions implémentées étaient véritablement thread-safe. Une implémentation peut sembler en effet fonctionner sur une station de travail mais pas sur une autre. Cela dépend, entre autres, du compilateur utilisé et du système d’exploitation utilisé. | ||
- | Le cheminement poursuivi étape après étape est expliqué en détail dans le rapport scientifique et technique n°6 du projet HPC4WE. Ce rapport décrit les différentes solutions que nous avons implémentées dans le code, les obstacles que nous avons rencontrés, | + | Le cheminement poursuivi étape après étape est expliqué en détail dans le rapport scientifique et technique n°6 du projet HPC4WE. Ce rapport décrit les différentes solutions que nous avons implémentées dans le code, les obstacles que nous avons rencontrés, |
+ | |||
+ | 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' | ||
+ | |||
+ | ==== Instanciation des objets DBValue ==== | ||
+ | |||
+ | Dans l’implémentation originelle, l’allocation en mémoire des objets '' | ||
+ | |||
+ | 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. | ||
- | L’objectif | + | 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 '' | ||
- | Dans l’implémentation originelle, l’allocation en mémoire des objets '' | + | Pour ce faire, la solution retenue consiste à réserver |
+ | Par conséquent, il nous faut connaître la taille //a priori// des vecteurs | ||
+ | * Nous avons pris la taille | ||
+ | * Pour les champs | ||
+ | * La capacité mémoire des champs '' | ||
- | L’agrandissement du vecteur | + | Enfin, il faut ajouter que cette préallocation |
+ | * Dans '' | ||
+ | * Dans '' | ||
+ | * Dans '' | ||
- | 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 '' | + | ==== Conclusions ==== |
+ | Finalement, les efforts investis ont été récompensés puisque, outre la gestion dès à présent | ||
+ | Ici, les gains affichés ne prennent pas en compte les gains apportés par l’implémentation concurrente | ||
- | 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 ci-dessous). Cette Figure illustre le gain apporté par les seules modifications de l’implémentation de la base de données | + | {{: |
- | 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. | + | Figure 3 : Comparaison des coûts CPU - Gain du temps d' |
En résumé, parmi les solutions thread-safe implémentées, | En résumé, parmi les solutions thread-safe implémentées, | ||
Line 38: | 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.1516982750.txt.gz · Last modified: by crutzen