Python混合多处理/ MPI在同一节点中具有共享内存

时间:2017-09-12 15:27:16

标签: python multiprocessing mpi4py

我有一个需要加载相同大的Python应用程序 数组(~4 GB)并完成一个完美的并行功能 这个数组的块。数组开始保存到磁盘。

我通常在群集计算机上运行此应用程序 例如,10个节点,每个节点有8个节点 计算核心和总RAM约为32GB。

最简单的方法(不起作用)就是这样做 n = 80 mpi4py。它不起作用的原因是 每个MPI核心将加载4GB地图,这将耗尽 32GB的RAM导致MemoryError

另一种方法是rank=0是唯一加载的进程 4GB阵列,它将阵列的块放到剩下的阵列中 MPI核心 - 但由于网络的原因,这种方法很慢 带宽问题。

最好的方法是每个节点中只加载1个核心 4GB阵列和此阵列可用作共享内存 (通过multiprocessing?),其余7个核心 节点

我怎样才能做到这一点?我怎样才能让MPI知道节点 并使其与multiprocessing

协调

2 个答案:

答案 0 :(得分:1)

multiprocessing模块没有共享内存。

您可以使用内存视图查看joblib方式来共享大型numpy数组。您可以使用manual memory mapping来避免重复数据。

要找到一种只在每个节点上传递一次数据的方法,我会在每个节点启动一个MPI进程,然后使用joblib进行剩余计算,因为它会自动使用memmaping对于大型numpy数组输入。

答案 1 :(得分:0)

MPI-3具有共享存储器功能,可以精确地满足您的各种情况。您可以通过mpi4py使用MPI。 使用MPI_Comm_split_type将您的沟通者分为一组,生活在一个节点上。对节点上的窗口使用MPI_Win_allocate_shared;仅在一级上指定非零大小。使用MPI_Win_shared_query获取指向该窗口的指针。