Dans ARCANE, le parallélisme est géré par échange de messages. Le maillage est partitionné en plusieurs sous-domaines. Chaque sous-domaine est éventuellement complété d'une ou plusieurs couches de mailles fantômes qui représentent une duplication d'entités pour lesquelles il faudra effectuer une synchronisation. Chaque processeur effectue les calculs sur un sous-domaine et synchronise ses variables régulièrement avec les autres processeurs.
En règle générale, il n'y a pas de solution unique au problème des synchronisations :
Afin de ne pas compliquer inutilement la prise en compte du parallélisme, ARCANE fonctionne aujourd'hui en utilisant une seule couche de maille fantômes et privilégie le calcul au détriment du nombre de synchronisations. Lors de la réalisation de vos modules numériques, il est conseillé de privilégier le même critère.
ARCANE possède son propre service de partitionnement parallèle. Ce service utilise l'algorithme Métis. Il est utilisé pour l'équilibrage de la charge des processeurs.
ARCANE utilise le même ordre de numérotation dans chaque sous-domaine. Cela permet de limiter au maximum le nombre de synchronisations. Les mailles, les noeuds et les faces sont toujours décrits dans le même ordre quel que soit le sous-domaine et quel que soit le découpage.
Si toutes les opérations se font en itérant sur un groupe de noeuds ou de mailles, le résultat est identique en séquentiel et en parallèle.
Les opérations proposées par le service de parallélisme sont les suivantes :
Le détail de ces opérations est disponible sur la documentation en ligne de l'interface Arcane::IParallelMng
.
Notons que les variables du code peuvent appeler directement les opérations de parallélisme qui sont cohérentes pour leur type. Par exemple une variable de type Arcane::VariableScalarReal
nommée m_density_ratio_maximum
peut appeler l'opération de réduction :
Le parallélisme dans ARCANE est conçu comme un service (cf Service). Toutes les opérations disponibles (synchronisation, réduction...) sont interfacées par le service. La seule implémentation de ce service développée à ce jour est MPI.
Pour exécuter un code en parallèle avec MPI, la procédure à suivre dépend de l'implémentation Mpi cible. Par exemple, si on utilise une version de mpich2, il faut :
mpd
dans une fenêtre xterm,ARCANE_PARALLEL_SERVICE
à la valeur Mpi
mpiexec -n nb_proc nom_executable