LSST Applications g0da5cf3356+25b44625d0,g17e5ecfddb+50a5ac4092,g1c76d35bf8+585f0f68a2,g295839609d+8ef6456700,g2e2c1a68ba+cc1f6f037e,g38293774b4+62d12e78cb,g3b44f30a73+2891c76795,g48ccf36440+885b902d19,g4b2f1765b6+0c565e8f25,g5320a0a9f6+bd4bf1dc76,g56364267ca+403c24672b,g56b687f8c9+585f0f68a2,g5c4744a4d9+78cd207961,g5ffd174ac0+bd4bf1dc76,g6075d09f38+3075de592a,g667d525e37+cacede5508,g6f3e93b5a3+da81c812ee,g71f27ac40c+cacede5508,g7212e027e3+eb621d73aa,g774830318a+18d2b9fa6c,g7985c39107+62d12e78cb,g79ca90bc5c+fa2cc03294,g881bdbfe6c+cacede5508,g91fc1fa0cf+82a115f028,g961520b1fb+2534687f64,g96f01af41f+f2060f23b6,g9ca82378b8+cacede5508,g9d27549199+78cd207961,gb065e2a02a+ad48cbcda4,gb1df4690d6+585f0f68a2,gb35d6563ee+62d12e78cb,gbc3249ced9+bd4bf1dc76,gbec6a3398f+bd4bf1dc76,gd01420fc67+bd4bf1dc76,gd59336e7c4+c7bb92e648,gf46e8334de+81c9a61069,gfed783d017+bd4bf1dc76,v25.0.1.rc3
LSST Data Management Base Package
Loading...
Searching...
No Matches
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: