MPI的类型匹配规则
在MPI中,类型匹配有两个方面的意思:(1)宿主语言的类型和通信操作所指定的类型相匹配;(2)发送方和接收方的类型相匹配。
对于类型匹配的第一个方面,比如在FORTRAN77中,声明为INTEGER类型的变量在发送和接收时要使用MPI_INTEGER与之相对应,声明为REAL类型的变量在发送和接收时要使用MPI_REAL与之相对应,前面部分给出的FORTRAN77 与MPI类型的对应关系就是为了满足类型匹配的要求;同样在C语言中,int类型要和MPI_INT相对应,float要和MPI_FlOAT相对应,这些对应关系在前面已经介绍了。
对于类型匹配的第二个方面,要求在发送方和接收方对数据类型的指定必须是一样的,即发送方用MPI_INTEGER,则接收方也必须使用MPI_INTEGER,发送方用MPI_REAL,则接收方也必须用MPI_REAL,对于C语言,虽然有些系统中int和long有相同的表示,但是MPI认为MPI_INT和MPI_LONG是不同的类型,即MPI_INT和MPI_LONG是不匹配的,发送方和接收方必须同时使用MPI_INT或MPI_LONG。
上述类型匹配规则的例外是对于MPI提供的MPI_BYTE和MPI_PACKED,它们可以和任何以字节为单位的存储相匹配,包含这些字节的类型是任意的,MPI_TYPE用于不加修改地传送内存中的二进制值,MPI_PACK用于数据的打包和解包(MPI_UNPACK)。


MPI消息传递过程

MPI的消息传递过程可以分为三个阶段:
(1)消息装配,将发送数据从发送缓冲区中取出,加上消息信封等形成一个完整的消息。
(2)消息传递,将装配好的消息从发送端传递到接收端。
(3)消息拆卸,从接收到的消息中取出数据送入接收缓冲区。
在这三个阶段,都需要类型匹配:(1)在消息装配时,发送缓冲区中变量的类型必须和相应的发送操作指定的类型相匹配;(2)在消息传递时,发送操作指定的类型必须和相应的接收操作指定的类型相互匹配;(3)在消息拆卸时,接收缓冲区中变量的类型必须和接收操作指定的类型相匹配。
归纳起来,类型匹配规则可以概括为:
 
  • 有类型数据的通信,发送方和接收方均使用相同的数据类型。
  • 无类型数据的通信,发送方和接收方均以MPI_BYTE作为数据类型。
  • 打包数据的通信, 发送方和接收方均使用MPI_PACKED。
MPI的数据转换
所谓的数据转换包括两个方面的意思:

  • 数据类型的转换 
    数据类型的转换是指改变一个值的数据类型,比如将实型转换为整型(通过舍入操作)或将整型转换为实型等。
  • 数据表示的转换
    而数据表示的转换是指改变一个值的二进制表示,比如高字节和低字节顺序的改变,将浮点数从32为表示改变为64为表示等。

    MPI是否需要数据类型的转换?
    由于MPI严格要求类型匹配,所以在MPI中不存在数据类型转换的问题。
    MPI是否需要数据表示的转换?
    MPI必须实现数据表示的转换,这是因为MPI的目的之一是对异构环境的支持,在异构系统中,不同的系统其数据的内部表示往往是不同的,因此MPI必须负责实现这些不同表示之间的相互转换。
    在MPI中,没有限定数据表示转换的细节,但总的目标是希望这样的转换保留整型、逻辑以及字符值不变,而把浮点值转为在目标系统上能表示的最接近的值。 MPI数据表示转换可能出现什么问题?
    在浮点转换过程,上溢和下溢可能发生。当一个值能在一个系统中表示而不能在另一个系统中表示时,整型或字符的转换也可导致异常。
    在表示转换过程中,一个异外发生会导致一个通信失败。在发送操作、接收操作或两者也都发生错误。
    如果在一个消息中发送的一个值是无类型的 (例如,MPI_BYTE类型),那么在接收者存储的字节的二进制表示与接收者接收的字节的二进制表示一样。无论发送者和接收者运行在同一环境或不同环境,这都是正确的。不要求表示转换。
    当一个MPI程序在同构系统中运行, 其所有进程运行在同一环境时, 没有转换发生。
  •