LSST Applications  21.0.0-147-g0e635eb1+1acddb5be5,22.0.0+052faf71bd,22.0.0+1ea9a8b2b2,22.0.0+6312710a6c,22.0.0+729191ecac,22.0.0+7589c3a021,22.0.0+9f079a9461,22.0.1-1-g7d6de66+b8044ec9de,22.0.1-1-g87000a6+536b1ee016,22.0.1-1-g8e32f31+6312710a6c,22.0.1-10-gd060f87+016f7cdc03,22.0.1-12-g9c3108e+df145f6f68,22.0.1-16-g314fa6d+c825727ab8,22.0.1-19-g93a5c75+d23f2fb6d8,22.0.1-19-gb93eaa13+aab3ef7709,22.0.1-2-g8ef0a89+b8044ec9de,22.0.1-2-g92698f7+9f079a9461,22.0.1-2-ga9b0f51+052faf71bd,22.0.1-2-gac51dbf+052faf71bd,22.0.1-2-gb66926d+6312710a6c,22.0.1-2-gcb770ba+09e3807989,22.0.1-20-g32debb5+b8044ec9de,22.0.1-23-gc2439a9a+fb0756638e,22.0.1-3-g496fd5d+09117f784f,22.0.1-3-g59f966b+1e6ba2c031,22.0.1-3-g849a1b8+f8b568069f,22.0.1-3-gaaec9c0+c5c846a8b1,22.0.1-32-g5ddfab5d3+60ce4897b0,22.0.1-4-g037fbe1+64e601228d,22.0.1-4-g8623105+b8044ec9de,22.0.1-5-g096abc9+d18c45d440,22.0.1-5-g15c806e+57f5c03693,22.0.1-7-gba73697+57f5c03693,master-g6e05de7fdc+c1283a92b8,master-g72cdda8301+729191ecac,w.2021.39
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: