第三章 点对点通讯

FORWARD BACKWARD ROOT CONTENT HELP HOME


第三章 点对点通讯


3.3 数据类型匹配和数据转换

3.3.1 类型匹配规则

我们能认为消息传送由下列三个阶段组成。   

在这三个阶段,没有看到类型匹配:在发送者缓存中的每个变量类型必须匹配该发送操作为输如指定的类型;由发送操作指定的类型必须匹配由接收操作指定的类型;在接收缓存中的每个变量的类型必须匹配由接收操作为指定的类型。不能观察到这三个规则的程序是错误的。   为了更精确地定义,我们必须处理两个问题:宿主语言的类型和通讯操作指定的类型匹配;发送者和接收者的类型匹配。   

如果发送和接收操作使用同一类型名字,那么这个发送和接收操作类型匹配(第二阶段)。即,MPI_INTEGER匹配MPI_INTEGER, MPI_REAL匹配MPI_REAL, 等等。对这个规则, 有一个例外, 将在3.13节中讨论, 类型MPI_PACKED能匹配任何其它类型。   

如果由通讯操作所使用的数据类型名字相应于宿主程序变量的基本类型,那么宿主程序中该变量的类型匹配通讯操作所指定的类型。例如,类型名为MPI_INTEGER的输入匹配Fortran的变量类型INTEGER。在3.2.2节给出Fortran和C的这种对照表。对最后这个规则,有两个例外:类型为名为MPI_BYTE或MPI_PACKED的一个输入能用于匹配任何存储字节(在一个字节地址的机器上), 不论包含这个字节的变量类型是什么。类型MPI_PACKED用于发送己显式打包的数据, 或接收将被显式拆包的数据,看3.13节。类型MPI_BYTE允许我们传送不变的存储中的一个字节的二进制值。   

总之,类型匹配规则分为下面三个部分。   .

类型值(例如, 不同于MPI_BYTE)的通讯必须都匹配, 发送调用中的、发送者程序中的, 接收调用中和接收者程序中相应输入的数据类型匹配。

无类型值的通讯(例如, MPI_BYTE数据类型), 发送者和接收者使用MPI_BYTE类型。在这种情况下,对发送者和接收者程序的相应输入类型无要求,也不要求他们类型一样。   .

关于打包数据的通讯, 使用MPI_PACKED。    

下面的例子解释了前两种情况。

例子3.1 发送者和接收者指定匹配的类型。

CALL MPI_COMM_RANK(comm, rank, ierr)

FORWARD BACKWARD ROOT INDEX HELP HOME

Copyright: NPAC, PACT
Lastmodified: 1996.11.4th