MPI:MPI\u类型\u创建\u结构在发送\recv后导致分段错误
嗨,我正在尝试为我的结构创建新的MPI_数据类型:MPI:MPI\u类型\u创建\u结构在发送\recv后导致分段错误,c,multithreading,segmentation-fault,mpi,C,Multithreading,Segmentation Fault,Mpi,嗨,我正在尝试为我的结构创建新的MPI_数据类型: typedef struct Handler { int max, pivot; int *array, *temp, *index; }*Handler; 像这样: void build_derived_type(Handler handler, int size, MPI_Datatype* message_type_ptr) { int block_lengths[5]; MPI_Aint displacements[5]; MPI_D
typedef struct Handler {
int max, pivot;
int *array, *temp, *index;
}*Handler;
像这样:
void build_derived_type(Handler handler, int size, MPI_Datatype* message_type_ptr) {
int block_lengths[5];
MPI_Aint displacements[5];
MPI_Datatype typelist[5];
MPI_Aint addresses[6]; // Helper array
typelist[0] = MPI_INT;
typelist[1] = MPI_INT;
typelist[2] = MPI_INT;
typelist[3] = MPI_INT;
typelist[4] = MPI_INT;
block_lengths[0] = block_lengths[1] = 1;
block_lengths[2] = block_lengths[3] = block_lengths[4] = size;
MPI_Get_address(handler, &addresses[0]);
MPI_Get_address(&handler->max, &addresses[1]);
MPI_Get_address(&handler->pivot, &addresses[2]);
MPI_Get_address(handler->array, &addresses[3]);
MPI_Get_address(handler->temp, &addresses[4]);
MPI_Get_address(handler->index, &addresses[5]);
displacements[0] = &handler->max - addresses[0];
displacements[1] = &handler->pivot - addresses[0];
displacements[2] = handler->array - addresses[0];
displacements[3] = handler->temp - addresses[0];
displacements[4] = handler->index - addresses[0];
MPI_Type_create_struct(5, block_lengths, displacements, typelist, message_type_ptr);
MPI_Type_commit(message_type_ptr);
}
我想我做错了什么,因为已经在发送\recv:
Handler handler;
MPI_Datatype handler_type;
MPI_Comm_rank(MPI_COMM_WORLD, &id);
handler = init_handler(size);
build_derived_type(handler, &handler_type);
if (id == MASTER) {
MPI_Comm_size(MPI_COMM_WORLD, &th_);
for (int i = 1; i < th_; i++) {
MPI_Send(init_handler(size), 1, handler_type, i, HANDLER_TAG, MPI_COMM_WORLD);
}
} else {
MPI_Recv(handler, 1, handler_type, MASTER, HANDLER_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
}
Handler;
MPI_数据类型处理程序_类型;
MPI通信等级(MPI通信世界和id);
handler=init_handler(大小);
生成派生类型(处理程序和处理程序类型);
if(id==MASTER){
MPI通信大小(MPI通信世界和th);
对于(int i=1;i
下面是init_处理程序代码:
Handler init_handler(const int size) {
Handler handler = (Handler) malloc(sizeof(struct Handler));
if (!handler)
return NULL;
handler->max = size - 1;
handler->pivot = 0;
handler->array = (int*) malloc(sizeof(int) * size);
handler->temp = (int*) malloc(sizeof(int) * size);
handler->index = (int*) malloc(sizeof(int) * size);
for (int i = 0; i < size; i++)
handler->array[i] = handler->index[i] = i;
return handler;
}
Handler init\u Handler(const int size){
Handler=(Handler)malloc(sizeof(struct Handler));
if(!handler)
返回NULL;
处理程序->最大值=大小-1;
handler->pivot=0;
处理程序->数组=(int*)malloc(sizeof(int)*size);
handler->temp=(int*)malloc(sizeof(int)*size);
处理程序->索引=(int*)malloc(sizeof(int)*size);
对于(int i=0;i数组[i]=处理程序->索引[i]=i;
返回处理程序;
}
我得到以下错误(代码编译):
mpirun注意到节点bl201上PID为19574的进程秩3在信号11(分段故障)时退出
我做错了什么?谢谢。对于
处理程序
的任何其他实例,与用于创建MPI数据类型的实例相比,消息_type_ptr
中的偏移量不太可能是正确的。堆上东西的位置很难预测。message\u type\u ptr
中的偏移量对于Handler
的任何其他实例都不太可能是正确的,而不是用于创建MPI数据类型的实例。堆上的东西的位置很难预测。