我有一个Python应用程序需要加载同样大的 数组(~4 GB)并执行完美的并行函数 该数组的 block 。数组开始保存到磁盘。
我通常在集群计算机上运行此应用程序 比如说 10 个节点,每个节点有 8 个 计算核心和约 32GB 的总 RAM。
最简单的方法(不起作用)是
n=80 mpi4py。它不起作用的原因是
每个 MPI 核心都会加载 4GB 映射,这会耗尽
32GB RAM 导致 MemoryError
。
另一种选择是 rank=0
是唯一加载的进程
4GB 阵列,并将阵列的 block 分给其余的
MPI 核心——但由于网络原因,这种方法很慢
带宽问题。
最好的方法是每个节点仅加载 1 个核心
4GB 阵列并且该阵列可用作共享内存
(通过多处理
?)每个处理器上剩余的 7 个核心
节点。
我怎样才能实现这个目标?我怎样才能让 MPI 知道节点
并使其与多处理
协调?
最佳答案
MPI-3 具有适合您的场景的共享内存设施。并且您可以通过 mpi4py 使用 MPI....
使用MPI_Comm_split_type
将通信器分成位于节点上的组。对节点上的窗口使用MPI_Win_allocate_shared
;仅在一个等级上指定非零大小。使用MPI_Win_shared_query
获取指向该窗口的指针。
关于Python 混合多处理/MPI 在同一节点中具有共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46180292/