【问题标题】:How to send nested structure using MPI_Datatype in MPI using C如何使用 C 在 MPI 中使用 MPI_Datatype 发送嵌套结构
【发布时间】:2011-08-23 14:45:14
【问题描述】:

我正在尝试使用 MPI_Datatype 发送以下结构,但 MPI_Send 在发送结构时崩溃。我想知道如何处理这种情况。这是我为定义新的 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);

https://docs.google.com/document/d/1OQFtx0ClkKQx7X91BlVgiizs5D9jShhtgsKafrgC7hk/edit?hl=en

【问题讨论】:

  • 您可以编辑您的帖子而不是添加 cmets。帖子中的代码可以很好地格式化,问题会更好。
  • 我已经为你复制了代码(只是等待同行评审)。将来,正如pmg 所说,您可以编辑自己的帖子,使用代码格式有助于获得更快的响应。
  • 你也应该显示发送。
  • 感谢您的回复@Captain @Head。如果嵌套结构中的数据不连续,例如当顶点是指针字段时,如何 MPI_Send : typedef struct { double x;双 y; } 顶点; typedef struct { int num_vertices;顶点*顶点; } 顶点列表;

标签: c distributed mpi distributed-computing


【解决方案1】:

我不确定你的结构是否会按照你想要的方式工作,但我可以分享我使用 MPI_Send 发送结构的经验。

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

使用您的结构,这是我过去所做的(假设变量 vertex_list list 已经定义):

MPI_Send(&list, sizeof(vertex_list), MPI_BYTE, <rankToSendTo>, <tagInteger>, <comm>);

所以要发送的数据缓冲区是指向列表结构的指针,缓冲区的大小是以字节为单位的 vertex_list 的大小,而 MPI 数据类型只是字节。

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

vertex_list receiveList;
MPI_Recv(&receiveList, sizeof(vertex_list), MPI_BYTE, <rankOfSender>, <tagInteger>, <comm>, <status>);

希望有帮助!

【讨论】:

  • @Head 感谢您的回复。在嵌套结构中的非连续数据的情况下如何 MPI_Send,例如当顶点是指针字段时,即“vertex *vertex”而不是“vertex vertex[2]”
  • 这肯定会变得更棘手,因为(我假设在这种情况下)接收进程没有简单的方法可以知道 *vertex 列表中有多少顶点。编辑:也许有关您尝试在接收端对这些顶点做什么的更多信息可能会引发一些想法。
猜你喜欢
  • 2011-08-23
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 2014-12-20
  • 2015-12-11
  • 2015-11-19
  • 2023-03-27
  • 2020-10-29
相关资源
最近更新 更多