Je résous un problème multi-échelle en utilisant la méthode multi-échelle hétérogène (HMM) . Essentiellement, ma procédure particulière utilise le processus itératif suivant:
- Résolvez de nombreux systèmes matriciels locaux.
- Calculer une valeur d'intérêt à partir des solutions des systèmes locaux.
- Assembler un système matriciel global à partir des "valeurs d'intérêt" locales
- Résoudre le système matriciel global
- Utilisez la solution du système matriciel global pour former de nouveaux systèmes matriciels locaux.
Répétez jusqu'à ce que certains critères de convergence soient remplis.
Comme il existe de nombreux systèmes d'équations linéaires locaux (indépendants) et que plusieurs systèmes peuvent s'intégrer dans la mémoire RAM locale, je pense qu'il est préférable de charger plusieurs systèmes "locaux" dans chaque processeur et de résoudre chaque système de manière séquentielle ( voir cette question publiée ).
Ma question concerne la meilleure stratégie pour assembler et résoudre le système matriciel global. Dans mon cas particulier, le système matriciel global est suffisamment petit pour pouvoir s'adapter entièrement à la mémoire RAM de n'importe quel processeur. De plus, les matrices locales et globales ne changent pas de taille entre les itérations. Donc, je prévois l'une des trois stratégies possibles:
- Rassemblez les «valeurs d'intérêt» sur un seul processeur et assemblez / résolvez le système de matrice global séquentiellement sur un processeur.
- Copiez les valeurs d'intérêt sur chaque processeur et assemblez / résolvez le même système de matrice global séquentiellement sur chaque processeur.
- En supposant que chaque processeur possède les «valeurs d'intérêt» nécessaires pour produire des blocs contigus de la matrice globale, nous pouvons alors assembler localement des partitions de la matrice globale, puis les résoudre ensemble en parallèle.
Je peux voir certains avantages / inconvénients de chaque méthode. Dans la méthode 1, aucune communication n'est nécessaire dans la phase de résolution, mais la communication vers et depuis le processeur racine peut devenir un goulot d'étranglement (en particulier à l'échelle). La méthode 2 peut nécessiter plus de communications interprocesseurs pour assembler la matrice globale que la première méthode, mais aucune communication n'est nécessaire dans la phase de résolution ou dans l'étape d'assemblage de matrice locale qui suit. La méthode 3 ne nécessite aucune communication interprocesseur pour l'assemblage des matrices locales ou globales, mais l'exige dans la phase de résolution.
Supposons que chaque système local soit de l'ordre de x et qu'il existe x systèmes matriciels locaux. Supposons en outre que le système matriciel global ait une taille de x . Dans ces hypothèses, laquelle des trois stratégies susmentionnées mènera probablement à une solution plus rapide du système mondial? Existe-t-il d'autres stratégies de cartographie pour la matrice globale qui pourraient fonctionner plus rapidement par itération?10 3 10 3 10 3 10 3 10 3
Réponses:
Je ne pense pas qu'il y ait de cas où vous voulez résoudre au rang 0. La résolution redondante est presque toujours meilleure car, pour les petites choses, allreduce est aussi efficace que réduire, et le calcul redondant n'en a qu'un au lieu de deux.
Cependant, le fait de calculer de manière redondante sur tous les nœuds, sur un sous-ensemble ou sur des sous-ensembles redondants dépend du matériel et de la taille du système. Ainsi, vous devriez avoir un système capable de faire n'importe lequel d'entre eux. Le PCREDUNDANT dans PETSc peut résoudre de manière redondante tous les processus, certains processus ou sous-ensembles de processus en parallèle.
la source