Example #1
0
    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)