2016-11-09 2 views
1

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

+1

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. –

Répondre