我正在尝试确定发送操作和接收操作的哪些参数必须匹配要传递的消息。
我理解接收操作必须匹配(或包含)消息源,标记和通信器。但是,数据类型是否需要匹配?
E.g。我可以匹配0级的发送:
MPI_Send (send_buffer, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
接受等级1的接收操作:
MPI_Recv (recv_buffer, 4, MPI_BYTE, 0, 0, MPI_COMM_WORLD, status);
特别是发送'count'小于接收计数,我知道它对MPI有效。
感谢。
答案 0 :(得分:7)
简短的回答是肯定的,数据类型必须匹配,但有一些警告。
使用原始MPI数据类型(例如MPI_INT
和MPI_FLOAT
)时,类型必须相同。唯一的例外是MPI_PACKED
,它可以匹配任何其他类型。
使用派生数据类型(a.k.a。用户定义的数据类型)时,事情变得稍微复杂一些。一般的MPI数据类型由两部分组成:类型签名,它定义构成派生数据类型的基本语言数据类型,以及一系列字节位移,它们定义了那些基本元素存在于内存中。两个序列的组合称为数据类型的类型映射。原始MPI数据类型是这种通用数据类型的特殊情况,其在类型签名中具有单个基本数据类型,其位移为0,例如, MPI_INT
具有以下类型映射:{ (int, 0) }
。要匹配发送和接收操作,类型签名两侧必须相同,但替换可能会有所不同。例如。发件人可能会发送一个由MPI_Type_contiguous
个MPI_FLOAT
组成的MPI_Type_indexed
个对象,但是接收者可以将此作为MPI_FLOAT
类型的3 MPI_FLOAT
来获得,其中包含任意位移。发件人还可能提供3个MPI_Send(buf, 3, MPI_FLOAT, ...)
元素的数组,例如MPI_Type_struct
这仍然会产生相同类型的签名。
我应该强调类型签名仅包含基本数据类型。用户定义的数据类型是直接从原始MPI类型还是其他用户定义的数据类型(或其混合)创建的,这是无关紧要的。
示例:发件人定义MPI_INT
由3 MPI_FLOAT
和2 MPI_Type_contiguous
组成。接收者定义MPI_INT
包含3个A
s(我们称之为此类型MPI_Type_contiguous
),另一个MPI_FLOAT
包含2个B
s MPI_Type_struct
}),然后由A
和1 B
组成的int
。这两种数据类型将匹配,因为最终它们都是3 float
s后跟2 {{1}} s。