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

标签 c pointers struct mpi

我有一个这样定义的结构:

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

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

如果我的结构包含指针,我应该如何定义派生数据类型? 提前致谢, Dvir.

最佳答案

引自 another similar question :

NEVER, ever send pointers between MPI processes! It's easy to think of a char* as an array of chars, 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 轮中,您从每个结构发送 info1info2(作为 2 整数 vector 的数组,或只是作为整数数组)。接收进程分配适当大小的 NodeItem,并且在每个节点中,data 都未初始化。 info1info2由接收到的数据填充,而next是本地确定的(因为它最初是在发送过程中)。
  • 在第 2 轮中,您根据 data 指针指向的所有数据创建一条消息。接收进程现在为每个 NodeItem 分配空间,并将 data 指针设置为分配的地址。

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

关于创建 mpi 派生数据类型,包含带指针的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20888888/

相关文章:

c - proc_dir_entry 警告 : initialization from incompatible pointer type [enabled by default]

c - 关于指针指向指针的问题

c - 反转几个文件的所有字符串

我可以创建适用于不同字节序的颜色结构吗?

asynchronous - 如何将异步函数存储在结构中并从结构实例中调用它?

c++ - 如何将编码从 C 转换为 C++?

C 编程简单指针

c++ - 如何在 VS Code 中为 C++ 开发进行初始设置?

c - 获取条件表达式的地址

c++ - Valgrind 在通过指向结构的指针访问结构成员时提示无效读取