【问题标题】:What's the benefit of MPI Datatype?MPI 数据类型有什么好处?
【发布时间】:2013-09-28 07:31:30
【问题描述】:

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 解释的问题的答案也将被接受。

【问题讨论】:

    标签: types mpi


    【解决方案1】:

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

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

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

    double d;
    

    不是

    MPI_DOUBLE d;
    

    【讨论】:

    • 我不明白最后一个例子的意思。假设d 是一个变量,它将从一个进程发送到另一个进程。当我们定义d时,我们肯定使用MPI_DOUBLE d,而不是double d,对吧?
    • 您在程序中使用double d。看看MPI_Send 的原型。请注意,它需要 void* 作为要发送的缓冲区。它还要求 MPI_Datatype 告诉它缓冲区中有什么。这就是你放置 MPI_DOUBLE 的地方。
    • 我明白你的意思。换句话说,我们可以在程序中使用double d;MPI_DOUBLE d;(如果编译器没有报错的话)。您对减少内存到内存副本和允许使用特殊硬件这两个好处有任何见解吗?
    • 您不能使用MPI_DOUBLE d;MPI_DOUBLE 不是 C 或 C++ 类型。它仅用于内部 MPI 使用。在某些 MPI 实现中,数据类型是简单的索引(数字),在其他实现中,它们是结构。您不能像常规类型一样使用它们。这就像说17 d; 其中17 是您的类型。这没有任何意义。
    • 是的,你是对的。我对带有 MPI 类型的主机编程语言类型感到困惑。
    【解决方案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 数据类型允许您直接从数据所在的位置提取数据,而无需重新排列或复制数据。

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

    【讨论】:

      猜你喜欢
      • 2018-10-11
      • 2017-06-08
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2017-07-28
      • 1970-01-01
      • 2012-12-29
      • 2012-02-02
      相关资源
      最近更新 更多