我正在尝试在slurm集群上运行以下代码。逻辑很简单:主节点将列表项发送到从节点进行打印。它最终使用tag = 1的消息告诉从服务器终止循环。
$record['data']
我在本地计算机上获得此输出,这是预期的:
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
status = MPI.Status()
if rank == 0:
data = ['string1', 'string2', 'string3']
for k in data:
comm.send(k, dest=1, tag=11)
comm.send('', dest=1, tag=1)
elif rank == 1:
while True:
print('trying to get something')
item = comm.recv(source=0,status=status)
if status.tag == 1:
print('terminating')
break
print(item)
但是在集群上,它向我显示了以下输出,似乎奴隶在第一个comm.recv期间被无限期地阻塞。
trying to get something
string1
trying to get something
string2
trying to get something
string3
trying to get something
terminating
我很欣赏有关终止奴隶或解决上述问题的逻辑缺陷的任何想法。
答案 0 :(得分:-1)
我能看到的唯一原因是recv的标签与任何标签都不匹配,然后recv不返回。但我认为默认标签确实是MPI.ANY_TAG,也许不是。 尝试在recv中添加:tag = MPI.ANY_TAG 如果它不起作用,请尝试不带标记的代码。然后尝试修复标签版本。
但是你可能对结果感到惊讶......可能是recv采取的第一个消息是tag = 1的消息,因此打破了。它根本不是一个安全的代码。
如果你想这样做:从给定的发件人那里获取任意数量的邮件,最好使用非阻塞通信。