分布式数组的一个非常轻量级的实现
项目描述
mumpy
在Python中使N维并行计算变得简单
概述
mumpy是一个非常轻量级的分布式数组实现,它可以在从多核笔记本电脑到大型MPI集群的各种架构上运行。mumpy基于numpy和mpi4py,并支持任意数量的维度。进程可以使用“getData”方法访问远程数据。这可以用来访问邻近的鬼数据,但更为灵活,因为它允许从任何进程访问数据——不一定是一个邻近的进程。mumpy旨在无缝地与numpy的切片操作符ufunc等一起工作,使代码转移到并行计算环境变得容易。
4核心桌面512^3拉普拉斯的加速
如何获取mumpy
git clone https://github.com/pletzer/mumpy.git
如何构建mumpy
mumpy需要
- python 3.5或更高版本
- numpy
- MPI库(例如MPICH2)
- mpi4py,例如3.x
python setup.py install
或者,如果您需要root权限,
sudo python setup.py install
或者,您可以使用
pip install mumpy
或者
pip install mumpy --user
如何测试mumpy
运行tests/目录下的任何文件,例如
cd tests
mpiexec -n 4 python testDistArray.py
如何使用mumpy
要并行运行脚本myScript.py,使用
mpiexec -n numProcs python <myScript.py>
其中numProcs是进程数。
numpy数组的轻量级扩展
将mumpy数组视为具有附加数据成员和访问邻近数据的成员和方法的普通numpy数组。
要创建一个带有幽灵的分布式数组(gda),使用
from mumpy import gdaZeros
da = gdaZeros((4, 5), numpy.float32, numGhosts=1)
上面的例子创建了一个4 x 5的float32数组,用零填充——语法应该对使用numpy数组的任何人来说都很熟悉。
所有numpy操作都适用于mumpy分布式数组,没有任何变化,这包括切片。请注意,切片操作是针对本地数组索引的。
在上文中,numGhosts 描述了晕环区域的厚度,即数组中可以由其他进程访问的数据切片。numGhosts = 1 的值表示晕环深度为一。晕环越厚,通信成本越高,因为需要从进程之间复制更多数据。
对于二维数组,晕环可以分解为四个区域
- da[:numGhosts, :] => 西
- da[-numGhosts:, :] => 东
- da[:, :numGhosts] => 南
- da[:, -numGhosts:] => 北
(在n维空间中,有2n个区域。)NumPy使用一个元组来标识每个晕环区域
- (-1, 0) => 西
- (1, 0) => 东
- (0, -1) => 南
- (0, 1) => 北
要访问远程进程otherRk的南部区域数据,请使用
southData = da.getData(otherRk, winID=(0, -1))
使用常规域分解
上述方法适用于任何域分解,不一定非要是常规的。在全局数组被分割成均匀数据块的情况下,otherRk可以通过局部rank和一个偏移向量推断出来
from mumpy import CubeDecomp
decomp = CubeDecomp(numProcs, dims)
...
otherRk = decomp.getNeighborProc(self, da.getMPIRank(), offset=(0, 1), periodic=(True, False))
其中numProcs是进程数,dims是全局数组的维度,periodic是一个表示域是否周期性的True/False值的元组。在没有相邻rank的情况(因为本地da.getMPIRank() rank位于域边界),getNeighborProc可能返回None。在这种情况下,getData也将返回None。
非常高层次
对于拉普拉斯算子,可以考虑使用
from mumpy import Laplacian
lapl = Laplacian(decomp, periodic=(True, False))
将拉普拉斯算子应用于任何类似NumPy的数组 inp 然后简单地进行
out = lapl.apply(inp)
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。