我有一个需要加载相同大的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
?
答案 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
获取指向该窗口的指针。