[llvm] [LLVM][AMDGPU] extend IGLP (PR #135846)
Maksim Levental via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 15 13:10:47 PDT 2025
https://github.com/makslevental created https://github.com/llvm/llvm-project/pull/135846
None
>From 7b13997f6cc3e3b6e3ef3dcb62876425e5b236d7 Mon Sep 17 00:00:00 2001
From: Maksim Levental <maksim.levental at gmail.com>
Date: Tue, 15 Apr 2025 16:10:17 -0400
Subject: [PATCH] [LLVM][AMDGPU] extend IGLP
---
llvm/lib/Target/AMDGPU/AMDGPUIGroupLP.cpp | 58 +++++++++++++++++++++--
1 file changed, 54 insertions(+), 4 deletions(-)
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUIGroupLP.cpp b/llvm/lib/Target/AMDGPU/AMDGPUIGroupLP.cpp
index 153b14ce60507..041ae5416a320 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUIGroupLP.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUIGroupLP.cpp
@@ -94,9 +94,8 @@ class InstructionRule {
std::optional<SmallVector<SUnit *, 4>> Cache;
public:
- virtual bool
- apply(const SUnit *, const ArrayRef<SUnit *>,
- SmallVectorImpl<SchedGroup> &) {
+ virtual bool apply(const SUnit *, const ArrayRef<SUnit *>,
+ SmallVectorImpl<SchedGroup> &) {
return true;
};
@@ -815,7 +814,8 @@ enum IGLPStrategyID : int {
MFMASmallGemmOptID = 0,
MFMASmallGemmSingleWaveOptID = 1,
MFMAExpInterleaveID = 2,
- MFMAExpSimpleInterleaveID = 3
+ MFMAExpSimpleInterleaveID = 3,
+ MaxsID = 4
};
// Implement a IGLP scheduling strategy.
@@ -2323,6 +2323,50 @@ bool MFMASmallGemmSingleWaveOpt::applyIGLPStrategy(
return true;
}
+class MaxsOpt final : public IGLPStrategy {
+private:
+public:
+ bool applyIGLPStrategy(
+ DenseMap<int, SUnitsToCandidateSGsMap> &SyncedInstrs,
+ DenseMap<int, SmallVector<SchedGroup, 4>> &SyncedSchedGroups,
+ AMDGPU::SchedulingPhase Phase) override;
+
+ bool shouldApplyStrategy(ScheduleDAGInstrs *DAG,
+ AMDGPU::SchedulingPhase Phase) override {
+ return true;
+ }
+
+ MaxsOpt(ScheduleDAGInstrs *DAG, const SIInstrInfo *TII)
+ : IGLPStrategy(DAG, TII) {
+ IsBottomUp = true;
+ }
+};
+
+bool MaxsOpt::applyIGLPStrategy(
+ DenseMap<int, SUnitsToCandidateSGsMap> &SyncedInstrs,
+ DenseMap<int, SmallVector<SchedGroup, 4>> &SyncedSchedGroups,
+ AMDGPU::SchedulingPhase Phase) {
+ // Count the number of MFMA instructions.
+ unsigned MFMACount = 0;
+ for (const MachineInstr &I : *DAG)
+ if (TII->isMFMAorWMMA(I))
+ ++MFMACount;
+
+ const unsigned PipelineSyncID = 0;
+ SchedGroup *SG = nullptr;
+ for (unsigned I = 0; I < MFMACount * 3; ++I) {
+ SG = &SyncedSchedGroups[PipelineSyncID].emplace_back(
+ SchedGroupMask::DS, 2, PipelineSyncID, DAG, TII);
+ SG->initSchedGroup(SyncedInstrs[SG->getSyncID()]);
+
+ SG = &SyncedSchedGroups[PipelineSyncID].emplace_back(
+ SchedGroupMask::MFMA, 1, PipelineSyncID, DAG, TII);
+ SG->initSchedGroup(SyncedInstrs[SG->getSyncID()]);
+ }
+
+ return true;
+}
+
static std::unique_ptr<IGLPStrategy>
createIGLPStrategy(IGLPStrategyID ID, ScheduleDAGInstrs *DAG,
const SIInstrInfo *TII) {
@@ -2335,6 +2379,8 @@ createIGLPStrategy(IGLPStrategyID ID, ScheduleDAGInstrs *DAG,
return std::make_unique<MFMAExpInterleaveOpt>(DAG, TII);
case MFMAExpSimpleInterleaveID:
return std::make_unique<MFMAExpSimpleInterleaveOpt>(DAG, TII);
+ case MaxsID:
+ return std::make_unique<MaxsOpt>(DAG, TII);
}
llvm_unreachable("Unknown IGLPStrategyID");
@@ -2599,10 +2645,14 @@ void IGroupLPDAGMutation::apply(ScheduleDAGInstrs *DAGInstrs) {
}
if (FoundSB || (FoundIGLP && ShouldApplyIGLP)) {
+ // llvm::dbgs() << "before pipeline solver\n";
+ // DAG->dump();
PipelineSolver PS(SyncedSchedGroups, SyncedInstrs, DAG, IsBottomUp);
// PipelineSolver performs the mutation by adding the edges it
// determined as the best
PS.solve();
+ // llvm::dbgs() << "after pipeline solver\n";
+ // DAG->dump();
return;
}
}
More information about the llvm-commits
mailing list