我有一个这样定义的结构:
typedef struct NodeItem {
int* data;
int info1;
int info2;
struct NodeItem* next;
} *Node;
我需要将这个结构发送到另一个 MPI 进程。 我知道在定义派生数据类型时我应该为 info1 和 info2 使用 MPI_INT。 但是,我很难用我的指针定义派生数据类型。 “数据”指向一个整数数组,它的大小只有在运行时才知道。 “next”指向我的链接列表中的下一个项目。
如果我的结构包含指针,我应该如何定义派生数据类型? 提前致谢, Dvir.
最佳答案
NEVER, ever send pointers between MPI processes! It's easy to think of a
char*
as an array ofchar
s, but it really isn't. It's just a memory address that won't make sense to the process you send it to, and even if it did, you didn't actually send the data that it was pointing to.
换句话说,您需要发送指针指向的数据而不是发送指针,并且接收进程必须自己填充其指针的值。在您的情况下,我会将发送分成两轮:
- 在第 1 轮中,您从每个结构发送
info1
和info2
(作为 2 整数 vector 的数组,或只是作为整数数组)。接收进程分配适当大小的NodeItem
,并且在每个节点中,data
都未初始化。info1
和info2
由接收到的数据填充,而next
是本地确定的(因为它最初是在发送过程中)。 - 在第 2 轮中,您根据
data
指针指向的所有数据创建一条消息。接收进程现在为每个NodeItem
分配空间,并将data
指针设置为分配的地址。
对于第 2 轮的发送,您可以定义一个 MPI_Indexed
数据类型。 block 的数量是NodeItem
对象的数量,长度是每个数组的大小,位移可以通过调用MPI_Address()
来计算,第一个元素是数组(不是 data
指针!)作为输入。
关于创建 mpi 派生数据类型,包含带指针的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20888888/