C、 MPI线程通信问题

C、 MPI线程通信问题,c,multithreading,mpi,C,Multithreading,Mpi,给定此结构: typedef struct { double rx, ry, rz; double vx, vy, vz; double fx, fy, fz; double mass; } Body; 我试图通过MPI多线程接口传递它。它是一个自定义结构,因此我创建了一个MPI类型: int bodyParamas=10; int blocklengths[10] = {1,1,1,1,1,1,1,1,1,1}; MPI_Datatype types[10]

给定此结构:

typedef struct 
{
    double rx, ry, rz;
    double vx, vy, vz;
    double fx, fy, fz;
    double mass;
} Body;
我试图通过MPI多线程接口传递它。它是一个自定义结构,因此我创建了一个MPI类型:

int bodyParamas=10;
int blocklengths[10] = {1,1,1,1,1,1,1,1,1,1};
MPI_Datatype types[10] = {MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE};
MPI_Datatype mpi_body_type;
MPI_Aint     offsets[10];
offsets[0] = offsetof(Body, rx);
offsets[1] = offsetof(Body, ry);
offsets[2] = offsetof(Body, rz);
offsets[3] = offsetof(Body, vx);
offsets[4] = offsetof(Body, vy);
offsets[5] = offsetof(Body, vz);
offsets[6] = offsetof(Body, fx);
offsets[7] = offsetof(Body, fy);
offsets[8] = offsetof(Body, fz);
offsets[9] = offsetof(Body, mass);
MPI_Type_create_struct(bodyParamas, blocklengths, offsets, types, &mpi_body_type);
MPI_Type_commit(&mpi_body_type);
然后在for循环中发送数据,并在其他线程中接收数据(与根线程不同):


有人看到任何错误吗?

根本原因是您
MPI\u Send()
num\u of\u body\u to\u Send
元素,但您
MPI\u Recv()
启动了\u body\u数组\u index
元素

您应该将第一个
MPI\u Send()
替换为

ierr = MPI_Send( &num_of_bodies_to_send, 1 , MPI_INT,
                 an_id, send_data_tag, MPI_COMM_WORLD);

根本原因是您
MPI\u Send()
num\u of\u body\u to\u Send
元素,但您
MPI\u Recv()
启动了\u body\u数组\u index
元素

您应该将第一个
MPI\u Send()
替换为

ierr = MPI_Send( &num_of_bodies_to_send, 1 , MPI_INT,
                 an_id, send_data_tag, MPI_COMM_WORLD);
ierr = MPI_Send( &num_of_bodies_to_send, 1 , MPI_INT,
                 an_id, send_data_tag, MPI_COMM_WORLD);