Skip to content

Commit d1a8c56

Browse files
committed
[LLVM][AMDGPU] extend IGLP
1 parent b581bd3 commit d1a8c56

File tree

5 files changed

+15076
-30
lines changed

5 files changed

+15076
-30
lines changed

llvm/lib/Target/AMDGPU/AMDGPUIGroupLP.cpp

Lines changed: 80 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,8 @@ class InstructionRule {
9494
std::optional<SmallVector<SUnit *, 4>> Cache;
9595

9696
public:
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+
699768
template <typename T>
700769
void 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

847891
class 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

Comments
 (0)