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...
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:
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; }
.... CE N'EST PAS LE CORRIGE....
y as pas ca dans le code
donc oui ton code code marche pas. Avant l'envoie du tableau tu agrandi ton tableau à 8 alors que l'execution fille attend un tableau de 4Code:
1
2
3
4
5 v.push_back(55); v.push_back(56); v.push_back(57); v.push_back(58);
ce code marche merci beaucoup vraiment
t'es génial mec :king: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 #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; }
en fait c bizarre car v.pushback est juste , elle sert à remplir le vector, je sais pas pourquoi v[0]=1; fonctionne et pushback ne fonctionne pas.
c ça mon erreur non?
C'est la première.
la fonction push_back ajoute la valeur dans le vector,en l'agrandissant,a la fin. Ce que je fais, je créé un vector de 4 elements et je l'initialise
Cherche vector dans le forum. Tu trouvera beaucoup d'info et d'expliquation.
T'as deusième, je pense que tu n'as pas trop compris comment se passe l'execution de mpi, non?
Pour chaque process, ton exe est executé independament l'un des autres. Donc ce qui passe dans l'un n'as pas de repercution dans les autres. Sauf ,si tu veut ,les échanges par MPI.
Ainsi, ton code avec les push_back tu as :
PREMIER INSTANCE DE L'EXE
1- tu utilise un tableau vide
2-ajoute 4 elements. Ton tableau fait maintenant 4
3- tu envoie un tableau de 4 elements
DEUSIEME INSTANCE DE L'EXE
tu utilise un tableau vide => tu va attend un buffer de taille 0 => erreur
un grand merci à vous.
je comprends maintenant l'erreur