Example #1
0
 def schedule(self, state):
     state.prepare()
     scheduler = Scheduler()
     scheduler.walk_and_emit(state)
     if not state.profitable():
         return
     state.post_schedule()
Example #2
0
 def test_next_must_not_loop_forever(self):
     scheduler = Scheduler()
     def delay(node, state):
         node.count += 1
         return True
     scheduler.delay = delay
     class State(object): pass
     class Node(object): emitted = False; pack = None; count = 0
     state = State()
     state.worklist = [Node(), Node(), Node(), Node(), Node()]
     assert scheduler.next(state) is None
     for node in state.worklist:
         assert node.count == 1
Example #3
0
 def test_next_must_not_loop_forever(self):
     scheduler = Scheduler()
     def delay(node, state):
         node.count += 1
         return True
     scheduler.delay = delay
     class State(object): pass
     class Node(object): emitted = False; pack = None; count = 0
     state = State()
     state.worklist = [Node(), Node(), Node(), Node(), Node()]
     assert scheduler.next(state) is None
     for node in state.worklist:
         assert node.count == 1
Example #4
0
    def vectorize(self, loop, unroll_factor=-1):
        info = FakeLoopInfo(loop)
        info.snapshot(loop)
        opt, graph = self.vectoroptimizer_unrolled(loop, unroll_factor)
        opt.find_adjacent_memory_refs(graph)
        opt.extend_packset()
        opt.combine_packset()
        costmodel = GenericCostModel(self.cpu, 0)
        state = VecScheduleState(graph, opt.packset, self.cpu, costmodel)
        opt.schedule(state)
        if not costmodel.profitable():
            raise NotAProfitableLoop()
        gso = GuardStrengthenOpt(graph.index_vars)
        gso.propagate_all_forward(info, loop)
        #
        # re-schedule
        graph = DependencyGraph(loop)
        state = SchedulerState(self.cpu, graph)
        state.prepare()
        Scheduler().walk_and_emit(state)
        state.post_schedule()
        #
        oplist = loop.operations

        loop.operations = loop.prefix[:]
        if loop.prefix_label:
            loop.operations += [loop.prefix_label]
        loop.operations += oplist
        return opt
Example #5
0
 def schedule(self, loop, unroll_factor=-1, with_guard_opt=False):
     info = FakeLoopInfo(loop)
     info.snapshot(loop)
     opt, graph = self.vectoroptimizer_unrolled(loop, unroll_factor)
     opt.find_adjacent_memory_refs(graph)
     opt.extend_packset()
     opt.combine_packset()
     costmodel = FakeCostModel(self.cpu)
     state = VecScheduleState(graph, opt.packset, self.cpu, costmodel)
     opt.schedule(state)
     if with_guard_opt:
         gso = GuardStrengthenOpt(graph.index_vars)
         gso.propagate_all_forward(info, loop)
     # re-schedule
     graph = DependencyGraph(loop)
     state = SchedulerState(self.cpu, graph)
     state.prepare()
     Scheduler().walk_and_emit(state)
     state.post_schedule()
     return opt