【问题标题】:MPI and C structsMPI 和 C 结构
【发布时间】:2011-02-14 19:04:27
【问题描述】:

我不得不承认,看到使用 MPI 传输一个 C 结构体需要多少行代码,我感到非常震惊。

在什么情况下,使用预定义的数据类型MPI_CHAR 简单地传输结构会起作用?考虑以下示例:

struct particle {
   double x;
   double y;
   long   i;
};

struct particle p;
MPI_Isend(&p, sizeof(particle), MPI_CHAR, tag, MPI_COMM_WORLD, &sendr);

就我而言,所有进程都在相同的架构上运行。填充是唯一的问题吗?

【问题讨论】:

  • 我想借此机会说,如果 MPI 不是严格要求,请使用 Google 的协议缓冲区。 code.google.com/apis/protocolbuffers
  • 您不必担心填充,sizeof 会报告正确的值,包括填充
  • 是的,但可能因架构而异...

标签: c struct mpi


【解决方案1】:

我个人更关心可理解性和可维护性,甚至是可移植性,而不是填充。如果我要发送一个结构,我喜欢我的代码来表明我正在发送一个结构,而不是字节或字符序列。而且我希望我的代码能够在多个架构上运行,跨越多代语言标准和编译器。

我想我想说的是,如果值得定义一个结构(你显然认为是这样),那么就值得定义一个结构。保存几行(接近)样板代码并不是反对这一点的理由。

【讨论】:

  • 我不明白关于可维护性的论点。在上面的代码段中,我可以更改结构而无需执行任何其他操作。而如果我使用 MPI_Type_create_struct 以正确的方式进行操作,我必须更改至少 4 行代码...
  • @hanno,请参阅@suszterpatt 对可维护性争论的回答,比我管理的解释得更好。
【解决方案2】:

MPI_BYTE 是发送无类型数据时使用的数据类型,而不是MPI_CHAR。如果两台机器具有相同的架构但使用不同的字符编码,使用MPI_CHAR 可能会损坏您的数据。以MPI_BYTE 发送您的数据将使二进制表示保持原样,并且不执行任何表示转换。

也就是说,是的,从技术上讲,以这种方式发送结构是正确的,如果(且仅当)您可以保证发送端和接收端的数据表示形式相同。然而,这是一种糟糕的编程习惯,因为它混淆了代码的用途,并引入了平台依赖性。

请记住,您只需定义和提交一次数据类型,而您通常需要编写代码来多次发送。降低所有发送的清晰度只是为了在单个定义上节省几行并不是一种折衷。

【讨论】:

  • 谢谢。还有一个问题:使用MPI_BYTE 是否有性能优势?或者,当我使用自己的 MPI 数据类型传输结构时是否有任何开销?我正在考虑类似 MPI 将数据以小块的形式复制到另一个缓冲区等...
  • 这可能依赖于实现,我想你从不执行表示检查/转换中获得的任何性能提升都会被首先传递消息的总体成本所掩盖。尽管如此,比较发送大量有效载荷(数千个)类型的结构和非类型的结构需要多长时间,这可能是一个有趣的实验。
猜你喜欢
  • 2022-01-01
  • 2016-09-16
  • 2013-12-12
  • 2014-11-16
  • 2011-07-04
  • 2012-10-23
  • 2018-06-05
  • 2013-11-07
  • 1970-01-01
相关资源
最近更新 更多