Aller au contenu

Parallélisme et MPI


fafaro

Messages recommandés

Bonjour à tous et merci à Fafaro pour ce topic sur MPI.

Sinon mon problème est le suivant: pour résumer je souhaite savoir s'il est possible de commencer l'exécution d'un programme, contenant des directives MPI, sur un seul processeur, pour ensuite lorsque l'utilisateur le désire (par une interface graphique simple par exemple), lancer d'autre processeur pour éxécuter un bou du programme en parallèle.

Je souhaite en fait réaliser un programme avec une légère interface graphique pour résoudre des système linéaires. L'utilisateur aurait le choix entre plusieurs solveurs numériques pour résoudre son système, certains séquentiels, d'autres parallèles. En fait ce qui m'embête c'est le mpirun du début. Je souhaite lancer mon programme principale sur un seul processeur, et lorsque l'utilisateur décide d'utiliser un solveur numérique parallèle, je lance plusieurs processeurs qui interpreteront les directives mpi de ce solveur.

J'espère avoir été assez clair.

Il semble que ce topic soit délaissé depuis quelques temps. Si vous tombez sur mon message, peut être aurait vous l'amabilité de me rediriger vers un forum MPI plus actif.

Merci par avance!!!

Lien vers le commentaire
Partager sur d’autres sites

  • Réponses 62
  • Créé
  • Dernière réponse
Ne peux-tu pas te débrouiller pour mettre le solveur dans un process à par et forker dès que l'utilisateur décide de lancer en parallèle ?

Que veux tu dire par "forker"? Désolé pour mon manque de vocabulaire.

Si tu veux dire lancer le solveur parallèle sur d'autres process à partir du programme principale je suis en train d'envisager cette solution. Je ne connaissais pas la fonction MPI_Comme Spawn et fafaro m'en a parlé.

Le truc que je me demande c'est si je fais un MPI_Comm_spawn et que je lance 4 processus ouvriers par exemple, n'est il pas possible grâce à un MPI_Comme_merge de récupérer dans le programme principal le communicateur associé aux processus ouvriers et de travailler dans le programme principal avec ce nouveau communicateur?

Ainsi je pourrais lancer mon programme prinipal sur un seul proc. Lorsque l'utilisateur choisis un solveur parallèle je lance plusieurs autre proc grace à MPI_Comm_Spawn, je les récupère grace à MPI_comm_merge et je travaille dessus le temps qu'il me faut. C'est une idée. Peut être idiote. Qu'en penses tu?

Merci de ton aide.

Damien

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

Bonjour,

je teste le mpi sur mon PC (processeur double coeur)

petite erreur, je recherche sur notre ami google et j'atteris ici!!

très intéressant jepense pour qui veut découvrir le calcul parallèl sans se sentir seul...

compilation:> mpif90 -o mp mpi.f90

execution:> mpirun -np 2 mp

il est censé affiché:

je suis 0 parmi 2

je suis 1 parmi 2

mais j'ai seulement:

je suis 0 parmi 1

précédé du message d'erreur:

libibverbs: Fatal: couldn't read uverbs ABI version.

--------------------------------------------------------------------------

[0,0,0]: OpenIB on host login-laptop was unable to find any HCAs.

Another transport will be used instead, although this may result in

lower performance.

--------------------------------------------------------------------------

help please!!

Lien vers le commentaire
Partager sur d’autres sites

rien de bien méchant,

tout ce qu'il y a de standard, mais le soucis ne vient pas du code:

il marche nickel sur une machine parallèle (une vraie cette fois) que j'utilise au boulot

le problème, c'est comment faire sur ubuntu pour parallélisé sans triché, j'ai dans l'après midi réussi à faire tourner le prog, mais pas sur les deux c½urs de mon PC, je pouvais même mettre autant de processeurs que je le décidais, mais il ne me semble pas que quand j'ai mis -np 15, j'ai 15 c½urs dans mon PC :chinois:

merci de ta réponse malgré la pause du topic! :transpi:

Lien vers le commentaire
Partager sur d’autres sites

rien de bien méchant,

tout ce qu'il y a de standard, mais le soucis ne vient pas du code:

