6

MPI 基本数据类型对应宿主语言的数据类型,但 MPI_BYTE 和 MPI_PACKED 除外。我的问题是使用这些 MPI 基本数据类型有什么好处?或者等效地,为什么只使用宿主语言数据类型是不好的?

我阅读了 William Gropp 等人的教程。在幻灯片 31“为什么使用数据类型”中,它说:

  • 由于所有数据都按类型标记,因此 MPI 实现可以支持具有非常不同的内存表示和基本数据类型长度的机器上的进程之间的通信(异构通信)。
  • 在内存中指定面向应用程序的数据布局
    • 减少实现中的内存到内存副本
    • 允许在可用时使用特殊硬件(分散/聚集)

( http://www.mcs.anl.gov/research/projects/mpi/tutorial/mpiintro/ppframe.htm )

我不明白解释。首先,如果基本数据类型不同,我不明白为什么使用 MPI 数据类型可以解决差异,因为基本 MPI 数据类型对应于宿主语言的基本数据类型(基本数据类型)。第二,为什么这种面向应用的内存数据布局有上面提到的两个好处?

任何解决我原始问题的答案都将被接受。任何能解决我对 William Gropp 解释的问题的答案也将被接受。

4

2 回答 2

3

简短的回答是,该系统为 MPI 增加了一定程度的强类型。

长答案是 MPI 数据类型的目的是告诉 MPI 函数它们正在使用什么。因此,例如,如果您将 int 从 little-endian 机器发送到 big-endian 机器,则 MPI 可以为您进行字节顺序转换。另一个更常见的好处是 MPI 知道 MPI_DOUBLE 有多大,因此您不必sizeof到处都有一堆语句。

请注意,MPI 数据类型是标签,而不是实际数据类型。换句话说,你使用

double d;

不是

MPI_DOUBLE d;
于 2013-09-27T21:01:00.940 回答
2

首先,如果基本数据类型不同,我不明白为什么使用 MPI 数据类型可以解决差异,因为基本 MPI 数据类型对应于宿主语言的基本数据类型(基本数据类型)。

因为给定的 MPI 数据类型不需要在两台不同的机器上引用相同的基本类型。MPI_INT可能int在一台机器上,而在另一台机器long上。这在 C++ 中特别有用,因为C++ 标准没有为各种整数类型指定字节大小,因此int实际上一台机器上的位可能比另一台机器上的位多。

第二,为什么这种面向应用的内存数据布局有上面提到的两个好处?

看看 的论点MPI_Send()。它接收void*到数据的开头,以及要发送的元素数。它假设元素在内存中连续排列,一个接一个,并且都是相同的类型。除了最幸运的情况外,在您的应用程序中并非如此。即使您只有一个简单的结构数组(其中结构的元素并非都是相同的类型),在没有用户定义的 MPI 数据类型的情况下发送这些结构的唯一方法是将每个结构的第一个元素复制到单独的数组,发送它,然后将每个结构中的第二个元素复制到不同的数组,发送它,等等。派生的 MPI 数据类型允许您直接从数据所在的位置提取数据,而无需重新排列或复制数据。

不过,我不确定第二点应该指什么。

于 2013-09-27T23:31:30.860 回答