def __init__(self, name="Circle", split="equal", k=2, dbname=None, resume=False): random.seed() # use system time to seed self.comm = MPI.COMM_WORLD self.comm.Set_name(name) self.size = self.comm.Get_size() self.rank = self.comm.Get_rank() self.host = MPI.Get_processor_name() self.pid = os.getpid() self.d = {"rank": "rank %s" % self.rank} self.logger = getLogger(__name__) self.split = split self.dbname = dbname self.resume = resume self.reduce_time_interval = G.reduce_interval self.task = None self.abort = False self.requestors = [] # counters self.work_requested = 0 self.work_processed = 0 self.work_request_received = 0 self.workreq_outstanding = False self.workreq_rank = None # reduction self.reduce_enabled = False self.reduce_time_last = MPI.Wtime() self.reduce_outstanding = False self.reduce_replies = 0 self.reduce_buf = {} self.reduce_status = None # periodic report self.report_enabled = False self.report_interval = 60 self.report_last = MPI.Wtime() self.report_processed = 0 # barriers self.barrier_started = False self.barrier_up = False # flag to indicate barrier sent to parent self.barrier_replies = 0 self.workdir = os.getcwd() if not G.tempdir: G.tempdir = os.path.join(os.getcwd(), (".pcircle" + utils.timestamp())) G.tempdir = self.comm.bcast(G.tempdir) if not os.path.exists(G.tempdir): try: os.mkdir(G.tempdir) except OSError: pass # token self.token = Token(self) # tree init self.k = k self.parent_rank = MPI.PROC_NULL self.child_ranks = [] # [MPI.PROC_NULL] * k is too much C self.children = 0 # compute rank of parent if we have one if self.rank > 0: self.parent_rank = (self.rank - 1) // k # identify ranks of what would be leftmost and rightmost children left = self.rank * k + 1 right = self.rank * k + k # if we have at least one child # compute number of children and list of child ranks if left < self.size: # adjust right child in case we don't have a full set of k if right >= self.size: right = self.size - 1 # compute number of children and the list self.children = right - left + 1 for i in range(self.children): self.child_ranks.append(left + i) self.logger.debug("parent: %s, children: %s" % (self.parent_rank, self.child_ranks), extra=self.d) # workq init # TODO: compare list vs. deque # 3 possible workq: workq, workq_buf(locates in memory, used when pushing to or retrieving from database ) self.workq = deque() # workq buffer self.workq_buf = deque() # flag that indicates database is used for workq self.use_store = False if G.resume: self.workq_init(self.dbname, G.resume) self.logger.debug("Circle initialized", extra=self.d)