// Copyright Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #include #include namespace rocRoller { namespace Scheduling { static_assert(Component::Component); PriorityScheduler::PriorityScheduler(ContextPtr ctx, CostFunction cmp) : Scheduler{ctx} { m_cost = Component::Get(cmp, m_ctx); } bool PriorityScheduler::Match(Argument arg) { return std::get<0>(arg) == SchedulerProcedure::Priority; } std::shared_ptr PriorityScheduler::Build(Argument arg) { if(!Match(arg)) return nullptr; return std::make_shared(std::get<2>(arg), std::get<1>(arg)); } std::string PriorityScheduler::name() const { return Name; } bool PriorityScheduler::supportsAddingStreams() const { return true; } Generator PriorityScheduler::operator()(std::vector>& seqs) { std::vector::iterator> iterators; if(seqs.empty()) co_return; size_t numSeqs = 0; int minCostIdx = -1; do { co_yield handleNewNodes(seqs, iterators); numSeqs = seqs.size(); float minCost = std::numeric_limits::max(); minCostIdx = -1; EnumBitset categories; for(size_t idx = 0; idx < numSeqs; idx++) { if(iterators[idx] == seqs[idx].end()) continue; auto const& instr = *iterators[idx]; if(!m_lockstate.isSchedulable(instr, idx)) continue; auto cat = instr.getCategory(); categories.set(cat); float myCost = (*m_cost)(instr); if(myCost < minCost) { minCost = myCost; minCostIdx = idx; } if(minCost == 0) break; } if(minCostIdx >= 0) { co_yield yieldFromStream(iterators[minCostIdx], minCostIdx); } } while(minCostIdx >= 0); } } }