在 MPI 中安全地发送任何类型的 C 结构
Sending C struct of any type safely in MPI
考虑到异构处理器,我如何在 MPI 中安全地发送任何(未知)类型和内容的 C 结构。我知道可以使用 MPI_BYTE
和 MPI_Send
作为数据类型,但是如何确保异构系统中接收方数据表示的一致性和正确性。
你不能。 MPI 不会自动知道特定编译器如何表示二进制数据结构,因此它大量使用其内置的扩展数据类型系统,该系统用于明确告诉库在内存中的何处查找数据以及如何解释数据。
在两个不同的可执行文件的实例之间发送 C 结构,其中包括例如不同平台(异构计算)的不同可执行文件或由不同编译器或同一编译器生成但具有不同对齐选项的不同可执行文件(不知道为什么有人会这样做,但无论如何都是可能的),您必须构造一个 MPI 数据类型使用 MPI_Type_create_struct
描述结构。另一种选择是在发送方使用 MPI_Pack
打包相关结构字段,然后在接收方使用 MPI_Unpack
将它们解包。在这两种情况下,支持异构环境的 MPI 实现将负责将数据转换为某种中间格式(XDR 通常是选择的格式)。
使用 MPI_BYTE
在具有不同字节序甚至不同类型对齐的机器之间发送原始二进制数据根本不是一种选择。
考虑到异构处理器,我如何在 MPI 中安全地发送任何(未知)类型和内容的 C 结构。我知道可以使用 MPI_BYTE
和 MPI_Send
作为数据类型,但是如何确保异构系统中接收方数据表示的一致性和正确性。
你不能。 MPI 不会自动知道特定编译器如何表示二进制数据结构,因此它大量使用其内置的扩展数据类型系统,该系统用于明确告诉库在内存中的何处查找数据以及如何解释数据。
在两个不同的可执行文件的实例之间发送 C 结构,其中包括例如不同平台(异构计算)的不同可执行文件或由不同编译器或同一编译器生成但具有不同对齐选项的不同可执行文件(不知道为什么有人会这样做,但无论如何都是可能的),您必须构造一个 MPI 数据类型使用 MPI_Type_create_struct
描述结构。另一种选择是在发送方使用 MPI_Pack
打包相关结构字段,然后在接收方使用 MPI_Unpack
将它们解包。在这两种情况下,支持异构环境的 MPI 实现将负责将数据转换为某种中间格式(XDR 通常是选择的格式)。
使用 MPI_BYTE
在具有不同字节序甚至不同类型对齐的机器之间发送原始二进制数据根本不是一种选择。