我有一个类似于这样的结构:
typedef struct NodeItem {
int* data;
int info1;
int info2;
struct NodeItem* next;
} *Node;
我需要将此结构发送到另一个MPI进程。 我知道在定义派生数据类型时我应该使用MPI_INT作为info1和info2。 但是,我很难用我的指针定义派生数据类型。 “data”指向一个整数数组,其大小仅在运行时才知道。 “next”指向我链接列表中的下一个项目。
如果我的struct包含指针,我该如何定义派生数据类型? 提前致谢, DVIR。
答案 0 :(得分:0)
从another similar question引用自己:
永远不要在MPI进程之间发送指针!很容易将
char*
视为char
的数组,但事实并非如此。它的 只是一个内存地址,对你发送的进程没有意义 to,即使它确实如此,你实际上并没有发送它的数据 指着。
换句话说,不是发送指针,而是需要发送指针指向的数据,接收进程必须填充其指针本身的值。在你的情况下,我将发送分为两轮:
info1
和info2
(作为2整数向量的数组,或者仅作为整数数组)。接收过程分配适当大小的NodeItem
s,并在每一个中保留未初始化的data
。从收到的数据填充info1
和info2
,而本地确定next
(因为它最初是在发送过程中)。data
指针所指向的所有数据创建一条消息。接收过程现在为每个NodeItem
分配空间,并将data
指针设置为分配的地址。对于第2轮中的发送,您可以定义MPI_Indexed
数据类型。块的数量是NodeItem
个对象的数量,长度是每个数组的大小,并且可以通过使用数组的第一个元素(而不是{{1)调用MPI_Address()
来计算位移。指针!)作为输入。