#include #include #include #include #include #include #include namespace migraphx { inline namespace MIGRAPHX_INLINE_NS { void schedule::apply(program& p) const { // Compute accumulated weights std::unordered_map weights; auto last = std::prev(p.end()); fix([&](auto self, auto ins) -> std::size_t { if(weights.count(ins) == 0) { weights[ins] = std::accumulate(ins->inputs().begin(), ins->inputs().end(), model.weight(ins->get_operator()), [&](std::size_t w, instruction_ref i) { return w + self(i); }); } return weights[ins]; })(last); // Topo sort fix([&](auto self, auto ins) { for(auto i : ins->inputs()) p.move_instruction(i, p.begin()); for(auto i : ins->inputs()) self(i); })(last); } } // namespace MIGRAPHX_INLINE_NS } // namespace migraphx