LSST Applications  21.0.0-172-gfb10e10a+18fedfabac,22.0.0+297cba6710,22.0.0+80564b0ff1,22.0.0+8d77f4f51a,22.0.0+a28f4c53b1,22.0.0+dcf3732eb2,22.0.1-1-g7d6de66+2a20fdde0d,22.0.1-1-g8e32f31+297cba6710,22.0.1-1-geca5380+7fa3b7d9b6,22.0.1-12-g44dc1dc+2a20fdde0d,22.0.1-15-g6a90155+515f58c32b,22.0.1-16-g9282f48+790f5f2caa,22.0.1-2-g92698f7+dcf3732eb2,22.0.1-2-ga9b0f51+7fa3b7d9b6,22.0.1-2-gd1925c9+bf4f0e694f,22.0.1-24-g1ad7a390+a9625a72a8,22.0.1-25-g5bf6245+3ad8ecd50b,22.0.1-25-gb120d7b+8b5510f75f,22.0.1-27-g97737f7+2a20fdde0d,22.0.1-32-gf62ce7b1+aa4237961e,22.0.1-4-g0b3f228+2a20fdde0d,22.0.1-4-g243d05b+871c1b8305,22.0.1-4-g3a563be+32dcf1063f,22.0.1-4-g44f2e3d+9e4ab0f4fa,22.0.1-42-gca6935d93+ba5e5ca3eb,22.0.1-5-g15c806e+85460ae5f3,22.0.1-5-g58711c4+611d128589,22.0.1-5-g75bb458+99c117b92f,22.0.1-6-g1c63a23+7fa3b7d9b6,22.0.1-6-g50866e6+84ff5a128b,22.0.1-6-g8d3140d+720564cf76,22.0.1-6-gd805d02+cc5644f571,22.0.1-8-ge5750ce+85460ae5f3,master-g6e05de7fdc+babf819c66,master-g99da0e417a+8d77f4f51a,w.2021.48
LSST Data Management Base Package
Public Member Functions | List of all members
lsst.ctrl.pool.pool.Comm Class Reference
Inheritance diagram for lsst.ctrl.pool.pool.Comm:

Public Member Functions

def __new__ (cls, comm=mpi.COMM_WORLD, recvSleep=0.1, barrierSleep=0.1)
 Construct an MPI.Comm wrapper. More...
 
def recv (self, obj=None, source=0, tag=0, status=None)
 
def send (self, obj=None, *args, **kwargs)
 
def Barrier (self, tag=0)
 
def broadcast (self, value, root=0)
 
def scatter (self, dataList, root=0, tag=0)
 
def Free (self)
 

Detailed Description

Wrapper to mpi4py's MPI.Intracomm class to avoid busy-waiting.

As suggested by Lisandro Dalcin at:
* http://code.google.com/p/mpi4py/issues/detail?id=4 and
* https://groups.google.com/forum/?fromgroups=#!topic/mpi4py/nArVuMXyyZI

Definition at line 243 of file pool.py.

Member Function Documentation

◆ __new__()

def lsst.ctrl.pool.pool.Comm.__new__ (   cls,
  comm = mpi.COMM_WORLD,
  recvSleep = 0.1,
  barrierSleep = 0.1 
)

Construct an MPI.Comm wrapper.

    @param cls             Class
    @param comm            MPI.Intracomm to wrap a duplicate of
    @param recvSleep       Sleep time (seconds) for recv()
    @param barrierSleep    Sleep time (seconds) for Barrier()

Definition at line 251 of file pool.py.

251  def __new__(cls, comm=mpi.COMM_WORLD, recvSleep=0.1, barrierSleep=0.1):
252  """!Construct an MPI.Comm wrapper
253 
254  @param cls Class
255  @param comm MPI.Intracomm to wrap a duplicate of
256  @param recvSleep Sleep time (seconds) for recv()
257  @param barrierSleep Sleep time (seconds) for Barrier()
258  """
259  self = super(Comm, cls).__new__(cls, comm.Dup())
260  self._barrierComm = None # Duplicate communicator used for Barrier point-to-point checking
261  self._recvSleep = recvSleep
262  self._barrierSleep = barrierSleep
263  return self
264 

