@@ -94,9 +94,8 @@ class InstructionRule {
9494 std::optional<SmallVector<SUnit *, 4 >> Cache;
9595
9696public:
97- virtual bool
98- apply (const SUnit *, const ArrayRef<SUnit *>,
99- SmallVectorImpl<SchedGroup> &) {
97+ virtual bool apply (const SUnit *, const ArrayRef<SUnit *>,
98+ SmallVectorImpl<SchedGroup> &) {
10099 return true ;
101100 };
102101
@@ -696,6 +695,76 @@ bool PipelineSolver::solveExact() {
696695 return FinishedExploring;
697696}
698697
698+ // Implement a IGLP scheduling strategy.
699+ class IGLPStrategy {
700+ protected:
701+ ScheduleDAGInstrs *DAG;
702+
703+ const SIInstrInfo *TII;
704+
705+ public:
706+ // / Add SchedGroups to \p SyncedSchedGroups to implement this Strategy.
707+ virtual bool applyIGLPStrategy (
708+ DenseMap<int , SUnitsToCandidateSGsMap> &SyncedInstrs,
709+ DenseMap<int , SmallVector<SchedGroup, 4 >> &SyncedSchedGroups,
710+ AMDGPU::SchedulingPhase Phase) = 0;
711+
712+ // Returns true if this strategy should be applied to a ScheduleDAG.
713+ virtual bool shouldApplyStrategy (ScheduleDAGInstrs *DAG,
714+ AMDGPU::SchedulingPhase Phase) = 0;
715+
716+ bool IsBottomUp = true ;
717+
718+ IGLPStrategy (ScheduleDAGInstrs *DAG, const SIInstrInfo *TII)
719+ : DAG(DAG), TII(TII) {}
720+
721+ virtual ~IGLPStrategy () = default ;
722+ };
723+
724+ class MaxsOpt final : public IGLPStrategy {
725+ private:
726+ public:
727+ bool applyIGLPStrategy (
728+ DenseMap<int , SUnitsToCandidateSGsMap> &SyncedInstrs,
729+ DenseMap<int , SmallVector<SchedGroup, 4 >> &SyncedSchedGroups,
730+ AMDGPU::SchedulingPhase Phase) override ;
731+
732+ bool shouldApplyStrategy (ScheduleDAGInstrs *DAG,
733+ AMDGPU::SchedulingPhase Phase) override {
734+ return true ;
735+ }
736+
737+ MaxsOpt (ScheduleDAGInstrs *DAG, const SIInstrInfo *TII)
738+ : IGLPStrategy(DAG, TII) {
739+ IsBottomUp = true ;
740+ }
741+ };
742+
743+ bool MaxsOpt::applyIGLPStrategy (
744+ DenseMap<int , SUnitsToCandidateSGsMap> &SyncedInstrs,
745+ DenseMap<int , SmallVector<SchedGroup, 4 >> &SyncedSchedGroups,
746+ AMDGPU::SchedulingPhase Phase) {
747+ // Count the number of MFMA instructions.
748+ unsigned MFMACount = 0 ;
749+ for (const MachineInstr &I : *DAG)
750+ if (TII->isMFMAorWMMA (I))
751+ ++MFMACount;
752+
753+ const unsigned PipelineSyncID = 0 ;
754+ SchedGroup *SG = nullptr ;
755+ for (unsigned I = 0 ; I < MFMACount * 3 ; ++I) {
756+ SG = &SyncedSchedGroups[PipelineSyncID].emplace_back (
757+ SchedGroupMask::DS, 2 , PipelineSyncID, DAG, TII);
758+ SG->initSchedGroup (SyncedInstrs[SG->getSyncID ()]);
759+
760+ SG = &SyncedSchedGroups[PipelineSyncID].emplace_back (
761+ SchedGroupMask::MFMA, 1 , PipelineSyncID, DAG, TII);
762+ SG->initSchedGroup (SyncedInstrs[SG->getSyncID ()]);
763+ }
764+
765+ return true ;
766+ }
767+
699768template <typename T>
700769void PipelineSolver::greedyFind (
701770 std::vector<std::pair<SUnit *, SUnit *>> &AddedEdges, T I, T E) {
@@ -815,33 +884,8 @@ enum IGLPStrategyID : int {
815884 MFMASmallGemmOptID = 0 ,
816885 MFMASmallGemmSingleWaveOptID = 1 ,
817886 MFMAExpInterleaveID = 2 ,
818- MFMAExpSimpleInterleaveID = 3
819- };
820-
821- // Implement a IGLP scheduling strategy.
822- class IGLPStrategy {
823- protected:
824- ScheduleDAGInstrs *DAG;
825-
826- const SIInstrInfo *TII;
827-
828- public:
829- // / Add SchedGroups to \p SyncedSchedGroups to implement this Strategy.
830- virtual bool applyIGLPStrategy (
831- DenseMap<int , SUnitsToCandidateSGsMap> &SyncedInstrs,
832- DenseMap<int , SmallVector<SchedGroup, 4 >> &SyncedSchedGroups,
833- AMDGPU::SchedulingPhase Phase) = 0;
834-
835- // Returns true if this strategy should be applied to a ScheduleDAG.
836- virtual bool shouldApplyStrategy (ScheduleDAGInstrs *DAG,
837- AMDGPU::SchedulingPhase Phase) = 0;
838-
839- bool IsBottomUp = true ;
840-
841- IGLPStrategy (ScheduleDAGInstrs *DAG, const SIInstrInfo *TII)
842- : DAG(DAG), TII(TII) {}
843-
844- virtual ~IGLPStrategy () = default ;
887+ MFMAExpSimpleInterleaveID = 3 ,
888+ MaxsID = 4
845889};
846890
847891class MFMASmallGemmOpt final : public IGLPStrategy {
@@ -2335,6 +2379,8 @@ createIGLPStrategy(IGLPStrategyID ID, ScheduleDAGInstrs *DAG,
23352379 return std::make_unique<MFMAExpInterleaveOpt>(DAG, TII);
23362380 case MFMAExpSimpleInterleaveID:
23372381 return std::make_unique<MFMAExpSimpleInterleaveOpt>(DAG, TII);
2382+ case MaxsID:
2383+ return std::make_unique<MaxsOpt>(DAG, TII);
23382384 }
23392385
23402386 llvm_unreachable (" Unknown IGLPStrategyID" );
@@ -2599,10 +2645,14 @@ void IGroupLPDAGMutation::apply(ScheduleDAGInstrs *DAGInstrs) {
25992645 }
26002646
26012647 if (FoundSB || (FoundIGLP && ShouldApplyIGLP)) {
2648+ // llvm::dbgs() << "before pipeline solver\n";
2649+ // DAG->dump();
26022650 PipelineSolver PS (SyncedSchedGroups, SyncedInstrs, DAG, IsBottomUp);
26032651 // PipelineSolver performs the mutation by adding the edges it
26042652 // determined as the best
26052653 PS.solve ();
2654+ // llvm::dbgs() << "after pipeline solver\n";
2655+ // DAG->dump();
26062656 return ;
26072657 }
26082658}
0 commit comments