def schedule(self, state): state.prepare() scheduler = Scheduler() scheduler.walk_and_emit(state) if not state.profitable(): return state.post_schedule()
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
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
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