Aller au contenu

mpi et pointeurs


sabri

Messages recommandés

Salut

Comme je suis nouveau sur ce forum, je me présente:

sabri , 29 ans thésard en Méthodes Quantitatives.

Je me suis inscrit dans ce forum car je faisais des rechreches sur les alg genetiques multiobjectifs parallèles avec MPI. mon probleme est que je ne sais pas comment peut-on envoyer un membre d'une classe et cette classe contient un pointeur ( car la taille depend du problème etudié et non pas un tableau fixe).

si c'est possible me donner un ptit exemple.

Merci d'avanceà tous

sabri;

Lien vers le commentaire
Partager sur d’autres sites

Salut

Comme je suis nouveau sur ce forum, je me présente:

sabri , 29 ans thésard en Méthodes Quantitatives.

Je me suis inscrit dans ce forum car je faisais des rechreches sur les alg genetiques multiobjectifs parallèles avec MPI. mon probleme est que je ne sais pas comment peut-on envoyer un membre d'une classe et cette classe contient un pointeur ( car la taille depend du problème etudié et non pas un tableau fixe).

si c'est possible me donner un ptit exemple.

Merci d'avanceà tous

sabri;

Salut,

Je ne suis pas sûr d'avoir bien compris ta question, aussi, si je réponds à côté de la plaque, essaie de préciser un peu ton problème.

À ma connaissance, le seul moyen d'envoyer un membre d'une classe est de faire un pack de tout ce que tu veux envoyer et de déballer le pack à la réception du message. L'autre solution est d'envoyer chaque champ dont tu as besoin séparément.

Pour ce qui est des exemples d'utilisation du pack, tu peux en trouver ici.

Lien vers le commentaire
Partager sur d’autres sites

salut;

merci de me repondre;

et voici un exemple j'ai 1 classe individu et je veux envoyer un individu d'1 poste à 1 autre:

class individu

{

public:

double *val;// vecteur contenant les valeurs en réel des variables.

int *chromosome;//vecteur portant le code binaire de chaque varialbe.

double *COUT;//tableau de cout

double *f;

double fitness;// fitness de l'individu.

int nb_var;

int nb_obj;

int prec;// precision des variables de l'individu.

individu(int v, int nb_va, int nb_ob);

individu();

void init(double inf, double sup);// intialisation d'un individu.

void code(int prec, double sup, double inf,int nb_var);// codage en binaire d'un individu.

long puis(int);// fonction de puissance.

void decode(int prec,double inf,double sup,int nb_var);// fonction de decodage des enfants.

individu* croisement(int ch_cr,individu parent2,int v,int nb_va,int nb_ob);// fonction de recombinaison.

void individu::mutation(int ch_mut,double pr_mut,int prec,int nb_var);

void mutation1(int prec,int nb_var);

void mutation2(double pr_mut,int prec,int nb_var);

};

merci ;

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Je te réponds ici, mais j'ai bien vu ton MP :)

Si tu veux envoyer un individu d'un processus à un autre, tu peux

- ou bien envoyer séparément chaque champ du processus A au processus B ;

- ou bien faire un paquet avec tous les champs de l'individu, envoyer le paquet de A à B, et déballer le paquet sur B.

La 2ème solution est beaucoup plus intéressante pour les performances.

Maintenant, dans ton paquet, tu vas devoir mettre tout le contenu de tes vecteurs, et pas seulement le pointeur.

Pour faire le paquet, tu dois utiliser la fonction MPI_Pack, et pour le déballer, la fonction MPI_Unpack. Il y a quelques exemples sur la page dont j'ai donné le lien dans mon message précédent.

Ça donnerait quelque chose comme

MPI_Pack(val, "taille_de_val", MPI_DOUBLE, sendbuf, k, &position, comm);

MPI_Pack(chromosome, "taille_de_chromosome", MPI_INT, sendbuf, k, &position, comm);

...

Le dernier exemple sur le lien que j'ai donné plus haut est très bien je trouve, regarde le en détail, ça devrait convenir à ce que tu souhaites faire. L'"objet" envoyé dans l'exemple est composé d'un entier puis d'un tableau de char. Il te suffit d'adapter l'exemple à ta classe individu, et à remplacer la communication collective par une communicatin point à point. Ensuite, dans le unpack de l'exemple, il y a une boucle parce que plusieurs paquets ont été concaténés, donc attention puisque ça ne devrait pas être le cas pour toi si j'ai bien compris.

Voilà, j'espère que ça t'aidera.

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