我正在尝试确定发送操作和接收操作的哪些参数必须匹配才能传递消息。
我理解接收操作必须匹配(或包含)消息源、标签和通信器。但是,数据类型必须匹配吗?
例如我可以匹配来自 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);
特别是发送“计数”小于接收计数,我知道这对于 MPI 有效。
谢谢。
最佳答案
简短的回答是肯定的,数据类型必须匹配,但有一些注意事项。
使用原始 MPI 数据类型(例如 MPI_INT
)时和MPI_FLOAT
,类型必须相同。唯一的异常(exception)是 MPI_PACKED
,它可以匹配任何其他类型。
当使用派生数据类型(也称为用户定义数据类型)时,事情会变得稍微复杂一些。通用 MPI 数据类型由两部分组成:类型签名,它定义构成派生数据类型的基本语言数据类型,以及一系列字节置换,它定义在哪里这些基本元素驻留在内存中。两个序列的组合称为数据类型的类型映射。原始 MPI 数据类型是此类通用数据类型的特殊情况,在类型签名中具有位移为 0 的单个基本数据类型,例如MPI_INT
具有以下类型映射:{ (int, 0) }
。为了使发送和接收操作匹配,两侧的类型签名必须相同,但位移可以不同。例如。发件人可能会发送一个 MPI_Type_contiguous
对象由 3 MPI_FLOAT
组成s,但接收者可以将其接收为 MPI_Type_indexed
类型 3 MPI_FLOAT
s 具有任意位移。发送者还可能提供 3 MPI_FLOAT
的数组。元素,例如MPI_Send(buf, 3, MPI_FLOAT, ...)
这仍然会产生相同的类型签名。
我应该强调,类型签名仅包含基本数据类型。用户定义的数据类型是直接从原始 MPI 类型还是其他用户定义的数据类型(或其混合)创建的都无关紧要。
示例:发件人定义 MPI_Type_struct
由 3 MPI_INT
组成s 和 2 MPI_FLOAT
s。接收者定义了MPI_Type_contiguous
由 3 MPI_INT
组成s(我们称此类型为 A
),另一个 MPI_Type_contiguous
共 2 MPI_FLOAT
s (输入 B
),然后输入 MPI_Type_struct
由 1 A
组成和 1 B
。这两个数据类型将匹配,因为最终它们都是 3 int
s 后跟 2 float
s。
关于c - 发送/接收的 MPI 数据类型必须匹配吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51539823/