◆ Barrier()

def lsst.ctrl.pool.pool.Comm.Barrier (   self,
  tag = 0 
)
Version of comm.Barrier() that doesn't busy-wait

A duplicate communicator is used so as not to interfere with the user's own communications.

Definition at line 281 of file pool.py.

281  def Barrier(self, tag=0):
282  """Version of comm.Barrier() that doesn't busy-wait
283 
284  A duplicate communicator is used so as not to interfere with the user's own communications.
285  """
286  self._checkBarrierComm()
287  size = self._barrierComm.Get_size()
288  if size == 1:
289  return
290  rank = self._barrierComm.Get_rank()
291  mask = 1
292  while mask < size:
293  dst = (rank + mask) % size
294  src = (rank - mask + size) % size
295  req = self._barrierComm.isend(None, dst, tag)
296  while not self._barrierComm.Iprobe(src, tag):
297  time.sleep(self._barrierSleep)
298  self._barrierComm.recv(None, src, tag)
299  req.Wait()
300  mask <<= 1
301 

◆ broadcast()

def lsst.ctrl.pool.pool.Comm.broadcast (   self,
  value,
  root = 0 
)

Definition at line 302 of file pool.py.

302  def broadcast(self, value, root=0):
303  with PickleHolder(value):
304  return super(Comm, self).bcast(value, root=root)
305 

◆ Free()

def lsst.ctrl.pool.pool.Comm.Free (   self)

Definition at line 330 of file pool.py.

330  def Free(self):
331  if self._barrierComm is not None:
332  self._barrierComm.Free()
333  super(Comm, self).Free()
334 
335 

◆ recv()

def lsst.ctrl.pool.pool.Comm.recv (   self,
  obj = None,
  source = 0,
  tag = 0,
  status = None 
)
Version of comm.recv() that doesn't busy-wait

Definition at line 265 of file pool.py.

265  def recv(self, obj=None, source=0, tag=0, status=None):
266  """Version of comm.recv() that doesn't busy-wait"""
267  sts = mpi.Status()
268  while not self.Iprobe(source=source, tag=tag, status=sts):
269  time.sleep(self._recvSleep)
270  return super(Comm, self).recv(buf=obj, source=sts.source, tag=sts.tag, status=status)
271 

◆ scatter()

def lsst.ctrl.pool.pool.Comm.scatter (   self,
  dataList,
  root = 0,
  tag = 0 
)
Scatter data across the nodes

The default version apparently pickles the entire 'dataList',
which can cause errors if the pickle size grows over 2^31 bytes
due to fundamental problems with pickle in python 2. Instead,
we send the data to each slave node in turn; this reduces the
pickle size.

@param dataList  List of data to distribute; one per node
    (including root)
@param root  Index of root node
@param tag  Message tag (integer)
@return  Data for this node

Definition at line 306 of file pool.py.

306  def scatter(self, dataList, root=0, tag=0):
307  """Scatter data across the nodes
308 
309  The default version apparently pickles the entire 'dataList',
310  which can cause errors if the pickle size grows over 2^31 bytes
311  due to fundamental problems with pickle in python 2. Instead,
312  we send the data to each slave node in turn; this reduces the
313  pickle size.
314 
315  @param dataList List of data to distribute; one per node
316  (including root)
317  @param root Index of root node
318  @param tag Message tag (integer)
319  @return Data for this node
320  """
321  if self.Get_rank() == root:
322  for rank, data in enumerate(dataList):
323  if rank == root:
324  continue
325  self.send(data, rank, tag=tag)
326  return dataList[root]
327  else:
328  return self.recv(source=root, tag=tag)
329 

◆ send()

def lsst.ctrl.pool.pool.Comm.send (   self,
  obj = None,
args,
**  kwargs 
)

Definition at line 272 of file pool.py.

272  def send(self, obj=None, *args, **kwargs):
273  with PickleHolder(obj):
274  return super(Comm, self).send(obj, *args, **kwargs)
275 

The documentation for this class was generated from the following file: