我有一些 vector ,我想在 C++ 中使用 MPI 在进程之间传输。我一直在使用 broadcast
一次交换一个 vector 的数据,但它似乎不能随着进程的数量很好地扩展。有人告诉我,这是因为我使用了太多的广播调用,并且随着进程数量的增加,它会导致过多的延迟。因此,建议我将所有数据打包在一个结构中,并一次发送。
我的问题是我的 vector 是 int
和 double
类型(每种类型 2 个 vector ),并且它们的长度在编译时未知(等于进程数)。因此,我无法创建一个 struct
来保存所有数据,然后使用自定义 MPI 结构 (MPI_Type_create_struct) 进行广播,如 here 所述因为它需要在编译时硬编码 c 数组的大小。我知道如何创建 MPI 自定义结构,但我不知道如何将数据打包到结构中以便发送。
那么,综上所述,有没有办法只使用一次广播在进程之间广播 4 个不同类型的 vector (2 个 int 和 2 个 double)?
最佳答案
注:“4.1.2”等数字是指MPI标准v3.0中的章节
这应该可以用 MPI_Type_create_struct
(4.1.2) 并且没有实际的 C- struct
.
使用 MPI_Type_vector
(4.1.2) 创建两种数据类型。一个用于 int
的 vector 和一个 vector double
正如你将从 vector<>::data()
得到的那样.您可以假设 vector<>
以连续的方式存储数据。
可以喂MPI_Type_vector
具有运行时的大小值。
现在使用 MPI_Type_create_struct
将两种 vector 类型中的每一种的两个实例组合成一个数据类型,然后您可以轻松地将其用于通信。
与 MPI_Get_address
(4.1.5) 我们可以在运行时获取变量的 MPI 友好地址。在为虚拟结构构造派生数据类型期间,您可能需要它。 (阅读 MPI 标准中关于为什么不使用 &
的用户建议)
为了更灵活,省略中间 vector 数据类型并直接计算 vector<>::data()
的地址和扩展数组并将其直接输入 MPI_Type_create_struct
.
免责声明:IIRC,我一直在使用这种方法成功地通过单个消息发送多个非连续的连续数据 block (前段时间)。
关于c++ - 如何使用一次广播在 MPI 中传输不同类型的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38575201/