Bonjour,
Pour envoyer un vecteur<int> avec mpi dois-je construire un type derive MPI ou existe-t-il d'autre moyen?
Merci
Bonjour,
Pour envoyer un vecteur<int> avec mpi dois-je construire un type derive MPI ou existe-t-il d'autre moyen?
Merci
c'est quoi MPI ? Mutuelle des Programmeurs Informaticiens ?Envoyé par Jeane
![]()
quelle fonction , quelle prototype ?
http://people.scs.fsu.edu/~burkardt/...c/mpi/mpi.html
Trouvé en deux minutes sur Google.
Ok, je devrais pas faire ça avec un membre comme toi, je m'excuse![]()
Ça s'envoit de la même manière que tu envoies un tableau...
Je ne trouve pas la reponse a ma question sur cette page
Le probleme est que si j ecris un code du style:Ça s'envoit de la même manière que tu envoies un tableau...
MPI::Init(argc,argv);
int rank,nprocs,n;
nprocs=MPI::COMM_WORLD.Get_size();
rank=MPI::COMM_WORLD.Get_rank();
std::vector<int> v;
if(rank==0) {
v.push_back(0);
v.push_back(1);
v.push_back(2);
v.push_back(3);
MPI::COMM_WORLD.Send(&v,4,MPI::INT,1,50);
}
else {
MPI::COMM_WORLD.Recv(&v,4,MPI::INT,0,50);
}
std::cout<<"Hello Hi, world. I am "<<rank << " of "<<nprocs<<std::endl;
for(int i=0;i<v.size();i++) std::cout<<v[i]<<" ";
std::cout<<std::endl;
MPI::Finalize();
le resultat est:
Hello Hi, world. I am 0 of 2
0 1 2 3
Hello Hi, world. I am 1 of 2
1229872 0 1230400 0
Le problème plutôt je dirais c'est que tu ne connais pas C++ et que tu fais n'importe quoi.Le probleme est que si j ecris un code du style:
Pour envoyer un tableau d'entiers avec MPI, tu fournis deux informations : un pointeur vers le premier élément, et la taille du tableau (et non pas la constante magique 4).
Il suffit de faire pareil avec std::vector<int>.
Un pointeur vers le premier élément s'obtient avec &v[0], et la taille s'obtient avec v.size().
Pour pouvoir lire par contre, il te faudra connaître la taille à l'avance.
Une alternative étant de d'abord écrire la taille puis les données.
Merci c'etait ce que je voulais savoirUn pointeur vers le premier élément s'obtient avec &v[0]
ça marche pas non!!!!
par contre ce que j'ai pas compris pourquoi ce code ci dessous fonctionne!!!
mais si je met la Recv dans un autre process ça marche pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 #include <stdio.h> #include <mpi.h> #include <iostream> #include<vector> using namespace::std; int main( int argc, char* argv[]) { vector<int> v; int rang,p; MPI_Status status; /* Initialisation */ MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD, &p); MPI_Comm_rank(MPI_COMM_WORLD,&rang); if ( rang == 0) { v.push_back(55); v.push_back(56); v.push_back(57); v.push_back(58); MPI_Send(&v[0],v.size(),MPI_INT,0,50,MPI_COMM_WORLD); MPI_Recv(&v[0],v.size(),MPI_INT,0,50,MPI_COMM_WORLD,&status); cout<<"v1= "<<v[1]; } MPI_Finalize(); return 0; }
svp aidez moi
j'ai fait ça (la taille du vecteur est fixe, mais ça marche pas)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 #include <stdio.h> #include <mpi.h> #include <iostream> #include<vector> using namespace::std; int main( int argc, char* argv[]) { vector<int> v; int rang,p; MPI_Status status; /* Initialisation */ MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD, &p); MPI_Comm_rank(MPI_COMM_WORLD,&rang); if ( rang == 0) { v.push_back(55); v.push_back(56); v.push_back(57); v.push_back(58); MPI_Send(&v[0],v.size(),MPI_INT,1,50,MPI_COMM_WORLD); }else if(rang==1) {MPI_Recv(&v[0],4,MPI_INT,0,50,MPI_COMM_WORLD,&status); cout<<"v1= "<<v[1]; } MPI_Finalize(); return 0; }
Ben non. Tu n'initialise pas la taille de ton vecteur...
essaie ce code, ca devrait marcher.
Comprend tu la difference?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 #include <stdio.h> #include <mpi.h> #include <iostream> #include<vector> using namespace::std; int main( int argc, char* argv[]) { vector<int> v(4); int rang,p; MPI_Status status; /* Initialisation */ MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD, &p); MPI_Comm_rank(MPI_COMM_WORLD,&rang); if ( rang == 0) { v[0]=55; v[1]=56; v[2]=57; v[3]=58; MPI_Send(&v[0],v.size(),MPI_INT,1,50,MPI_COMM_WORLD); }else if(rang==1) {MPI_Recv(&v[0],v.size(),MPI_INT,0,50,MPI_COMM_WORLD,&status); cout<<"v1= "<<v[1]; } MPI_Finalize(); return 0; }
je viens d'essayer avec MPICH2 et mon code compile (faut ajouter #define MPICH_SKIP_MPICXX au tout début du fichier) et fonctionne.
vous avez essayé mon exemple? car j'ai ajouté le #define...
mais rien de nouveaux encore les memes erreurs.
ahhhhhhhhhhhhhhhhhhhhh mon dieu
oui je comprends le principe .
pour l'exemple je parle de celui corrigé avec l'initialisation, pour moi ça marche pas .le re voila
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 #include <stdio.h> #include <mpi.h> #include <iostream> #include<vector> using namespace::std; #define MPICH_SKIP_MPICXX int main( int argc, char* argv[]) { vector<int> v(4); int rang, p, valeur, tag = 10; MPI_Status status; /* Initialisation */ MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD, &p); MPI_Comm_rank(MPI_COMM_WORLD,&rang); if ( rang == 0) { v.push_back(55); v.push_back(56); v.push_back(57); v.push_back(58); MPI_Send(&v[0],v.size(),MPI_INT,1,50,MPI_COMM_WORLD); } else if ( rang ==1) { MPI_Recv(&v[0],v.size(),MPI_INT,0,50,MPI_COMM_WORLD,&status); cout<<"v1= "<<v[1]; } MPI_Finalize(); return 0; }
Partager