Comment exécuter MPI-3.0 en mode mémoire partagée comme OpenMP

14

Je parallélise le code pour résoudre numériquement un modèle d'équilibre de population à 5 dimensions. Actuellement, j'ai un très bon code parallélisé MPICH2 dans FORTRAN mais à mesure que nous augmentons les valeurs des paramètres, les tableaux deviennent trop volumineux pour fonctionner en mode mémoire distribuée.

J'ai accès à un cluster avec 15 nœuds, où chaque nœud a deux processeurs 8 cœurs et 128 Go de RAM. Je veux écrire exécuter un programme avec MPI-3.0 en mode mémoire partagée afin que chaque processus ne génère pas sa propre copie de chaque tableau.

Avant de pouvoir exécuter quoi que ce soit sur le cluster, je dois le tester sur un bureau exécutant Ubuntu. Il s'agit essentiellement d'une lame du cluster dans la mesure où elle possède deux processeurs 8 cœurs et 128 Go de RAM. J'écrirai et testerai mon code dessus, alors veuillez orienter vos réponses vers l'exécution de programmes sur l'ordinateur Ubuntu.

J'ai lu qu'il existe un moyen d'exécuter MPI-3.0 en mode de mémoire partagée comme OpenMP au lieu de son mode de mémoire distribuée par défaut.

Des questions:

  1. Comment vais-je devoir modifier mon code? Dois-je ajouter des appels à d'autres fonctions MPI comme MPI_WIN_ALLOCATE?

  2. Comment compiler mon code pour exécuter MPI-3.0 en mode mémoire partagée? Est-ce que ce sera différent si c'est sur plusieurs nœuds?

Veuillez donner des exemples de scripts de compilation si vous le pouvez. Je n'ai également que des compilateurs GNU. Le cluster que j'utilise ne prend pas en charge les compilateurs Intel.

Franklin Betten
la source
1
Oui, vous devriez pouvoir exécuter MPI sur un système de mémoire partagée. Cependant, la façon dont il est réellement programmé sera identique. Votre code doit être le même pour les systèmes de mémoire partagée et distribuée. La façon dont il est exécuté est la seule différence.
NoseKnowsTous les
De plus, bien que je n'aie pas testé cela, je pense que vous devriez pouvoir exécuter votre code en utilisant la commande mpiexec -n 8 /path/to/applicationpour faire croire à votre ordinateur qu'il a 8 nœuds différents.
NoseKnowsTous les
Je l'ai déjà exécuté sur un système de mémoire partagée mais je veux que les cœurs de calcul partagent la RAM, comme dans OpenMP. Certaines de mes baies mesurent 6 Go, j'ai donc besoin de tous les cœurs de chaque nœud pour fonctionner en mode mémoire partagée.
Franklin Betten
2
Eh bien, c'est pour un projet de recherche. J'ai donc besoin d'augmenter la taille du problème. J'ai déjà du code qui fonctionne donc la seule chose qui empêche l'évolutivité est la mémoire nécessaire. J'ai rencontré des documents et des powerpoints de conférences MPI qui suggèrent que MPI-3.0 peut partager la mémoire avec de nouvelles fonctions d'appel qui ont été ajoutées sous la catégorie de communication unilatérale. Fonctions comme MPI_WIN_ALLOCATE_SHARE
Franklin Betten
2
www.eurompi2014.org/tutorials/hoefler-advanced-mpi-eurompi14.pdf cs.utexas.edu/users/flame/BLISRetreat2014/slides/…
Franklin Betten

Réponses:

0

J'ai également trouvé ce lien sur Stack Overflow. Je jure que j'ai cherché des questions comme la mienne pour toujours, mais il semble que la meilleure façon de rechercher une question sur le débordement de pile est de commencer à poser une question et elle suggérera des messages similaires.

Quoi qu'il en soit, voici le lien qui dit en fait que vous pouvez exécuter MPI3.0 + en mode mémoire partagée comme openmp. Il y a d'autres sources que j'ai trouvées qui suggèrent également et certaines qui indiquent que vous pouvez mais n'expliquez pas comment ou donnez des ressources pour le comprendre.

/programming/24797298/mpi-fortran-code-how-to-share-data-on-node-via-openmp

Après avoir suivi les conseils donnés ici dans ce lien, j'ai rencontré des problèmes pour mettre USE 'mpi_f08' en haut de mon code. J'utilise gfortran-4.8 qui n'a apparemment pas assez de support FORTRAN2008 pour UTILISER mpi_f08. La personne dans ce lien utilisait probablement le compilateur Intel Fortran 2008. Vous pouvez très bien utiliser USE mpi qui couvre jusqu'à Fortran2003. Cependant, je ne pense pas que Fortran 2003 possède les fonctions Type () nécessaires pour utiliser les fonctions d'accès à la mémoire à distance, telles que MPI_WIN_ALLOCATE_SHARED, vous ne pouvez donc pas les utiliser sans FORTRAN2008. Mais je n'ai vraiment pas assez de ressources pour le dire avec certitude, mais ce que j'ai trouvé le suggère.

Franklin Betten
la source
1
Vous pouvez utiliser MPI_Win_allocate_shared avec les trois interfaces Fortran. De plus, vous pouvez écrire le vôtre avec Fortran 2003 ISO_C_BINDING et l'interface C.
Jeff
Veuillez me dire pourquoi on a besoin de Type () pour utiliser RMA de Fortran? Je ne connais pas une telle limitation. RMA est utilisé avec le F77 depuis de nombreuses années.
Jeff