jsuarez/MPIUtils.py (56 lines of code) (raw):

#Author: Joseph Suarez from pdb import set_trace as T import sys, builtins import numpy as np from mpi4py import MPI from mpi4py.MPI import COMM_WORLD as comm MASTER = 0 SILENT = 1 ALL = 2 class LoadBalancer: def __init__(self, cores): self.nCores = len(cores) self.cores = cores self.loads = dict((core, 0) for core in cores) def assignWorker(self): #core = 1 #self.loads[core] += 1 #return np.random.choice(self.cores) #return min([len(e) for e in load.values()]) core = min(self.loads, key=self.loads.get) self.loads[core] += 1 return core def deleteWorker(self, core): self.loads[core] -= 1 def print(verbose, *args): if verbose == ALL or (verbose == MASTER and isMaster()): builtins.print(*args) sys.stdout.flush() def send(data, dst, seq=None, usePar=False): if not usePar: seq.inbox = data return comm.send(data, dst) def recv(src, seq=None, usePar=False): if not usePar: return seq.inbox return comm.recv(source=src) #Returns a req def isend(data, dst, tag): return comm.isend(data, dest=dst, tag=tag) #Returns a req def irecv(src, tag): return comm.irecv(source=src, tag=tag) def gather(dst): return comm.gather(root=dst) def assignWorker(clients): return np.random.choice(clients) def distributeFunc(f): if isMaster(): x = f() else: x = None return distribute(x) def npValMean(val): meanVal = np.zeros_like(val) comm.Allreduce(val, meanVal, op=MPI.SUM) return meanVal / comm.Get_size() def distribute(x): return comm.bcast(x, root=MASTER) def isMaster(): return comm.Get_rank() == MASTER def core(): return comm.Get_rank()