MPI:发送包含指针的结构数组

时间:2016-05-21 15:19:45

标签: c arrays mpi

我有以下C结构:

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 个答案:

答案 0 :(得分:2)

您无法使用MPI向其他进程发送指针。好吧,从技术上讲,你可以,但由于每个进程都有自己的内存空间和寻址,因此在一个进程上有效的指针很可能指向另一个进程上的无效内存。无论如何,您希望发送指针指向的数据,而不是指针本身。

看到这个问题: Creating an MPI_Datatype for a structure containing pointers