2016-05-21 10 views
0

I die folgende C-Struktur erhalten haben:MPI: eine Anordnung einer Struktur Senden eines Zeigers enthält

typedef struct chromosome{ 
int *genes; 
float cout; 
}chromosome; 

Ich möchte ein Array von Chromosomen senden MPI_Send verwenden. Ich habe eine MPI_CHROMOSOME Datentyp wie folgt definiert:

MPI_Datatype MPI_CHROMOSOME; 
MPI_Datatype TYPES_ELEMENTAIRES[2] = {MPI_INT, MPI_FLOAT}; 
int blocklengths[2] = {NB_SOMMETS,1}; //NB_SOMMET is a known integer value at this point (number of elements of the "genes" array) 
MPI_Aint offsets[2]; 

offsets[0] = offsetof(chromosome, genes); 
offsets[1] = offsetof(chromosome, cout); 

MPI_Type_create_struct(2, blocklengths, offsets, TYPES_ELEMENTAIRES, &MPI_CHROMOSOME); 
MPI_Type_commit(&MPI_CHROMOSOME); 

Dann habe ich versucht, eine Reihe von Chromosomen zu senden:

chromosome *sub_pop = malloc(taille_sub_pop*sizeof(chromosome));//taille_sub_pop is a known integer value 
/* ... Fills sub_pop with chromosomes ...*/ 
MPI_Send(sub_pop,taille_sub_pop,MPI_CHROMOSOME, 1, 3, MPI_COMM_WORLD); 

... Aber ich habe einen Fehler (BAD Beendigung eines Ihrer ANWENDUNGSPROZESSE ... Exit Code 139 ... Ihre Anwendung wurde mit dem EXIT STRING beendet: Segmentierungsfehler (Signal 11)).

Wie kann ich dieses Array richtig senden? Ich würde Ihre Hilfe schätzen. Danke vielmals.

Antwort

1

Sie können keine Zeiger zu anderen Prozessen mit MPI senden. Nun, technisch kann man das, aber da jeder Prozess seinen eigenen Speicherraum und seine eigene Adressierung hat, wird ein Zeiger, der in einem Prozess gültig war, höchstwahrscheinlich auf einen anderen auf einen ungültigen Speicher verweisen. Wie auch immer, Sie möchten die Daten senden, auf die der Zeiger zeigt, nicht den Zeiger selbst.

Sehen Sie diese Frage: Creating an MPI_Datatype for a structure containing pointers

+0

Hallo, danke für deine Antwort. In dem Link, den Sie mir geschickt haben, möchte ich tatsächlich eine Anordnung dieser Art von Struktur senden, nicht nur ein Element ... – Reda94

Verwandte Themen