python中的展开循环以实现数据并行性,必须在MPI环境中工作

unwind loop in python for data parallelism, has to work in MPI environment

我需要执行一个作用于许多数据点的 for 循环,每个数据点都独立于任何其他数据点。

对于范围内的 x (1,10000000)
some_procedure(x)

我需要通过利用数据并行性使其运行得更快,但我必须使用 MPI。

我正在使用 mpi4py,但对此完全陌生。理论上,在选项 a 和 b 之间哪个应该更快,以及为什么:

一个。在 foo.py:

1
2
3
4
5
6
7
8
9
10
from mpi4py import MPI

sendbuf=[]
root=0
comm = MPI.COMM_WORLD
if comm.rank==0:
    sendbuf= range(0,10000000)

v=comm.scatter(sendbuf,root)
some_procedure(v)

然后执行以下操作:

1
mpiexec -np 10000000 python foo.py

乙。或者
从 mpi4py 导入 MPI
导入系统
client_script = \\'some_procedure.py\\'
comm = MPI.COMM_SELF.Spawn(sys.executable, args=[client_script], maxprocs=10000000)

非常感谢!


我认为您误解了 MPI 的用途。 MPI 是让进程进行通信的消息传递接口。它不需要常规代码并自动将其并行化,也不会执行任何类型的轻量级执行,例如可以在系统上严重过载的线程。正如@High Performance Mark 所说,(直到您真正知道自己在做什么)您的 MPI 进程不应超过您机器上可用的物理内核(无论是您的笔记本电脑还是可用的集群)给你)。

通常您的方向是做一些更像是获取整个数据范围并将其划分为您可用的进程数量的事情。您拥有的进程越多,划分的数据就越多,并且(理论上)您的程序可以执行得越快。

一个例子可能看起来像这样(这将是伪C,因为我不熟悉mpi4py,但你可能会明白我的意思):

1
2
3
4
5
6
7
8
9
10
datasize = 1000000;

MPI_Init(...);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);

mydata_size = data size / size;
mystart = rank * mydata_size;

/* Do something for data[mystart...mydata_size] */

与其尝试为每个元素创建一个进程,不如创建尽可能多的进程并相应地划分数据。