如何从所有其他进程发送消息到进程零?

时间:2018-04-14 18:43:23

标签: python mpi4py

如何从所有其他进程发送消息到进程零?

我正在使用mpi4py,使用Python 2,并且遵循此示例Parallel programming Research

为什么这行失败了,修复了什么?

searchResult = comm.recv(source=tempRank)

我的代码(似乎)工作正常,直到它到达上面一行。我把print语句放在这一行的上方和下方,所以我很确定这是问题所在。

我的期望是......处理器零将从每个处理器接收消息,但事实并非如此。该程序似乎只是挂起而什么都不做。这是程序。

import time
from random import randint
from random import shuffle
from mpi4py import MPI
import sys

comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = MPI.COMM_WORLD.Get_size()
name = MPI.Get_processor_name()

if rank == 0:
    starttime=time.time()
    searchResult=False
    someNumber = 0    
    data = list(range(1,8))
    chunks = [ [] for _ in range(size) ]
    for i,chunk in enumerate(data):
        chunks[i % size].append(chunk)
else:
    data=None
    chunks=None
    someNumber=None

# scatter data to all processors
data=comm.scatter(chunks,root=0)
# give another variable to each processor
someNumber = comm.bcast(someNumber,root=0)  

print('im rank=',rank,', my data=', data, ' searching for someNumber = ',someNumber)

searchResult=False
for num in data:
    if someNumber == num:
        print('found the someNumber')
        searchResult=True
        break
if searchResult == False:
    print('someNumber not found')
    searchResult=False

# Now, at this point, I want all processors (including processor 0)
# to send processor 0 a message

tempRank=rank

# attempting to send process 0 a message from all other processes
# (does/can processor 0 send itself a message?)
if rank == 0:
    print('this line prints one time, and program hangs')
    searchResult = comm.recv(source=tempRank)
    print('this line never prints, so whats wrong with previous line?')

else:
    comm.send(searchResult,dest=0)

if rank == 0:
    if searchResult == True:
        print('found the someNumber, everyone stop searching .. how to make all processes stop?')
        print('elapsedtime = {}'.format(time.time()-starttime))

    else:
        print('no one found the someNumber')
        print('elapsedtime = {}'.format(time.time()-starttime))

0 个答案:

没有答案