il marche nickel sur une machine parallèle (une vraie cette fois) que j'utilise au boulot

le problème, c'est comment faire sur ubuntu pour parallélisé sans triché, j'ai dans l'après midi réussi à faire tourner le prog, mais pas sur les deux c½urs de mon PC, je pouvais même mettre autant de processeurs que je le décidais, mais il ne me semble pas que quand j'ai mis -np 15, j'ai 15 c½urs dans mon PC :francais:

merci de ta réponse malgré la pause du topic! :transpi:

Je suis pas un expert mais d'après ce que j'ai pu lire mpi s'adapte à l'environnement dans lequel tu le lances.

Logiquement si tu as un dual core et que tu lances un prog sur deux proc il devrait répartir les taches entre les deux. Si tu lances sur 15, il va d'une certaine manière émuler les 13 manquants.

C'est certainement mieux expliquer ailleurs...peut être même plus haut dans le topic...je sais pas. Bref si t'as pas une vrai architecture pour faire du parallèle, mpi triche...

Lien vers le commentaire
Partager sur d’autres sites

Je suis pas un expert mais d'après ce que j'ai pu lire mpi s'adapte à l'environnement dans lequel tu le lances.

Logiquement si tu as un dual core et que tu lances un prog sur deux proc il devrait répartir les taches entre les deux. Si tu lances sur 15, il va d'une certaine manière émuler les 13 manquants.

C'est certainement mieux expliquer ailleurs...peut être même plus haut dans le topic...je sais pas. Bref si t'as pas une vrai architecture pour faire du parallèle, mpi triche...

Oui c'est ça, MPI envoie le nombre de processus que tu lui demandes d'envoyer sur les machines que tu lui demandes d'utiliser. Après c'est ton OS qui répartit les processus sur les processeurs qu'il voit.

Je ne passe plus très souvent sur le forum, désolé pour les questions qui restent sans réponse.

Lien vers le commentaire
Partager sur d’autres sites

Nouvelle question, plus technique:

je veux envoyer une matrice dans les processeurs pour répartir le boulot:

nbligne=n+1 lignes pour les premiers processeurs

nbligne=n lignes pour les suivants

j'utilise un mpi_type_vector pour créé ces blocs: mpi_type_vector(nbcolonne,nbligne,sum(nbligne),mpi_real, blocs,mpi_comm_world, erreur)

(si je me suis trompé dans la syntaxe on s'en fout c'est pas le soucis)

puis une structure de type (blocs, mpi_ub) avec des décalages (0,nbligne * size_of_real)

et enfin j'envoie le tout avec un bon scatterv

le tout marche bien si nbligne est le même pour tous les processeurs, sinon pour tous ceux qui en ont un différent du processeur 0 (qui envoie), alors là ils recoivent décaler, c'est à dire que le scatterv considère que le type blocs est le même pour tous les processeurs...

voili le problème

évidemment, si je ne trouve pas de solution je peux envoyer colonne par colonne, ça c'est sur ça marche, mais je veux éviter de faire exploser le nombre de scatterv, ou autre, ça n'aurai plus d'intérêt

merci

Lien vers le commentaire
Partager sur d’autres sites

évidemment, si je ne trouve pas de solution je peux envoyer colonne par colonne, ça c'est sur ça marche, mais je veux éviter de faire exploser le nombre de scatterv, ou autre, ça n'aurai plus d'intérêt

solution que j'ai trouvée (crée)

je crée 2 communicateurs

j'envoie la 2eme partie qui m'embete avec un send/recv

puis scatter sur ces 2communicateurs (qui ont le même nom puisqu'aucun élément commun)

il y a peut être plus simple mais ça marche bien et je ne perd pas trop de temps en test...

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...
Nouvelle question:

j'ai un programme principal qui fait appel à une fonction f

comment va se comporter le code MPI:

-si il est initialiser avant l'appel

-si il est initialiser dans f

-les deux (une erreur sans doute)

Je n'ai jamais tenté d'initialiser dans les 2 mais je suppose effectivement que ça produirait une erreur.

Sinon il ne se passe rien de très particulier si tu initialises dans le programme principal ou dans la fonction.

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.


×
×
  • Créer...