Comment utiliser un vecteur Ublas avec open MPI

bp4012 Messages postés 2 Date d'inscription samedi 15 décembre 2007 Statut Membre Dernière intervention 25 novembre 2008 - 24 nov. 2008 à 23:14
bp4012 Messages postés 2 Date d'inscription samedi 15 décembre 2007 Statut Membre Dernière intervention 25 novembre 2008 - 25 nov. 2008 à 18:34
Bonjour,

Je code un programme de calcul de propagation d'onde en parallele.
Je précise que je débute en programmation C++ et MPI.
Je suis sous linux.

J'utilise les vecteur de boost Ublas et j'aimerai utiliser deux fonctions de MPI : scatter et sendrecv. 
Pour ces deux fonctions, il me faut l'addresse du vecteur, si je rentre nom_vecteur le compilateur me dit que ce n'est pas un void *; et si je rentre &nom_vecteur le compilateur n'accepte pas non plus.

Est-il possible d'obtenir l'index en quelque sorte d'un vecteur Ublas? De cette maniere, je pouraai directement envoyer nom_vecteur.index() avec la methode index que j'aurai crée dans ma classe vecteur.

Si quelqu'un a une piste ou la solution, merci d'avance.

Ps si ma question n'est pas claire ou au mauvais endroit sur le forum, n'hésitez pas à me le signaler.

2 réponses

cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
25 nov. 2008 à 17:04
Bonjour,

Pourrais-tu poster le code qui ne compile pas ainsi que l'erreur et également préciser la version de boost que tu utilises ?
0
bp4012 Messages postés 2 Date d'inscription samedi 15 décembre 2007 Statut Membre Dernière intervention 25 novembre 2008
25 nov. 2008 à 18:34
Alors voila mon code. il s'agit juste d'un petit test avec scatter et un vecteur(VecteurSP, hérité directement des vecteurs de ublas ,l'avant derniere version,1.36 :

#include
#include <stdio.h>
#include <fstream>
#include "MatriceBoost.h"
#include <mpi.h>

using namespace std;

int
main(int argc, char *argv[])
{

int rank, size;
int i;

int Nx = 20;
VecteurSP X(Nx);
for (i=0;i<Nx;i++)
    {
     X(i) = i;
    }

    cout<< "le vecteur X est : "<<X<<endl;

//////////////////////////////debut parallel////////////////////////////////////////////////////////

  MPI::Init(argc, argv);

  rank = MPI::COMM_WORLD.Get_rank();
  size = MPI::COMM_WORLD.Get_size();

  int Nx_proc = Nx/size;
  VecteurSP X_proc(Nx_proc);

MPI_Scatter( &X(0)), Nx_proc, MPI_REAL, &X_proc(0), Nx_proc, MPI_REAL, 0, MPI_COMM_WORLD);

  cout << "Hello world! I am " << rank +1 << " of " << size << " et mon vecteur X_proc est : "<<X_proc<<endl;

  MPI::Finalize();

  return 0;
}






Quand je compile, j'obtient ceci :

[jerem@localhost MPI_scatter]$ mpic++ -Wall -o main_scatter main_scatter.cpp
main_scatter.cpp: In function ‘int main(int, char**)’:
main_scatter.cpp:40: erreur: cannot convert ‘VecteurSP’ to ‘void*’ for argument ‘1’ to ‘int MPI_Scatter(void*, int, ompi_datatype_t*, void*, int, ompi_datatype_t*, int, ompi_communicator_t*)’
main_scatter.cpp:40: erreur: expected `;' before ‘)’ token

J'ai également essayer de mettre &X(0) à la place de X mais sans succes, dans ce cas il me retourne :
[jerem@localhost MPI_scatter]$ mpic++ -Wall -o main_scatter main_scatter.cpp
/tmp/ccDZe6EC.o: In function `main':
main_scatter.cpp:(.text+0x87): undefined reference to `VecteurSP::VecteurSP(int)'
main_scatter.cpp:(.text+0x145): undefined reference to `VecteurSP::VecteurSP(int)'
collect2: ld a retourné 1 code d'état d'exécution

Je précise également que j'ai utilisé le meme programme avec un tableau tout simple et la pas de probleme en mettant juste le nom du tableau comme argument.

Voila, si il faut encore des précision aucun souci,

Merci d'avance!
0
Rejoignez-nous