MPI_Recv/MPI_Send overhead
MPI_Recv/MPI_Send overhead
我正在开发一个C++应用程序,其中我使用 MPI C 绑定通过网络发送和接收数据。我明白发送
const int VECTOR_SIZE = 1e6;
std::vector<int> vector(VECTOR_SIZE, 0.0);
通过
// Version A
MPI_Send(const_cast<int *>(vector.data()), vector.size(), MPI_INT, 1, 0, MPI_COMM_WORLD);
比
// Version B
for (const auto &element : vector)
MPI_Send(const_cast<int *>(&element), 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
由于MPI_Send
引入的延迟。但是,如果我想发送内存中不连续的数据结构(例如std::list<int>
),我不能使用版本 A,而必须求助于版本 B 或将列表的内容复制到连续容器(例如std::vector<int>
)并使用版本 A。由于我想避免额外的副本,我想知道 MPI 中是否有任何选项/其他函数可以有效地使用版本 B(或至少是类似的、类似循环的结构),而不会在每次调用MPI_Send
时产生延迟?
通过std::list
元素逐个单步发送确实会导致大量的通信开销。
MPI 规范/库被设计为独立于语言。 这就是为什么它使用与语言无关的 MPI 数据类型。 结果是它只能从连续缓冲区(这是大多数语言提供的功能)发送,而不能从列表等更复杂的数据结构发送。
为了避免逐个发送的通信开销,有两种替代方法:
-
将所有列表元素复制到
std::vector
并发送向量。 但是,这会产生一个内存过度,并使发送完全顺序化(在此期间,某些 MPI 节点可能处于空闲状态)。 -
或者遍历您的列表,构建较小的向量/缓冲区并发送这些较小的块(最终将它们调度到多个目标节点? 此方法的优点是通过流水线效应更好地利用 I/O 延迟和并行性。 但是,您必须进行一些实验才能找到中间块的最佳大小。
相关文章:
- 用MacOS Mojave编译C++:致命错误:mpi.h:没有这样的文件或目录
- MPI突然停止了对多个核心的操作
- 设置 Visual Studio for MPI: 找不到标识符错误
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 如何使用 MPI 的远程内存访问 (RMA) 功能并行化数据聚合?
- 重载 MPI 中的运算符 ()
- MPI:检查是否有任何进程已终止
- 使用 pybind11 共享 MPI 通信器
- 使用 CMake,Microsoft MPI 和 Visual Studio 2017 找不到 mpi.h
- 在具有 MPI 的超立方体中广播
- 通过 mpi 发送 c++ 标准::矢量<bool>
- 使用 MPI 的 C++ 中的并行 for 循环
- 如何将 OpenMP 和 MPI 导入到大型 CLion CMake 项目中?
- 如何通过Boost.MPI发送2d Boost.MultiArray的子阵列?
- HDF5 构建了并行支持,但找不到特定于 mpi 的功能
- MPI 集合通信中的指针分配
- 仅特定内核计数上的 MPI 内存损坏
- 如何在 Mac OS 上安装 boost-mpi 及其对 clang 的依赖关系?
- 从Visual Studio 2017运行MPI应用程序,每个进程在不同的cmd窗口中
- 在 MPI 中共享数组的一部分