16. Performance des calculs : parallélisme en espace ou en temps ?#
Par défaut, lorsque le parallélisme MPI est activé [1] (cf. [U2.08.06]), les options de calcul bénéficient généralement ici d’un parallélisme dit «en espace». C’est-à-dire que les calculs sont distribués sur les processus parallèles par paquets de mailles. Un processus MPI va gérer, pour tous les pas de temps, les calculs élémentaires requis par un groupe de mailles donné.
Mais, outre que ce parallélisme est peu efficient pour les options impliquant directement peu ou pas de calculs élémentaires (telles les options REAC/FORC_NODA et xxx_NOEU), il suscite d’autre part des communications MPI importantes et répétées [2].
Pour les options pré-citées, on lui préfère donc le parallélisme dit «en temps» qui, lui, distribue, pour toutes les mailles, les calculs (élémentaires ou non) requis par un paquet de pas de temps. Les communications sont donc moins coûteuses [3] et le parallélisme est étendu à des portions de code au-delà des calculs élémentaires.
Avec ce parallélisme, les accélérations peuvent aller de X5 à X50 suivant la configuration des calculs. L’activation de ce parallélisme est effectué dans un CALC_CHAMP donné [4] et elle concerne toutes les options de calcul susceptibles d’en bénéficier: REAC/FORC_NODA et xxx_NOEU et toutes les options de calculs sous-jacentes [5].
Sur un CALC_CHAMP coûteux, comportant des calculs REAC/FORC_NODA ou xxx_NOEU sur de longs transitoires et/ou sur de gros modèles, on conseille donc d’activer ce parallélisme en temps: PARALLELISME_TEMPS=”OUI”. Et, contrairement à celui en espace, il n’a pas besoin d’une granularité minimum [6] pour être efficace. Dès la dizaine de pas de temps par processus MPI, l’accélération procurée par le parallélisme en temps peut être notable [7] .
Le type de parallélisme actif (en espace, en temps ou aucun) est précisé, option par option, dans le fichier de message. Pour plus de détails on pourra consulter la notice d’utilisation du parallélisme [U2.08.06].
- Remarques sur le parallélisme
Le parallélisme en temps, lorsqu’il est activé dans l’opérateur, concerne tous les traitements informatiques susceptibles d’en bénéficier. Pour ce faire, on «débranche» en sous-main et ponctuellement, option par option, le parallélisme en espace. Celui-ci est ensuite réactivé, «comme si de rien n’était», dans les options suivantes si celles-ci ne sont pas, à leur tour, concernées par le parallélisme en temps. Ainsi l’appel
CALC_CHAMP(EFGE_ELGA, REAC_NODA, ETOT_ELGA, EPSI_NOEU, PARALLELISME_TEMPS='OUI')
activera le parallélisme en espace pour les options n°1 et n°3 et celui en temps pour les autres. Il est équivalent, d’un point de vue parallélisme, à la séquence d’appels:
CALC_CHAMP(EFGE_ELGA, ETOT_ELGA) CALC_CHAMP(REAC_NODA, EPSI_NOEU, PARALLELISME_TEMPS='OUI')
Pour simplifier la programmation [8] et ne pas chercher inutilement des gains mineurs, lorsque le nombre de pas de temps n’est pas un multiple du nombre de processus MPI, le reliquat de pas temps est effectué par tous les processus. Et bien sûr, aucune communication n’est organisée entre ceux-ci.
Dans certaines situations, le parallélisme en temps ne fonctionne pas. Suivant les cas, le calcul s’arrête ou émet une alarme: option non encore couverte (CHAM_UTIL), contexte de calcul variant au cours du transitoire (MODELE…), calcul impossible en séquentiel, pas assez de pas de temps…