MPI基本数据类型对应于主机语言的数据类型,MPI_BYTE和MPI_PACKED除外。我的问题是使用这些MPI基本数据类型有什么好处?或者等效地,为什么仅使用主机语言数据类型是不好的?
我阅读了William Gropp等人的教程。在幻灯片31“为什么是数据类型”中,它说:
(http://www.mcs.anl.gov/research/projects/mpi/tutorial/mpiintro/ppframe.htm)
我没有理解这个解释。首先,如果基本数据类型不同,我不明白为什么使用MPI数据类型可以解决差异,因为基本MPI数据类型对应于主机语言的基本数据类型(基本数据类型)。其次,为什么这种面向应用的内存数据布局有两个好处?
任何解决我原始问题的答案都将被接受。任何答案都可以解答我的问题,威廉格罗普的解释也将被接受。
答案 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数据类型允许您直接从数据位置提取数据,而无需重新排列或复制数据。
我不确定第二点应该引用什么。