您必须在发送结构之前进行一些操作。我为您的示例编写了代码,但为了更好地理解,您应该阅读一些文档。无论如何,这里有一些提示:
- 如果您有一个仅由一种元素组成的结构,例如在您的示例中所有变量都是 int,那么最好发送一个向量来处理每个变量的位置。
- 如果您有其他类型,则必须将count设置为 2 或更多并更改所有其他数组(例如:array_of_types、array_of_blocklengths 等)。
- 在这种情况下,您可以自行计算array_of_displaysments的值,注意数据结构对齐。例如,如果您有下面的结构,x 将从 0 开始,而 y 从 8 开始,因为将添加 4 个字节的填充来对齐元素。
struct point{ int x; double y; };
- 如果您不想计算 array_of_displaysments,请始终使用 MPI_Get_Address 并且不要依赖&运算符。
这里的代码:
struct info{
int ne, n, u, v, process,min,strip,mincost,b;
}stat;
int main(...){
/*MPI INIT*/
struct info _info,
int count; //Says how many kinds of data your structure has
count = 1; //1, 'cause you just have int
// Says the type of every block
MPI_Datatype array_of_types[count];
// You just have int
array_of_types[0] = MPI_INT;
// Says how many elements for block
int array_of_blocklengths[count];
// You have 8 int
array_of_blocklengths[0] = {8};
/* Says where every block starts in memory, counting from the beginning of the struct. */
MPI_Aint array_of_displaysments[coun];
MPI_Aint address1, address2;
MPI_Get_address(&_info,&address1);
MPI_Get_address(&_info.ne,&address2);
array_of_displaysments[0] = address2 - address1;
/*Create MPI Datatype and commit*/
MPI_Datatype stat_type;
MPI_Type_create_struct(count, array_of_blocklengths, array_of_displaysments, array_of_types, &stat_type);
MPI_Type_commit(&stat_type);
// Now we are ready to send
MPI_Send(&_info, 1, stat_type, dest, tag, comm),
/* . . . */
// Free datatype
MPI_Type_free(&stat_type);
// MPI finalization
MPI_Finalize();
}