【问题标题】:How to send structure as array over MPI?如何通过 MPI 将结构作为数组发送?
【发布时间】:2018-11-09 14:22:38
【问题描述】:

我有这个结构

typedef struct { float x, y, z, vx, vy, vz; } 正文;

float *buf, *bufSlave;
Body *p;
bytes = nBodies*sizeof(Body);
buf = (float*)malloc(bytes);
p = (Body*)buf;

如何使用 MPI_SEND 发送 15 个元素以及如何使用 MPI_RECEIVE 接收?

MPI_Send(&p[(i - 1) * lung], 6, MPI_FLOAT, i, 99, MPI_COMM_WORLD); 

我有分段错误。

【问题讨论】:

  • 您在发送结构数组的方法中是否考虑过与机器相关的字节顺序问题、结构填充问题和其他消息加扰问题? (假设您的消息传输将包括针对各种不同类型的计算机)
  • 是的,但我不明白如何发送...
  • 如果没有可重复的例子,就很难提供帮助。
  • 我必须并行解决 n 体问题以实现精度
  • 请使用minimal reproducible example 编辑您的问题。同时,您可以了解派生数据类型。

标签: c mpi openmpi


【解决方案1】:

首先,请注意,该方法适用于具有相同架构的同构集群。

对于一般情况和高稳定性,请选择安全的传输协议,例如 JSON 或协议缓冲区。

第三,将 boost::serialization 转换为 stringstreams 会很方便。类似的限制,但不需要库。

不管怎样,现在答案是:当你想发送结构体时,使用数据类型 MPI_CHAR 和 count N * sizeof(Struct)

对于接收,要么您已经知道 N,要么使用 MPI_Probe 并从消息中提取计数。这将是多个字节。分配一个这个大小的缓冲区,MPI_RECV 到里面,并通过强制转换将它重新解释为一个 Buffer 数组。

基本原理是通过 MPI_CHAR 因为结构可能有填充。

【讨论】:

  • 这是一个讽刺/幽默的回答吗? MPI 派生的数据类型在这里是最合适的(性能、可移植性和易用性)。只要您的 MPI 库可以支持此类配置,它也适用于异构系统。
  • 评论荒谬。虽然使用 MPI_FLOAT 可能更好,但问题是关于发送一个结构。复制和打包数组是使用 MPI_FLOAT 的唯一方法。由于我们不知道为什么数据在结构中的原因,我们仍然应该支持提出问题的人。
  • MPI_FLOAT 不是派生数据类型。让我们同意在其他所有问题上不同意。
  • 我从来没有说过 MPI_FLOAT。问题是关于结构的。我的回答是正确的,您只提供正确的建议,但不适合问题的情况。
  • 在您对我的评论的回复中,我读了两次MPI_FLOAT。你可能从来没有说过任何关于它的事情,但你肯定写过两次。我只提到要声明这不是派生数据类型,我从来没有写过应该使用这个。无论如何,让我们再尝试(尝试)同意不同意。
猜你喜欢
  • 2021-06-11
  • 1970-01-01
  • 2013-12-12
  • 2013-08-29
  • 2021-11-19
  • 2012-10-23
  • 2012-11-26
  • 2016-05-07
  • 2016-09-18
相关资源
最近更新 更多