Aller au contenu

envoi de matrice avec mpi


fatjoe2008

Messages recommandés

bonjour,

j'ai besoin d'envoyé une matrice en MPI,

je travaille avec c++ et les vector<vector<int> >Ma_matrice;

comment je peux envoyer ça directement au lieu de faire une boucle et envoyé chaque vector tout seul(c'est ce que je fait maintenant).

merci d'avance

Salut,

Je ne connais pas le C++ mais a priori si tu te débrouilles pour que les éléments de ta matrice se suivent en mémoire et que tu donnes l'adresse du 1er élément et le nombre total d'éléments de la matrice dans la fonction d'envoi de message (MPI_Send par exemple), ça fonctionnera.

Lien vers le commentaire
Partager sur d’autres sites

bonjour,

j'ai besoin d'envoyé une matrice en MPI,

je travaille avec c++ et les vector<vector<int> >Ma_matrice;

comment je peux envoyer ça directement au lieu de faire une boucle et envoyé chaque vector tout seul(c'est ce que je fait maintenant).

merci d'avance

Salut,

Je ne connais pas le C++ mais a priori si tu te débrouilles pour que les éléments de ta matrice se suivent en mémoire et que tu donnes l'adresse du 1er élément et le nombre total d'éléments de la matrice dans la fonction d'envoi de message (MPI_Send par exemple), ça fonctionnera.

oui je l'ai fait, j'ai envoyé vecteur par vecteur et ça marche nickel mais , je sais pas si c'est une bonne méthode ou bien y a autre méthodes.

merci pour votre réponse

Lien vers le commentaire
Partager sur d’autres sites

oui je l'ai fait, j'ai envoyé vecteur par vecteur et ça marche nickel mais , je sais pas si c'est une bonne méthode ou bien y a autre méthodes.

merci pour votre réponse

La bonne méthode c'est de tout envoyer en une fois. Pour cela, il faut que les vecteurs qui composent la matrice occupent des emplacements mémoires consécutifs.

Lien vers le commentaire
Partager sur d’autres sites

oui je l'ai fait, j'ai envoyé vecteur par vecteur et ça marche nickel mais , je sais pas si c'est une bonne méthode ou bien y a autre méthodes.

merci pour votre réponse

La bonne méthode c'est de tout envoyer en une fois. Pour cela, il faut que les vecteurs qui composent la matrice occupent des emplacements mémoires consécutifs.

et comment je peux faire ça?

pouvez vous me donnez la démarche?

merci

Lien vers le commentaire
Partager sur d’autres sites

oui je l'ai fait, j'ai envoyé vecteur par vecteur et ça marche nickel mais , je sais pas si c'est une bonne méthode ou bien y a autre méthodes.

merci pour votre réponse

La bonne méthode c'est de tout envoyer en une fois. Pour cela, il faut que les vecteurs qui composent la matrice occupent des emplacements mémoires consécutifs.

et comment je peux faire ça?

pouvez vous me donnez la démarche?

merci

C'est un problème de C++ et pas de parallélisme ça.

En C, il faut faire quelque chose comme ça :

  int **x;
 int *a;
 int i;
 int N; // dimension de la matrice carré

 a=malloc(N*N*sizeof(int)); // va contenir tous les elements de la matrice
 x=malloc(N*sizeof(int *));	// matrice : tableau de pointeurs
 for(i=0; i<N; i++)
x[i]=a+i*N;

Lien vers le commentaire
Partager sur d’autres sites

oui je l'ai fait, j'ai envoyé vecteur par vecteur et ça marche nickel mais , je sais pas si c'est une bonne méthode ou bien y a autre méthodes.

merci pour votre réponse

La bonne méthode c'est de tout envoyer en une fois. Pour cela, il faut que les vecteurs qui composent la matrice occupent des emplacements mémoires consécutifs.

et comment je peux faire ça?

pouvez vous me donnez la démarche?

merci

C'est un problème de C++ et pas de parallélisme ça.

En C, il faut faire quelque chose comme ça :

  int **x;
 int *a;
 int i;
 int N; // dimension de la matrice carré

 a=malloc(N*N*sizeof(int)); // va contenir tous les elements de la matrice
 x=malloc(N*sizeof(int *));	// matrice : tableau de pointeurs
 for(i=0; i<N; i++)
x[i]=a+i*N;

ça peut pas se faire avec vector<int > ?.

Lien vers le commentaire
Partager sur d’autres sites

alors?

autre question:

j'ai fait du profiling avec mpe, d'un programme simple qui envoi en tableau vers le processus 0

le processus 1 et 2 envoi vers 0; j'ai constaté que le p2 envoi à partir de l'instant 0 mais le p1 envoi aprés quelque millième de seconde

et avec d'autre exemples parfois des processus envoi aprés quleques secondes et non pas immédiatement, pourtant il ne dépende de rien.

vous avez une idée?

merci d'avance

Lien vers le commentaire
Partager sur d’autres sites

Encore une fois, c'est du C++, pas du MPI, cette histoire de vector. Je ne sais pas comment sont gérés les vector en C++ donc je ne sais pas.

Pour le profiling, il n'y a aucune explication particulière je pense. Peut-être que les processus qui démarrent en retard est exécutés sur un processeur déjà chargé. Je n'ai pas de réponse a priori.

Lien vers le commentaire
Partager sur d’autres sites

oui je l'ai fait, j'ai envoyé vecteur par vecteur et ça marche nickel mais , je sais pas si c'est une bonne méthode ou bien y a autre méthodes.

merci pour votre réponse

La bonne méthode c'est de tout envoyer en une fois. Pour cela, il faut que les vecteurs qui composent la matrice occupent des emplacements mémoires consécutifs.

et comment je peux faire ça?

pouvez vous me donnez la démarche?

merci

C'est un problème de C++ et pas de parallélisme ça.

En C, il faut faire quelque chose comme ça :

  int **x;
 int *a;
 int i;
 int N; // dimension de la matrice carré

 a=malloc(N*N*sizeof(int)); // va contenir tous les elements de la matrice
 x=malloc(N*sizeof(int *));	// matrice : tableau de pointeurs
 for(i=0; i<N; i++)
x[i]=a+i*N;

ça peut pas se faire avec vector<int > ?.

	std::vector<int> a_envoyer;

for( std::vector<std::vector<int>>::iterator it = My_matrice.begin(); it != My_matrice.end(); ++it ) {
	a_envoyer.insert(a_envoyer.end(), it->begin(), it->end());
}

et voilà, tu as ton tableau

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...