MPI数据类型有什么好处?

时间:2013-09-27 19:41:42

标签: types mpi

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

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

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

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

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

任何解决我原始问题的答案都将被接受。任何答案都可以解答我的问题,威廉格罗普的解释也将被接受。

2 个答案:

答案 0 :(得分:3)

简短的回答是,这个系统为MPI增加了一个强类型。

答案很长,MPI数据类型的目的是告诉MPI函数他们正在使用什么。因此,例如,如果您将一个int从小端机器发送到大端机器,那么MPI可以为您执行字节顺序转换。另一个更常见的好处是MPI知道MPI_DOUBLE有多大,所以你不必在任何地方都有一堆sizeof语句。

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

double d;

不是

MPI_DOUBLE d;

答案 1 :(得分:2)

  

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

因为给定的MPI数据类型不需要在两台不同的机器上引用相同的基本类型。 MPI_INT在一台计算机上可能是int,在另一台计算机上可能是long。这在C ++中特别有用,因为the C++ standard doesn't specify byte size for the various integral types,所以int实际上可能在一台机器上拥有比另一台更多的位。

  

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

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

我不确定第二点应该引用什么。