使用 mpi4py 在计算集群上并行化 'for' 循环
Using mpi4py to parallelize a 'for' loop on a compute cluster
我以前没有使用过分布式计算,但我正在尝试将 mpi4py 集成到程序中以便在计算集群上并行化 for 循环。
这是我想做的伪代码:
for file in directory:
Initialize a class
Run class methods
Conglomerate results
我查看了所有堆栈溢出问题,但找不到任何解决方案。有什么方法可以简单地使用 mpi4py 来完成此操作,或者是否有其他工具可以通过简单的安装和设置来完成此操作?
为了使用 MPI4Py 实现 for 循环的并行性,请查看下面的代码示例。
它只是一个用于添加一些数字的 for 循环。 for 循环将在每个节点中执行。每个节点都将获得不同的数据块来处理(for 循环中的范围)。
最后排名为零的节点将添加所有节点的结果。
#!/usr/bin/python
import numpy
from mpi4py import MPI
import time
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()
a = 1
b = 1000000
perrank = b//size
summ = numpy.zeros(1)
comm.Barrier()
start_time = time.time()
temp = 0
for i in range(a + rank*perrank, a + (rank+1)*perrank):
temp = temp + i
summ[0] = temp
if rank == 0:
total = numpy.zeros(1)
else:
total = None
comm.Barrier()
#collect the partial results and add to the total sum
comm.Reduce(summ, total, op=MPI.SUM, root=0)
stop_time = time.time()
if rank == 0:
#add the rest numbers to 1 000 000
for i in range(a + (size)*perrank, b+1):
total[0] = total[0] + i
print ("The sum of numbers from 1 to 1 000 000: ", int(total[0]))
print ("time spent with ", size, " threads in milliseconds")
print ("-----", int((time.time()-start_time)*1000), "-----")
为了执行上面的代码,你应该运行像这样:
$ qsub -q qexp -l select=4:ncpus=16:mpiprocs=16:ompthreads=1 -I # Salomon: ncpus=24:mpiprocs=24
$ ml Python
$ ml OpenMPI
$ mpiexec -bycore -bind-to-core python hello_world.py
在这个例子中,我们运行在4个节点上启用了MPI4Py代码,每个节点16个核心(总共64个进程),每个python进程绑定到不同的核心。
可能对您有帮助的资源:
https://github.com/JordiCorbilla/mpi4py-examples/tree/master/src/examples/matrix%20multiplication
我以前没有使用过分布式计算,但我正在尝试将 mpi4py 集成到程序中以便在计算集群上并行化 for 循环。
这是我想做的伪代码:
for file in directory:
Initialize a class
Run class methods
Conglomerate results
我查看了所有堆栈溢出问题,但找不到任何解决方案。有什么方法可以简单地使用 mpi4py 来完成此操作,或者是否有其他工具可以通过简单的安装和设置来完成此操作?
为了使用 MPI4Py 实现 for 循环的并行性,请查看下面的代码示例。 它只是一个用于添加一些数字的 for 循环。 for 循环将在每个节点中执行。每个节点都将获得不同的数据块来处理(for 循环中的范围)。 最后排名为零的节点将添加所有节点的结果。
#!/usr/bin/python
import numpy
from mpi4py import MPI
import time
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()
a = 1
b = 1000000
perrank = b//size
summ = numpy.zeros(1)
comm.Barrier()
start_time = time.time()
temp = 0
for i in range(a + rank*perrank, a + (rank+1)*perrank):
temp = temp + i
summ[0] = temp
if rank == 0:
total = numpy.zeros(1)
else:
total = None
comm.Barrier()
#collect the partial results and add to the total sum
comm.Reduce(summ, total, op=MPI.SUM, root=0)
stop_time = time.time()
if rank == 0:
#add the rest numbers to 1 000 000
for i in range(a + (size)*perrank, b+1):
total[0] = total[0] + i
print ("The sum of numbers from 1 to 1 000 000: ", int(total[0]))
print ("time spent with ", size, " threads in milliseconds")
print ("-----", int((time.time()-start_time)*1000), "-----")
为了执行上面的代码,你应该运行像这样:
$ qsub -q qexp -l select=4:ncpus=16:mpiprocs=16:ompthreads=1 -I # Salomon: ncpus=24:mpiprocs=24
$ ml Python
$ ml OpenMPI
$ mpiexec -bycore -bind-to-core python hello_world.py
在这个例子中,我们运行在4个节点上启用了MPI4Py代码,每个节点16个核心(总共64个进程),每个python进程绑定到不同的核心。
可能对您有帮助的资源:
https://github.com/JordiCorbilla/mpi4py-examples/tree/master/src/examples/matrix%20multiplication