J'ai un petit code de test qui fonctionne comme une batterie de tâches, le processus maître envoyant des tâches aux esclaves.Obtenir le maître pour travailler dans la batterie de tâches
Je me demandais s'il existait un moyen simple de faire en sorte que le maître prenne sa part du travail de la liste des tâches. Par exemple en utilisant un envoyer et recevoir du maître à lui-même, mais je ne suis pas certain si cela se terminera proprement.
Le code est le suivant:
###!/usr/bin/env python
from mpi4py import MPI
import numpy
import sys
import os
import time
comm=MPI.COMM_WORLD
rank=comm.Get_rank()
size = comm.Get_size()
#print(rank,size)
if rank == 0:
tasks=([StopIteration] * (size-1))+[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
status=MPI.Status()
while tasks:
comm.recv(source=MPI.ANY_SOURCE, status=status)
data=tasks.pop()
print("master sending data ",data," to rank", status.Get_source())
comm.send(obj=data, dest=status.Get_source())
print("master: done send. Data left: ",tasks)
else:
print("slave", rank," entering loop")
for task in iter(lambda: comm.sendrecv(dest=0), StopIteration):
print("slave ", rank," recvd data", task)
print("slave ", rank," going to sleep")
time.sleep((task+0.5)*2*1.4)
Toutes les suggestions claires sont les bienvenus!
Merci
Il sera soit besoin d'un thread séparé dans le maître ou une logique très complexe qui combine calcul avec messagerie non bloquante. La solution la plus simple consiste simplement à démarrer un processus MPI supplémentaire et à demander à l'environnement d'exécution MPI de placer ce processus sur le même hôte que le maître. –