[llvm] [AMDGPU][MISCHED] GCNBalancedSchedStrategy. (PR #66634)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 19 10:13:40 PDT 2023
================
@@ -981,193 +978,52 @@ void GCNSchedStage::checkScheduling() {
}
}
-unsigned
-GCNSchedStage::computeSUnitReadyCycle(const SUnit &SU, unsigned CurrCycle,
- DenseMap<unsigned, unsigned> &ReadyCycles,
- const TargetSchedModel &SM) {
- unsigned ReadyCycle = CurrCycle;
- for (auto &D : SU.Preds) {
- if (D.isAssignedRegDep()) {
- MachineInstr *DefMI = D.getSUnit()->getInstr();
- unsigned Latency = SM.computeInstrLatency(DefMI);
- unsigned DefReady = ReadyCycles[DAG.getSUnit(DefMI)->NodeNum];
- ReadyCycle = std::max(ReadyCycle, DefReady + Latency);
- }
- }
- ReadyCycles[SU.NodeNum] = ReadyCycle;
- return ReadyCycle;
-}
-
-#ifndef NDEBUG
-struct EarlierIssuingCycle {
- bool operator()(std::pair<MachineInstr *, unsigned> A,
- std::pair<MachineInstr *, unsigned> B) const {
- return A.second < B.second;
- }
-};
-
-static void printScheduleModel(std::set<std::pair<MachineInstr *, unsigned>,
- EarlierIssuingCycle> &ReadyCycles) {
- if (ReadyCycles.empty())
- return;
- unsigned BBNum = ReadyCycles.begin()->first->getParent()->getNumber();
- dbgs() << "\n################## Schedule time ReadyCycles for MBB : " << BBNum
- << " ##################\n# Cycle #\t\t\tInstruction "
- " "
- " \n";
- unsigned IPrev = 1;
- for (auto &I : ReadyCycles) {
- if (I.second > IPrev + 1)
- dbgs() << "****************************** BUBBLE OF " << I.second - IPrev
- << " CYCLES DETECTED ******************************\n\n";
- dbgs() << "[ " << I.second << " ] : " << *I.first << "\n";
- IPrev = I.second;
- }
-}
-#endif
-
-ScheduleMetrics
-GCNSchedStage::getScheduleMetrics(const std::vector<SUnit> &InputSchedule) {
-#ifndef NDEBUG
- std::set<std::pair<MachineInstr *, unsigned>, EarlierIssuingCycle>
- ReadyCyclesSorted;
-#endif
- const TargetSchedModel &SM = ST.getInstrInfo()->getSchedModel();
- unsigned SumBubbles = 0;
- DenseMap<unsigned, unsigned> ReadyCycles;
- unsigned CurrCycle = 0;
- for (auto &SU : InputSchedule) {
- unsigned ReadyCycle =
- computeSUnitReadyCycle(SU, CurrCycle, ReadyCycles, SM);
- SumBubbles += ReadyCycle - CurrCycle;
-#ifndef NDEBUG
- ReadyCyclesSorted.insert(std::make_pair(SU.getInstr(), ReadyCycle));
-#endif
- CurrCycle = ++ReadyCycle;
- }
-#ifndef NDEBUG
- LLVM_DEBUG(
- printScheduleModel(ReadyCyclesSorted);
- dbgs() << "\n\t"
- << "Metric: "
- << (SumBubbles
- ? (SumBubbles * ScheduleMetrics::ScaleFactor) / CurrCycle
- : 1)
- << "\n\n");
-#endif
-
- return ScheduleMetrics(CurrCycle, SumBubbles);
-}
-
-ScheduleMetrics
-GCNSchedStage::getScheduleMetrics(const GCNScheduleDAGMILive &DAG) {
-#ifndef NDEBUG
- std::set<std::pair<MachineInstr *, unsigned>, EarlierIssuingCycle>
- ReadyCyclesSorted;
-#endif
- const TargetSchedModel &SM = ST.getInstrInfo()->getSchedModel();
- unsigned SumBubbles = 0;
- DenseMap<unsigned, unsigned> ReadyCycles;
- unsigned CurrCycle = 0;
- for (auto &MI : DAG) {
- SUnit *SU = DAG.getSUnit(&MI);
- if (!SU)
- continue;
- unsigned ReadyCycle =
- computeSUnitReadyCycle(*SU, CurrCycle, ReadyCycles, SM);
- SumBubbles += ReadyCycle - CurrCycle;
-#ifndef NDEBUG
- ReadyCyclesSorted.insert(std::make_pair(SU->getInstr(), ReadyCycle));
-#endif
- CurrCycle = ++ReadyCycle;
- }
-#ifndef NDEBUG
- LLVM_DEBUG(
- printScheduleModel(ReadyCyclesSorted);
- dbgs() << "\n\t"
- << "Metric: "
- << (SumBubbles
- ? (SumBubbles * ScheduleMetrics::ScaleFactor) / CurrCycle
- : 1)
- << "\n\n");
-#endif
-
- return ScheduleMetrics(CurrCycle, SumBubbles);
-}
-
-bool GCNSchedStage::shouldRevertScheduling(unsigned WavesAfter) {
+bool GCNSchedStage::shouldRevertScheduling(unsigned WavesAfter,
+ unsigned WavesBefore) {
if (WavesAfter < DAG.MinOccupancy)
return true;
return false;
}
-bool OccInitialScheduleStage::shouldRevertScheduling(unsigned WavesAfter) {
+bool OccInitialScheduleStage::shouldRevertScheduling(unsigned WavesAfter,
+ unsigned WavesBefore) {
if (PressureAfter == PressureBefore)
return false;
- if (GCNSchedStage::shouldRevertScheduling(WavesAfter))
----------------
alex-t wrote:
> We need to keep this in order to preserve MaxOccupancy scheduler's behavior, but it should not be the priority for the balanced scheduler. Maybe the balanced scheduler should just have a different initial stage entirely.
If we decide to exactly preserve the MaxOccupancy scheduler's behavior, we'd better write a completely new code for most things. We could try to have a separate set of stages for the balanced scheduler but it still has to communicate with interfaces that are focused on the occupancy. So, I agree that the approach to minimize the existing code changes could be not viable.
https://github.com/llvm/llvm-project/pull/66634
More information about the llvm-commits
mailing list