Bonjour,
Pour envoyer un vecteur<int> avec mpi dois-je construire un type derive MPI ou existe-t-il d'autre moyen?
Merci
Version imprimable
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 ? 8O :roll:Citation:
Envoyé par Jeane
quelle fonction , quelle prototype ?
http://people.scs.fsu.edu/~burkardt/...c/mpi/mpi.html
Trouvé en deux minutes sur Google :roll:.
Ok, je devrais pas faire ça avec un membre comme toi, je m'excuse :yaisse2:
Ç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 pageCitation:
Le probleme est que si j ecris un code du style:Citation:
Ç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.Citation:
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 savoirCitation:
Un 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 pasCode:
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:
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:
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; }
c'est fait mais ça marche pas
1 - MPI_RECV : Message truncated
[1] Aborting program !
[1] Aborting program!
Error 14, process 1,
:koi:
tu as bien copié le code, compilé (il n'y as pas eu d'erreur) et executé??
es ce que l'exemple qui est ici fonctionne :
http://en.wikipedia.org/wiki/Message...xample_program
sinon, tu compile avec quoi et avec quel implementation de MPI
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.
:cry: ahhhhhhhhhhhhhhhhhhhhh mon dieu
non celui que j'ai corrigé. Ton exemple ne peut pas marcher. Tu n'as pas initialisé la taille du vector.
Comprend tu le principe de fonctionnement???
Si tu ne répond pas a mes questions ( ca commence à s'accumuler) on ne pourra pas t'aider.
De plus, arrête les multi poste, stp...