// Copyright Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #include #include namespace rocRoller { namespace Scheduling { const std::string Cost::Basename = "Cost"; std::string toString(CostFunction proc) { switch(proc) { case CostFunction::None: return "None"; case CostFunction::Uniform: return "Uniform"; case CostFunction::MinNops: return "MinNops"; case CostFunction::WaitCntNop: return "WaitCntNop"; case CostFunction::LinearWeighted: return "LinearWeighted"; case CostFunction::LinearWeightedSimple: return "LinearWeightedSimple"; case CostFunction::LinearWeightedSimpleStreamK: return "LinearWeightedSimpleStreamK"; case CostFunction::Count: return "Count"; } Throw("Invalid Cost Function: ", ShowValue(static_cast(proc))); } std::ostream& operator<<(std::ostream& stream, CostFunction proc) { return stream << toString(proc); } Cost::Result Cost::operator()(std::vector::iterator>& iters) const { Cost::Result retval; auto context = m_ctx.lock(); size_t n = iters.size(); for(size_t i = 0; i < n; ++i) { if(iters[i] != std::default_sentinel_t{}) { auto const& inst = *(iters[i]); auto status = context->peek(inst); float peek = cost(inst, status); std::tuple new_val{i, peek}; retval.insert( std::upper_bound( retval.begin(), retval.end(), new_val, [](std::tuple lhs, std::tuple rhs) -> bool { return (std::get<1>(lhs) < std::get<1>(rhs)) || (std::get<1>(lhs) == std::get<1>(rhs) && std::get<0>(lhs) < std::get<0>(rhs)); }), new_val); } } return retval; } float Cost::operator()(Instruction const& inst) const { auto status = m_ctx.lock()->peek(inst); return cost(inst, status); } float Cost::operator()(Generator::iterator& iter) const { auto const& inst = *iter; return (*this)(inst); } } }