使用mpi4py库
对如下程序进行修改,满足要求:
1、每个rank为 1+ 的进程在收到消息后将随机休眠 10 到 30秒,并且仅在此空闲后才回答。
2、主进程(rank 0)应该按照其他进程的响应顺序接收答案,如后面的运行结果。
3、提示,可以使用 MPI.ANY_SOURCE函数
from mpi4py import MPI
def main():
"""
主进程(rank 0)向所有其他进程发送问候消息。
每个其他进程接收消息并立即响应。
"""
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()
if rank == 0:
for ri in range(1, size):
message = f'Hello from node {rank}'
comm.send(message, dest=ri, tag=11)
print(f'Rank {rank}: sent "{message}"')
for ri in range(1, size):
message = comm.recv(source=ri, tag=11)
print(f'Rank {rank}: received "{message}"')
else:
message = comm.recv(source=0, tag=11)
print(f'Rank {rank}: received {message}')
answer = f'Response from node {rank}'
comm.send(answer, dest=0, tag=11)
print(f'Rank {rank}: sent "{answer}"')
if __name__ == '__main__':
main()
使修改后的程序运行后出现以下结果,写一下注释
以下是可能的答案。 请注意,响应顺序不同于 1、2、3。
root@atolstikov-w10:/# mpiexec --allow-run-as-root -n 4 python3 mpi_1+.py
Rank 0: sent "Hello from node 0"
Rank 0: sent "Hello from node 0"
Rank 1: received Hello from node 0
Rank 1: I'll sleep for 24
Rank 2: received Hello from node 0
Rank 2: I'll sleep for 25
Rank 0: sent "Hello from node 0"
Rank 3: received Hello from node 0
Rank 3: I'll sleep for 11
Rank 3: sent "Response from node 3"
Rank 0: received "Response from node 3"
Rank 1: sent "Response from node 1"
Rank 0: received "Response from node 1"
Rank 2: sent "Response from node 2"
Rank 0: received "Response from node 2"