Python MPI 正在等待一个正在通信的进程
Python MPI waiting for a process with communication
我最近开始使用 MPI4PY 将我的项目从 SCOOP 迁移到 MPI。
我使用 SCOOP 基本上将 for 循环与定义并行化。我希望主进程等待其他进程完成(最后我想做一些不同的事情,但为了测试就足够了)。
为了实现这一点,我想我会在每个进程完成后发送一个 "message" 像 "ASD" frm,并在主进程中收集它,并且只继续接收所有进程。
但是由于某些原因我收不到这些消息。
我想做的是:
from mpi4py import MPI
import time
def func(arg, rank):
startTime = time.time()
for i in arg:
print("Process %d: Took %f seconds for %s" % (rank, time.time() - startTime, i))
comm.send("ASDASDASDAS", dest=0, tag=11)
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()
my_lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
if rank != 0:
chunk_size = (len(my_lst) // size) + 1 # number of files this process will handle
chunk = [x for x in range(rank * chunk_size, (rank + 1) * chunk_size)] # Fix this line to
func([my_lst[x] for x in chunk if x < len(my_lst)], rank)
elif rank == 0:
for i in range(1,rank):
a = comm.recv(source=i, tag=11)
print(a)
print("Parallel done")
我试图简化我的问题,所以如果我从教程代码开始:
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
if rank == 0:
data = {'a': 7, 'b': 3.14}
comm.send(data, dest=1, tag=11)
elif rank == 1:
data = comm.recv(source=0, tag=11)
print(data)
它工作得很好。但是,如果我尝试从多个进程发送到进程 0,我看不到任何输出。
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
if rank != 0:
data = {'a': 7, 'b': 3.14}
comm.send(data, dest=0, tag=11)
else:
for i in range(1, rank):
data = comm.recv(source=i, tag=11)
print(data)
为什么会这样?另外,如果这个 "wait for a process to reach a certain point" 事情可以用其他东西更容易地完成,请告诉我!谢谢!
rank 0
由于范围不正确,未收到任何任务。
尝试替换
for i in range(1, rank):
与
size = comm.Get_size()
for i in range(1, size):
我最近开始使用 MPI4PY 将我的项目从 SCOOP 迁移到 MPI。
我使用 SCOOP 基本上将 for 循环与定义并行化。我希望主进程等待其他进程完成(最后我想做一些不同的事情,但为了测试就足够了)。
为了实现这一点,我想我会在每个进程完成后发送一个 "message" 像 "ASD" frm,并在主进程中收集它,并且只继续接收所有进程。
但是由于某些原因我收不到这些消息。
我想做的是:
from mpi4py import MPI
import time
def func(arg, rank):
startTime = time.time()
for i in arg:
print("Process %d: Took %f seconds for %s" % (rank, time.time() - startTime, i))
comm.send("ASDASDASDAS", dest=0, tag=11)
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()
my_lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
if rank != 0:
chunk_size = (len(my_lst) // size) + 1 # number of files this process will handle
chunk = [x for x in range(rank * chunk_size, (rank + 1) * chunk_size)] # Fix this line to
func([my_lst[x] for x in chunk if x < len(my_lst)], rank)
elif rank == 0:
for i in range(1,rank):
a = comm.recv(source=i, tag=11)
print(a)
print("Parallel done")
我试图简化我的问题,所以如果我从教程代码开始:
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
if rank == 0:
data = {'a': 7, 'b': 3.14}
comm.send(data, dest=1, tag=11)
elif rank == 1:
data = comm.recv(source=0, tag=11)
print(data)
它工作得很好。但是,如果我尝试从多个进程发送到进程 0,我看不到任何输出。
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
if rank != 0:
data = {'a': 7, 'b': 3.14}
comm.send(data, dest=0, tag=11)
else:
for i in range(1, rank):
data = comm.recv(source=i, tag=11)
print(data)
为什么会这样?另外,如果这个 "wait for a process to reach a certain point" 事情可以用其他东西更容易地完成,请告诉我!谢谢!
rank 0
由于范围不正确,未收到任何任务。
尝试替换
for i in range(1, rank):
与
size = comm.Get_size()
for i in range(1, size):