Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MPI:MPI\u类型\u创建\u结构在发送\recv后导致分段错误_C_Multithreading_Segmentation Fault_Mpi - Fatal编程技术网

MPI:MPI\u类型\u创建\u结构在发送\recv后导致分段错误

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

嗨,我正在尝试为我的结构创建新的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_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数据类型的实例。堆上的东西的位置很难预测。