创建mpi派生数据类型,包含带指针的struct

时间:2014-01-02 18:00:46

标签: c pointers struct mpi

我有一个类似于这样的结构:

typedef struct NodeItem {
int* data;
int info1;
int info2;
struct NodeItem* next;
} *Node;

我需要将此结构发送到另一个MPI进程。 我知道在定义派生数据类型时我应该使用MPI_INT作为info1和info2。 但是,我很难用我的指针定义派生数据类型。 “data”指向一个整数数组,其大小仅在运行时才知道。 “next”指向我链接列表中的下一个项目。

如果我的struct包含指针,我该如何定义派生数据类型? 提前致谢, DVIR。

1 个答案:

答案 0 :(得分:0)

another similar question引用自己:

  

永远不要在MPI进程之间发送指针!很容易将char*视为char的数组,但事实并非如此。它的   只是一个内存地址,对你发送的进程没有意义   to,即使它确实如此,你实际上并没有发送它的数据   指着。

换句话说,不是发送指针,而是需要发送指针指向的数据,接收进程必须填充其指针本身的值。在你的情况下,我将发送分为两轮:

  • 在第1轮中,您从每个结构发送info1info2(作为2整数向量的数组,或者仅作为整数数组)。接收过程分配适当大小的NodeItem s,并在每一个中保留未初始化的data。从收到的数据填充info1info2,而本地确定next(因为它最初是在发送过程中)。
  • 在第2轮中,您将从data指针所指向的所有数据创建一条消息。接收过程现在为每个NodeItem分配空间,并将data指针设置为分配的地址。

对于第2轮中的发送,您可以定义MPI_Indexed数据类型。块的数量是NodeItem个对象的数量,长度是每个数组的大小,并且可以通过使用数组的第一个元素(而不是{{1)调用MPI_Address()来计算位移。指针!)作为输入。