我有一个Python应用程序需要加载同样大的 数组(~4 GB)并在 此数组的块。阵列从保存到磁盘开始。在
我通常在群集计算机上使用 比如说,10个节点,每个节点有8个 计算核心和总内存约32GB。在
最简单的方法(行不通)是
n=80万吨/年。它不起作用的原因是
每个MPI内核将加载4GB映射,这将耗尽
32GB内存导致MemoryError
。在
另一种方法是,rank=0
是唯一加载的进程
4GB阵列,它将阵列的块分块分发给其他阵列
但由于网络的原因,这种方法速度很慢
带宽问题。在
最好的方法是每个节点只加载一个核
4GB阵列和此阵列可用作共享内存
(通过multiprocessing
?)对于每个剩余的7个核心
节点。在
我怎样才能做到这一点?如何让MPI知道节点
并使其与multiprocessing
协调?在
multiprocessing
模块没有共享内存。在您可以看看
joblib
共享大型numy数组的方法,使用内存视图。您可以使用manual memory mapping来避免重复数据。在为了找到一种只在每个节点上传递一次数据的方法,我会先为每个节点启动一个MPI进程,然后使用
joblib
进行剩余的计算,因为它会自动使用memmaping
作为大型numpy数组输入。在MPI-3有一个共享内存设施,正好适合您的场景。你可以通过mpi4py使用MPI。。。。 使用
MPI_Comm_split_type
将通信器拆分为位于节点上的组。对节点上的窗口使用MPI_Win_allocate_shared
;只在一个列组上指定非零大小。使用MPI_Win_shared_query
获取指向该窗口的指针。在相关问题 更多 >
编程相关推荐