1

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

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

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

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

一个。在 foo.py 中:

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)

然后执行以下操作:

mpiexec -np 10000000 python foo.py

湾。或从 mpi4py import MPI
import sys client_script = 'some_procedure.py' comm = MPI.COMM_SELF.Spawn(sys.executable, args=[client_script], maxprocs=10000000)

非常感谢提前!!

4

1 回答 1

1

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

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

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

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] */

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

于 2013-07-16T17:27:37.067 回答