Types 什么';MPI数据类型的好处是什么?

Types 什么';MPI数据类型的好处是什么?,types,mpi,Types,Mpi,MPI基本数据类型与主机语言的数据类型相对应,但MPI_字节和MPI_压缩除外。我的问题是,使用这些MPI基本数据类型有什么好处?或者等效地,为什么只使用宿主语言数据类型是不好的 我在幻灯片31“为什么是数据类型”中阅读了William Gropp等人的一篇教程,其中写道: 由于所有数据都是按类型标记的,因此MPI实现可以支持具有非常不同的内存表示和基本数据类型长度的机器上的进程之间的通信(异构通信) 指定面向应用程序的内存数据布局 减少实现中的内存到内存拷贝 允许在可用时使用特殊硬件(散射

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

我在幻灯片31“为什么是数据类型”中阅读了William Gropp等人的一篇教程,其中写道:

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

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


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

简短的回答是,该系统为MPI添加了一个强键入级别

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

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

double d;
不是

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

因为给定的MPI数据类型不需要在两台不同的机器上引用相同的基本类型
MPI_INT
在一台机器上可以是
INT
,在另一台机器上可以是
long
。这在C++中特别有用,因为,<<代码> int >代码>实际上可能在一台机器上比另一台机器有更多的位。 第二,为什么这种面向应用程序的内存数据布局具有 提到两个好处

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


不过,我不确定第二点指的是什么。

我不明白最后一个例子的意思。假设
d
是一个变量,它将从一个进程发送到另一个进程。当我们定义
d
时,我们当然使用
MPI\u DOUBLE d
,而不是
DOUBLE d
,对吗?您在程序中使用
DOUBLE d
。看看MPI_Send的原型。请注意,它使用
void*
作为发送缓冲区。它还要求一个MPI_数据类型来告诉它缓冲区中有什么。那就是你放MPI_双的地方。我明白你的意思。换句话说,我们可以使用
double d
MPI\u双d在程序中(如果编译器没有抱怨)。您是否了解这两个好处,即减少mem到mem的拷贝和允许使用特殊硬件?您不能使用
MPI\u DOUBLE d<代码> MPIUBux<代码>不是C或C++类型。它仅用于内部MPI使用。在一些MPI实现中,数据类型是简单索引(数字),而在另一些MPI实现中,数据类型是结构。你不能像普通人那样使用它们。那就像说
17d其中
17
是您的类型。这毫无意义。是的,你是对的。我对主机编程语言类型和MPI类型感到困惑。
MPI_DOUBLE d;