如何在使用C的MPI中使用MPI_数据类型发送嵌套结构

如何在使用C的MPI中使用MPI_数据类型发送嵌套结构,c,distributed,mpi,distributed-computing,C,Distributed,Mpi,Distributed Computing,我试图使用MPI_数据类型发送以下结构,但MPI_发送在发送结构时崩溃。我想知道如何处理这种情况。以下是我为定义新MPI数据类型而编写的代码: typedef struct { double x; double y; } vertex; typedef struct { int num_vertices; vertex vertex[2]; } vertex_list; MPI

我试图使用MPI_数据类型发送以下结构,但MPI_发送在发送结构时崩溃。我想知道如何处理这种情况。以下是我为定义新MPI数据类型而编写的代码:

   typedef struct
    {
       double x;
       double y;
    } vertex;

   typedef struct
   {
        int num_vertices;
        vertex vertex[2];
   } vertex_list;


       MPI_Datatype vertexType;
        MPI_Type_contiguous(2,MPI_DOUBLE,&vertexType);
        MPI_Type_commit(&vertexType);

      MPI_Datatype vertexListType;
        MPI_Datatype typev[3] = {MPI_INT, vertexType, MPI_UB};
        int blocklenv[3] = {1, 2, 1};
        MPI_Aint dispv[3];
        /* compute displacements of structure components */
        MPI_Address( vertexl, dispv);
        MPI_Address( vertexl[0].vertex, dispv+1);
        MPI_Address(  vertexl+1, dispv+2);
        base = dispv[0];

        for (i=0; i <3; i++)
         dispv[i] -= base;

        /* build datatype describing structure */
        MPI_Type_struct( 3, blocklenv, dispv, typev, &vertexListType);
        MPI_Type_commit(&vertexListType);
typedef结构
{
双x;
双y;
}顶点;
类型定义结构
{
int num_顶点;
顶点[2];
}顶点列表;
MPI_数据类型vertexType;
MPI_类型_连续(2,MPI_双精度,&vertexType);
MPI_Type_commit(&vertexType);
MPI_数据类型vertexListType;
MPI_数据类型typev[3]={MPI_INT,vertexType,MPI_UB};
int blocklenv[3]={1,2,1};
MPI_u Aint dispv[3];
/*计算结构构件的位移*/
MPI_地址(vertexl、dispv);
MPI_地址(vertexl[0]。vertex,dispv+1);
MPI_地址(vertexl+1,dispv+2);
base=dispv[0];

对于(i=0;i我不确定您的结构是否能够按照您在这里所期望的方式工作,但我可以与您分享使用MPI_Send发送结构的经验

与其创建显式MPI数据类型,不如简单地发送结构本身,因为它的所有内容都在一个连续的内存块中。诀窍是为MPI_发送操作提供正确的大小和数据类型

使用您的结构,以下是我过去所做的工作(假设变量
vertex\u list
已经定义):

MPI_发送(&list,sizeof(顶点列表),MPI_字节,,);
因此,要发送的数据缓冲区是指向列表结构的指针,缓冲区的大小是以字节为单位的vertex_列表的大小,MPI数据类型只是字节

在接收端,您只需要提供一个顶点列表引用作为接收缓冲区:

vertex_list receiveList;
MPI_Recv(&receiveList, sizeof(vertex_list), MPI_BYTE, <rankOfSender>, <tagInteger>, <comm>, <status>);
顶点列表接收列表;
MPI_Recv(&receiveList,sizeof(顶点列表),MPI_字节,,);

希望这有帮助!

您可以编辑您的帖子,而不是添加评论。帖子中的代码可以很好地格式化,而且问题会更全面。我已经为您复制了代码(只是等待同行评审)。将来,正如
pmg
所说,您可以编辑自己的帖子,使用代码格式有助于获得更快的响应。您也应该显示发送。感谢您的回复@Captain@Head。如果嵌套结构中的数据不连续,例如当顶点是指针字段时,如何MPI_发送:typedef结构{double x;double y;}顶点;类型定义结构{int num_顶点;顶点*顶点;}vertex_list;@Head感谢您的回复。如果嵌套结构中的数据不连续,如何进行MPI_发送,例如,当顶点是指针字段,即“顶点*顶点”,而不是“顶点顶点[2]”,这肯定会变得更棘手,因为(我假设在本例中)接收过程没有简单的方法可以知道*顶点列表中有多少个顶点。编辑:也许关于您试图在接收端对这些顶点执行的操作的更多信息可能会激发一些想法。
vertex_list receiveList;
MPI_Recv(&receiveList, sizeof(vertex_list), MPI_BYTE, <rankOfSender>, <tagInteger>, <comm>, <status>);