我尝试编写主/从程序,其中根 comp 将数据发送到包括自身在内的 3 个 comps,并在从该 comps 接收计算数据之后。它发送但无法接收数据。
if rank==0:
for i in range(minf.astype(int), ped.max_frame.astype(int), step):
# remove code which is not significant
while True:
# remove code which is not significant
pop = pool
# remove code which is not significant
logger.info('broadcasting gen%s:' % current_gen)
n_to_send = len(pop)//3
req = comm.irecv(source=0)
for i in range(2):
out = []
j =0
while j < n_to_send and pop:
out.append(pop.pop(0))
j+=1
logger.info('out%s: %s' % (i, len(out)))
comm.send(out, dest=i)
logger.info('out%s: %s' % (2, len(pop)))
comm.send(pop, dest=2)
part = req.wait()
obj(part)
logger.info("len part1: ", len(part))
# comm.Barrier()
#req1 = comm.irecv(source=MPI.ANY_SOURCE, tag=MPI.ANY_TAG)
#part1 = req1.wait()
part1 = comm.recv(source=MPI.ANY_SOURCE, tag=MPI.ANY_TAG)
logger.info("len part2: ", len(part1))
# req2 = comm.irecv(source=MPI.ANY_SOURCE, tag=MPI.ANY_TAG)
# part2 = req2.wait()
part2 = comm.recv(source=MPI.ANY_SOURCE, tag=MPI.ANY_TAG)
logger.info("len part3: ", len(part2))
# MPI.Request.Waitall([req1, req2])
pop = part + part1 + part2
# logger.info('population len%s: %s' % (len(pop), '\n'.join(pop)))
logger.info('population len %s: ' % len(pop))
message = '{0}'.format([ind.objectives for ind in pop])
logger.info(message)
else:
part = comm.recv(source=0)
obj(part)
comm.send(part, dest=0, tag=rank+1)
# req = comm.isend(part, dest=0, tag=666)
# req.wait()
我尝试在非根组合中使用 isend。我不知道为什么 root 没有收到消息。