3.3.2 数据转换 BACKWARDFORWARD


MPI的目的之一是支持异构环境的并行编译。在一个异构环境的通信可以要求数据转换。我们使用下面术语。

type conversion ( 类型转换 )改变一个值的数据类型, 例如,通过给一个实型四舍五入成为一个整型。

representation conversion ( 表示转换 )改变一个值的二进制表示, 例如,从十六进制浮点到IEEE浮点。   

类型匹配规则意谓着MPI通信不承担类型转换。另一方面,MPI要求, 当在一个数据类型值使用不同表示的环境中传送有类型值时, 进行一个表示转换。MPI没指定表示转换的规则。希望这样的转换保留整型、逻辑或字符值, 而把浮点值转为在目标系统上能表示的最接近的值。   

在浮点转换过程,上溢和下溢可能发生。当一个值能在一个系统中表示而不能在另一个系统中表示时,整型或字符的转换也可导致异常。在表示转换过程中,一个异外发生会导致一个通信失败。在发送操作、或接收操作或两者也都发生错误。   

如果在一个消息中发送的一个值是无类型的 (例如,MPI_BYTE类型), 那么在接收者存储的字节的二进制表示与接收者载入的字节的二进制表示一样。无论发送者和接收者运行在同一环境或不同环境,这都是正确的。不要求表示转换。( 注意,当转换MPI_CHARACTER类型或MPI_CHAR类型值时, 表示转换可以发生, 例如, 从一个EBCDIC编码到ASCII编码)。   

当一个MPI程序在同构系统中运行, 其所有进程运行在同一环境时, 没有转换发生。   

考虑三个例子,3.1-3.3。假定a和b是实型的尺寸大于10的数组, 第一个程序是正确的。如果发送者和接收者在不同的环境中执行,那么从发送缓存取出的10个实型值, 在存到接收缓存以前被转换为接收者的实型表示。当从发送缓存取出的实型元素的个数等于接收缓存所存的实型元素的个数时,存储的字节数不必等于载入的字节数。例如,发送者可以使用四个字节表示实型数,接收者使用八个子字节表示实型数。   

第二个程序是错误的,它的动作无定义。   

第三个程序是正确的。既使发送者和接收者在不同的环境运行,从发送缓存装入的四十个字节将被存在接收缓存。发送的消息与接收的消息有完全相同的长度( 按字节)和相同的二进制表示。如果a和b是不同的类型, 或他们类型相同但使用不同的数据表示, 那么接收缓存所存的各位可以译码出不同于发送缓存译码值。   

数据表示的转换也应用于一个消息的信封:源,目的和标识需要被转换为整型。   

MPI不要求支持语言间的通信。如果由一个C语言进程发送的消息而由一个Fortran语言的进程接收, 或相反, 那么这个程序的行为无动作定义。   


Copyright: NPACT
BACKWARDFORWARD