2016-05-21 5 views
0

я получил следующую структуру C:MPI: Отправка массива структуры, содержащей указатель

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

Я хотел бы послать массив хромосом с использованием MPI_Send. Я определил тип данных MPI_CHROMOSOME так:

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); 

Затем я попытался отправить массив хромосом:

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); 

... Но я получил ошибку (BAD РАСТОРЖЕНИЕ одного из ваших ПРОЦЕССЫ ПРИМЕНЕНИЯ ... Код выхода 139 ... ВАША ПРИМЕНЕНИЕ, ПРЕКРАЩАЕМАЯ С ВЫХОДНОЙ СТРОКОЙ: Ошибка сегментации (сигнал 11)).

Как я могу отправить этот массив правильно? Буду признателен за вашу помощь. Большое спасибо.

ответ

1

Вы не можете отправлять указатели на другие процессы с помощью MPI. Ну, технически вы можете, но поскольку каждый процесс имеет собственное пространство памяти и адресацию, указатель, который был действителен для одного процесса, скорее всего, укажет на недопустимую память на другой. В любом случае, вы хотите отправить данные, на которые указывает указатель, а не указатель.

Смотрите этот вопрос: Creating an MPI_Datatype for a structure containing pointers

+0

Привет, спасибо за ваш ответ. В ссылке, которую вы мне отправили, я действительно хочу отправить массив такой структуры, а не только один элемент ... – Reda94

Смежные вопросы