From e3db0174e0eb7dbbb469a4426d348fc2f99b291e Mon Sep 17 00:00:00 2001 From: toudefu <2696810816@qq.com> Date: Mon, 22 Sep 2025 16:56:50 +0800 Subject: [PATCH 01/14] iluvatar c++ decouple --- .../triton/Analysis/iluvatar_AxisInfo.h | 16 +++++ third_party/iluvatar/include/CMakeLists.txt | 3 + .../include/triton/Analysis/AxisInfo.h | 59 ++++++++++++++++++- 3 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_AxisInfo.h diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_AxisInfo.h b/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_AxisInfo.h new file mode 100644 index 000000000..6d0bf180f --- /dev/null +++ b/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_AxisInfo.h @@ -0,0 +1,16 @@ +#ifndef ILUVATAR_TRITON_ANALYSIS_AXISINFO_H +#define ILUVATAR_TRITON_ANALYSIS_AXISINFO_H + +#include "triton/Analysis/AxisInfo.h" + +namespace mlir::triton { + +#define FLAGTREE_SPEC_AxisInfo_initPessimisticStateFromFunc iluvatar_initPessimisticStateFromFunc + template void + AxisInfo::iluvatar_initPessimisticStateFromFunc(int argNumber, T funcOp, AxisInfo::DimVectorT *contiguity, + AxisInfo::DimVectorT *divisibility, AxisInfo::DimVectorT *constancy, + AxisInfo::DimVectorT *corex_stride); + +} // namespace mlir::triton + +#endif \ No newline at end of file diff --git a/third_party/iluvatar/include/CMakeLists.txt b/third_party/iluvatar/include/CMakeLists.txt index 109c292fe..233e998d3 100644 --- a/third_party/iluvatar/include/CMakeLists.txt +++ b/third_party/iluvatar/include/CMakeLists.txt @@ -1 +1,4 @@ add_subdirectory(triton) + +set(ILUVATAR_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../backend/flagtree_backend_specialization/include/triton") +include_directories("${ILUVATAR_INCLUDE_DIR}") diff --git a/third_party/iluvatar/include/triton/Analysis/AxisInfo.h b/third_party/iluvatar/include/triton/Analysis/AxisInfo.h index 5167f37d9..41120798e 100644 --- a/third_party/iluvatar/include/triton/Analysis/AxisInfo.h +++ b/third_party/iluvatar/include/triton/Analysis/AxisInfo.h @@ -13,6 +13,10 @@ #include #include +#define FLAGTREE_SPEC_CorexFlag +#define FLAGTREE_SPEC_AxisInfo_getCorexFlag +#define FLAGTREE_SPEC_AxisInfo_initPessimisticStateFromFunc + namespace mlir::triton { //===----------------------------------------------------------------------===// @@ -25,6 +29,20 @@ class AxisInfo { typedef SmallVector DimVectorT; public: +#ifndef __ILUVATAR__ + AxisInfo() : AxisInfo({}, {}, {}) {} + + AxisInfo(DimVectorT contiguity, DimVectorT divisibility, DimVectorT constancy) + : AxisInfo(contiguity, divisibility, constancy, std::nullopt) {} + + AxisInfo(DimVectorT contiguity, DimVectorT divisibility, DimVectorT constancy, + std::optional constantValue) + : contiguity(contiguity), divisibility(divisibility), + constancy(constancy), constantValue(constantValue) { + assert(divisibility.size() == contiguity.size()); + assert(constancy.size() == contiguity.size()); + } +#else AxisInfo() : AxisInfo({}, {}, {}, {}) {} AxisInfo(DimVectorT contiguity, DimVectorT divisibility, DimVectorT constancy, @@ -40,6 +58,7 @@ class AxisInfo { assert(divisibility.size() == contiguity.size()); assert(constancy.size() == contiguity.size()); } +#endif // contiguity[d] is the length of the shortest sequence of contiguous integers // along dimension d. @@ -110,32 +129,64 @@ class AxisInfo { int64_t getConstancy(size_t dim) const { return constancy[dim]; } const DimVectorT &getConstancy() const { return constancy; } +#ifdef FLAGTREE_SPEC_AxisInfo_getCorexFlag // corexFlag is used to determine whether special instructions can be used to // accelerate data loading. int64_t getCorexFlag(size_t dim) const { return corexFlag[dim]; } const DimVectorT &getCorexFlag() const { return corexFlag; } +#endif int getRank() const { return contiguity.size(); } std::optional getConstantValue() const { return constantValue; } +#ifndef FLAGTREE_SPEC_AxisInfo_initPessimisticStateFromFunc template static void initPessimisticStateFromFunc(int argNumber, T funcOp, DimVectorT *contiguity, - DimVectorT *divisibility, DimVectorT *constancy, - DimVectorT *corex_stride); + DimVectorT *divisibility, DimVectorT *constancy); +#else +// #define initPessimisticStateFromFunc FLAGTREE_SPEC_AxisInfo_initPessimisticStateFromFunc + template + std::function initPessimisticStateFromFunc = FLAGTREE_SPEC_AxisInfo_initPessimisticStateFromFunc; +#endif +#ifndef __ILUVATAR__ + bool operator==(const AxisInfo &other) const { + return contiguity == other.contiguity && + divisibility == other.divisibility && constancy == other.constancy && + constantValue == other.constantValue; + } +#else bool operator==(const AxisInfo &other) const { return contiguity == other.contiguity && divisibility == other.divisibility && constancy == other.constancy && corexFlag == other.corexFlag && constantValue == other.constantValue; } +#endif static AxisInfo getPessimisticValueState(Value value); // The gcd of both arguments for each dimension static AxisInfo join(const AxisInfo &lhs, const AxisInfo &rhs); +#ifndef __ILUVATAR__ + void print(raw_ostream &os) const { + auto print = [&](StringRef name, DimVectorT vec) { + os << name << " = ["; + llvm::interleaveComma(vec, os); + os << "]"; + }; + print("contiguity", contiguity); + print(", divisibility", divisibility); + print(", constancy", constancy); + os << ", constant_value = "; + if (constantValue) + os << *constantValue; + else + os << ""; + } +#else void print(raw_ostream &os) const { auto print = [&](StringRef name, DimVectorT vec) { os << name << " = ["; @@ -152,14 +203,18 @@ class AxisInfo { else os << ""; } +#endif private: DimVectorT contiguity; DimVectorT divisibility; DimVectorT constancy; + // The constant value of the lattice if we can infer it. std::optional constantValue; +#ifdef FLAGTREE_SPEC_CorexFlag DimVectorT corexFlag; +#endif }; // Module level axis info analysis based on the call graph, assuming that we do From dc70c1d72229f887cdf6e4cdb7b211849ea1d2c5 Mon Sep 17 00:00:00 2001 From: zhengyang Date: Tue, 23 Sep 2025 04:57:51 +0000 Subject: [PATCH 02/14] [Decoupling] decouple iluvatar C++ --- third_party/iluvatar/CMakeLists.txt | 1 + .../include/flagtree_spec.h | 1 + .../triton/Analysis/iluvatar_AxisInfo.h | 14 ++------- .../lib/Analysis/AxisInfo.cpp | 31 +++++++++++++++++++ .../lib/Analysis/CMakeLists.txt | 7 +++++ .../lib/CMakeLists.txt | 1 + .../include/triton/Analysis/AxisInfo.h | 12 ++++--- .../iluvatar/lib/Analysis/AxisInfo.cpp | 23 +++----------- .../iluvatar/lib/Analysis/CMakeLists.txt | 2 ++ 9 files changed, 56 insertions(+), 36 deletions(-) create mode 100644 third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h create mode 100644 third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/AxisInfo.cpp create mode 100644 third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/CMakeLists.txt create mode 100644 third_party/iluvatar/backend/flagtree_backend_specialization/lib/CMakeLists.txt diff --git a/third_party/iluvatar/CMakeLists.txt b/third_party/iluvatar/CMakeLists.txt index 189faac8e..0de185219 100644 --- a/third_party/iluvatar/CMakeLists.txt +++ b/third_party/iluvatar/CMakeLists.txt @@ -1,5 +1,6 @@ add_subdirectory(include) add_subdirectory(lib) +add_subdirectory(backend/flagtree_backend_specialization/lib) if(TRITON_BUILD_PYTHON_MODULE) if(FLAGTREE_PLUGIN) diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h b/third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h new file mode 100644 index 000000000..f4a249cd9 --- /dev/null +++ b/third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h @@ -0,0 +1 @@ +#include "third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_AxisInfo.h" diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_AxisInfo.h b/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_AxisInfo.h index 6d0bf180f..33efb8ed6 100644 --- a/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_AxisInfo.h +++ b/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_AxisInfo.h @@ -1,16 +1,6 @@ #ifndef ILUVATAR_TRITON_ANALYSIS_AXISINFO_H #define ILUVATAR_TRITON_ANALYSIS_AXISINFO_H -#include "triton/Analysis/AxisInfo.h" +#define FLAGTREE_SPEC_AxisInfo_initPessimisticStateFromFunc_ARG AxisInfo::DimVectorT * -namespace mlir::triton { - -#define FLAGTREE_SPEC_AxisInfo_initPessimisticStateFromFunc iluvatar_initPessimisticStateFromFunc - template void - AxisInfo::iluvatar_initPessimisticStateFromFunc(int argNumber, T funcOp, AxisInfo::DimVectorT *contiguity, - AxisInfo::DimVectorT *divisibility, AxisInfo::DimVectorT *constancy, - AxisInfo::DimVectorT *corex_stride); - -} // namespace mlir::triton - -#endif \ No newline at end of file +#endif diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/AxisInfo.cpp b/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/AxisInfo.cpp new file mode 100644 index 000000000..ed3945435 --- /dev/null +++ b/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/AxisInfo.cpp @@ -0,0 +1,31 @@ +#include "triton/Analysis/AxisInfo.h" + +namespace mlir::triton { + +template +void AxisInfo::initPessimisticStateFromFunc(int argNumber, T funcOp, + DimVectorT *contiguity, + DimVectorT *divisibility, + DimVectorT *constancy, + DimVectorT *corexFlag) { + // liast of attributes that we care about + SmallVector> retVecs; + retVecs.push_back({contiguity, "tt.contiguity"}); + retVecs.push_back({divisibility, "tt.divisibility"}); + retVecs.push_back({constancy, "tt.constancy"}); + retVecs.push_back({corexFlag, "tt.corex_stride"}); + + // initialize attributes one by one + for (auto [vec, attrName] : retVecs) { + Attribute attr = funcOp.getArgAttr(argNumber, attrName); + if (auto int_attr = dyn_cast_or_null(attr)) + *vec = DimVectorT(contiguity->size(), int_attr.getValue().getZExtValue()); + if (auto dense_attr = dyn_cast_or_null(attr)) { + auto vals = dense_attr.getValues(); + *vec = DimVectorT(vals.begin(), vals.end()); + } + } +} + +} + diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/CMakeLists.txt b/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/CMakeLists.txt new file mode 100644 index 000000000..6686f4229 --- /dev/null +++ b/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/CMakeLists.txt @@ -0,0 +1,7 @@ +add_triton_library(FlagTree_iluvatar_TritonAnalysis + AxisInfo.cpp + + DEPENDS + TritonTableGen + TritonGPUAttrDefsIncGen +) \ No newline at end of file diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/lib/CMakeLists.txt b/third_party/iluvatar/backend/flagtree_backend_specialization/lib/CMakeLists.txt new file mode 100644 index 000000000..5c6d3ffe1 --- /dev/null +++ b/third_party/iluvatar/backend/flagtree_backend_specialization/lib/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(Analysis) \ No newline at end of file diff --git a/third_party/iluvatar/include/triton/Analysis/AxisInfo.h b/third_party/iluvatar/include/triton/Analysis/AxisInfo.h index 41120798e..d708011d1 100644 --- a/third_party/iluvatar/include/triton/Analysis/AxisInfo.h +++ b/third_party/iluvatar/include/triton/Analysis/AxisInfo.h @@ -15,7 +15,7 @@ #define FLAGTREE_SPEC_CorexFlag #define FLAGTREE_SPEC_AxisInfo_getCorexFlag -#define FLAGTREE_SPEC_AxisInfo_initPessimisticStateFromFunc +#include "third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h" namespace mlir::triton { @@ -140,15 +140,17 @@ class AxisInfo { std::optional getConstantValue() const { return constantValue; } -#ifndef FLAGTREE_SPEC_AxisInfo_initPessimisticStateFromFunc +#ifdef FLAGTREE_SPEC_AxisInfo_initPessimisticStateFromFunc_ARG template static void initPessimisticStateFromFunc(int argNumber, T funcOp, DimVectorT *contiguity, - DimVectorT *divisibility, DimVectorT *constancy); + DimVectorT *divisibility, DimVectorT *constancy, + FLAGTREE_SPEC_AxisInfo_initPessimisticStateFromFunc_ARG spec_arg); #else -// #define initPessimisticStateFromFunc FLAGTREE_SPEC_AxisInfo_initPessimisticStateFromFunc template - std::function initPessimisticStateFromFunc = FLAGTREE_SPEC_AxisInfo_initPessimisticStateFromFunc; + static void + initPessimisticStateFromFunc(int argNumber, T funcOp, DimVectorT *contiguity, + DimVectorT *divisibility, DimVectorT *constancy); #endif #ifndef __ILUVATAR__ diff --git a/third_party/iluvatar/lib/Analysis/AxisInfo.cpp b/third_party/iluvatar/lib/Analysis/AxisInfo.cpp index d0a39ba83..d509b39a7 100644 --- a/third_party/iluvatar/lib/Analysis/AxisInfo.cpp +++ b/third_party/iluvatar/lib/Analysis/AxisInfo.cpp @@ -1299,30 +1299,15 @@ void AxisInfoAnalysis::visitForOpInductionVar( } // anonymous namespace +#ifndef FLAGTREE_SPEC_AxisInfo_initPessimisticStateFromFunc_ARG template void AxisInfo::initPessimisticStateFromFunc(int argNumber, T funcOp, DimVectorT *contiguity, DimVectorT *divisibility, - DimVectorT *constancy, - DimVectorT *corexFlag) { - // liast of attributes that we care about - SmallVector> retVecs; - retVecs.push_back({contiguity, "tt.contiguity"}); - retVecs.push_back({divisibility, "tt.divisibility"}); - retVecs.push_back({constancy, "tt.constancy"}); - retVecs.push_back({corexFlag, "tt.corex_stride"}); - - // initialize attributes one by one - for (auto [vec, attrName] : retVecs) { - Attribute attr = funcOp.getArgAttr(argNumber, attrName); - if (auto int_attr = dyn_cast_or_null(attr)) - *vec = DimVectorT(contiguity->size(), int_attr.getValue().getZExtValue()); - if (auto dense_attr = dyn_cast_or_null(attr)) { - auto vals = dense_attr.getValues(); - *vec = DimVectorT(vals.begin(), vals.end()); - } - } + DimVectorT *constancy) { + // TODO: 原先的实现 } +#endif /*static*/ AxisInfo AxisInfo::getPessimisticValueState(Value value) { auto rank = 1; diff --git a/third_party/iluvatar/lib/Analysis/CMakeLists.txt b/third_party/iluvatar/lib/Analysis/CMakeLists.txt index 12deb6143..a310fe38e 100644 --- a/third_party/iluvatar/lib/Analysis/CMakeLists.txt +++ b/third_party/iluvatar/lib/Analysis/CMakeLists.txt @@ -8,6 +8,7 @@ add_triton_library(TritonAnalysis DEPENDS TritonTableGen TritonGPUAttrDefsIncGen + FlagTree_${FLAGTREE_BACKEND}_TritonAnalysis LINK_LIBS PUBLIC MLIRAnalysis @@ -15,4 +16,5 @@ add_triton_library(TritonAnalysis TritonIR TritonGPUIR #TritonNvidiaGPUIR + FlagTree_${FLAGTREE_BACKEND}_TritonAnalysis ) From 44c9b739d5f63ff55bfbbcb2f55df1bc86a6f0c6 Mon Sep 17 00:00:00 2001 From: zhengyang Date: Tue, 23 Sep 2025 05:01:41 +0000 Subject: [PATCH 03/14] [Decoupling] decouple iluvatar C++ --- .../lib/Analysis/AxisInfo.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/AxisInfo.cpp b/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/AxisInfo.cpp index ed3945435..277124e2c 100644 --- a/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/AxisInfo.cpp +++ b/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/AxisInfo.cpp @@ -1,5 +1,7 @@ #include "triton/Analysis/AxisInfo.h" +#include "mlir/Dialect/LLVMIR/LLVMDialect.h" + namespace mlir::triton { template @@ -27,5 +29,15 @@ void AxisInfo::initPessimisticStateFromFunc(int argNumber, T funcOp, } } +template void AxisInfo::initPessimisticStateFromFunc( + int argNumber, mlir::FunctionOpInterface funcOp, AxisInfo::DimVectorT *contiguity, + AxisInfo::DimVectorT *divisibility, AxisInfo::DimVectorT *constancy, + FLAGTREE_SPEC_AxisInfo_initPessimisticStateFromFunc_ARG spec_arg); + +template void AxisInfo::initPessimisticStateFromFunc( + int argNumber, mlir::LLVM::LLVMFuncOp funcOp, AxisInfo::DimVectorT *contiguity, + AxisInfo::DimVectorT *divisibility, AxisInfo::DimVectorT *constancy, + FLAGTREE_SPEC_AxisInfo_initPessimisticStateFromFunc_ARG spec_arg); + } From ea0ea17acf9247c3901e1dbfa33028441d02d45e Mon Sep 17 00:00:00 2001 From: zhengyang Date: Tue, 23 Sep 2025 05:07:21 +0000 Subject: [PATCH 04/14] [Decoupling] decouple iluvatar C++ --- .../flagtree_backend_specialization/include/flagtree_spec.h | 2 +- .../include/triton/Analysis/{iluvatar_AxisInfo.h => AxisInfo.h} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/{iluvatar_AxisInfo.h => AxisInfo.h} (100%) diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h b/third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h index f4a249cd9..411123864 100644 --- a/third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h +++ b/third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h @@ -1 +1 @@ -#include "third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_AxisInfo.h" +#include "third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/AxisInfo.h" diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_AxisInfo.h b/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/AxisInfo.h similarity index 100% rename from third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_AxisInfo.h rename to third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/AxisInfo.h From 904d4538531d49bd494e8d6dead262fb17adb48b Mon Sep 17 00:00:00 2001 From: zhengyang Date: Tue, 23 Sep 2025 05:19:52 +0000 Subject: [PATCH 05/14] [Decoupling] decouple iluvatar C++ --- third_party/iluvatar/CMakeLists.txt | 3 ++- .../flagtree_backend_specialization/include/flagtree_spec.h | 2 +- .../triton/Analysis/{AxisInfo.h => iluvatar_AxisInfo.h} | 0 third_party/iluvatar/include/triton/Analysis/AxisInfo.h | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) rename third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/{AxisInfo.h => iluvatar_AxisInfo.h} (100%) diff --git a/third_party/iluvatar/CMakeLists.txt b/third_party/iluvatar/CMakeLists.txt index 0de185219..75528071b 100644 --- a/third_party/iluvatar/CMakeLists.txt +++ b/third_party/iluvatar/CMakeLists.txt @@ -1,6 +1,7 @@ +include_directories(backend/flagtree_backend_specialization/include) +add_subdirectory(backend/flagtree_backend_specialization/lib) add_subdirectory(include) add_subdirectory(lib) -add_subdirectory(backend/flagtree_backend_specialization/lib) if(TRITON_BUILD_PYTHON_MODULE) if(FLAGTREE_PLUGIN) diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h b/third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h index 411123864..8500aa9c9 100644 --- a/third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h +++ b/third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h @@ -1 +1 @@ -#include "third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/AxisInfo.h" +#include "triton/Analysis/iluvatar_AxisInfo.h" diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/AxisInfo.h b/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_AxisInfo.h similarity index 100% rename from third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/AxisInfo.h rename to third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_AxisInfo.h diff --git a/third_party/iluvatar/include/triton/Analysis/AxisInfo.h b/third_party/iluvatar/include/triton/Analysis/AxisInfo.h index d708011d1..9b3623034 100644 --- a/third_party/iluvatar/include/triton/Analysis/AxisInfo.h +++ b/third_party/iluvatar/include/triton/Analysis/AxisInfo.h @@ -15,7 +15,7 @@ #define FLAGTREE_SPEC_CorexFlag #define FLAGTREE_SPEC_AxisInfo_getCorexFlag -#include "third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h" +#include "flagtree_spec.h" namespace mlir::triton { From 0359ed09626230e65e890a85db7fc61720ccf9b7 Mon Sep 17 00:00:00 2001 From: toudefu <2696810816@qq.com> Date: Tue, 23 Sep 2025 20:24:33 +0800 Subject: [PATCH 06/14] c++ decoupling --- .../include/triton/Analysis/iluvatar_AxisInfo.h | 2 ++ .../iluvatar/include/triton/Analysis/AxisInfo.h | 2 -- third_party/iluvatar/lib/Analysis/AxisInfo.cpp | 16 +++++++++++++++- third_party/iluvatar/lib/Analysis/CMakeLists.txt | 1 - 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_AxisInfo.h b/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_AxisInfo.h index 33efb8ed6..d21d416d2 100644 --- a/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_AxisInfo.h +++ b/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_AxisInfo.h @@ -1,6 +1,8 @@ #ifndef ILUVATAR_TRITON_ANALYSIS_AXISINFO_H #define ILUVATAR_TRITON_ANALYSIS_AXISINFO_H +#define FLAGTREE_SPEC_CorexFlag +#define FLAGTREE_SPEC_AxisInfo_getCorexFlag #define FLAGTREE_SPEC_AxisInfo_initPessimisticStateFromFunc_ARG AxisInfo::DimVectorT * #endif diff --git a/third_party/iluvatar/include/triton/Analysis/AxisInfo.h b/third_party/iluvatar/include/triton/Analysis/AxisInfo.h index 9b3623034..cdee76bb5 100644 --- a/third_party/iluvatar/include/triton/Analysis/AxisInfo.h +++ b/third_party/iluvatar/include/triton/Analysis/AxisInfo.h @@ -13,8 +13,6 @@ #include #include -#define FLAGTREE_SPEC_CorexFlag -#define FLAGTREE_SPEC_AxisInfo_getCorexFlag #include "flagtree_spec.h" namespace mlir::triton { diff --git a/third_party/iluvatar/lib/Analysis/AxisInfo.cpp b/third_party/iluvatar/lib/Analysis/AxisInfo.cpp index d509b39a7..c008fbc0f 100644 --- a/third_party/iluvatar/lib/Analysis/AxisInfo.cpp +++ b/third_party/iluvatar/lib/Analysis/AxisInfo.cpp @@ -1305,7 +1305,21 @@ void AxisInfo::initPessimisticStateFromFunc(int argNumber, T funcOp, DimVectorT *contiguity, DimVectorT *divisibility, DimVectorT *constancy) { - // TODO: 原先的实现 + // liast of attributes that we care about + SmallVector> retVecs; + retVecs.push_back({contiguity, "tt.contiguity"}); + retVecs.push_back({divisibility, "tt.divisibility"}); + retVecs.push_back({constancy, "tt.constancy"}); + // initialize attributes one by one + for (auto [vec, attrName] : retVecs) { + Attribute attr = funcOp.getArgAttr(argNumber, attrName); + if (auto int_attr = dyn_cast_or_null(attr)) + *vec = DimVectorT(contiguity->size(), int_attr.getValue().getZExtValue()); + if (auto dense_attr = dyn_cast_or_null(attr)) { + auto vals = dense_attr.getValues(); + *vec = DimVectorT(vals.begin(), vals.end()); + } + } } #endif diff --git a/third_party/iluvatar/lib/Analysis/CMakeLists.txt b/third_party/iluvatar/lib/Analysis/CMakeLists.txt index a310fe38e..d41b2aed5 100644 --- a/third_party/iluvatar/lib/Analysis/CMakeLists.txt +++ b/third_party/iluvatar/lib/Analysis/CMakeLists.txt @@ -8,7 +8,6 @@ add_triton_library(TritonAnalysis DEPENDS TritonTableGen TritonGPUAttrDefsIncGen - FlagTree_${FLAGTREE_BACKEND}_TritonAnalysis LINK_LIBS PUBLIC MLIRAnalysis From 8b6a9d2c0a3f1cdf195a89b6678c5d8aef111c8d Mon Sep 17 00:00:00 2001 From: toudefu <2696810816@qq.com> Date: Wed, 24 Sep 2025 10:32:38 +0800 Subject: [PATCH 07/14] Axisinfo decoupling --- .../triton/Analysis/iluvatar_AxisInfo.h | 3 +- .../include/triton/Analysis/AxisInfo.h | 37 ++++--------------- 2 files changed, 9 insertions(+), 31 deletions(-) diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_AxisInfo.h b/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_AxisInfo.h index d21d416d2..de7142aaf 100644 --- a/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_AxisInfo.h +++ b/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_AxisInfo.h @@ -1,8 +1,7 @@ #ifndef ILUVATAR_TRITON_ANALYSIS_AXISINFO_H #define ILUVATAR_TRITON_ANALYSIS_AXISINFO_H -#define FLAGTREE_SPEC_CorexFlag -#define FLAGTREE_SPEC_AxisInfo_getCorexFlag +#define FLAGTREE_SPEC_AxisInfo_CorexFlag #define FLAGTREE_SPEC_AxisInfo_initPessimisticStateFromFunc_ARG AxisInfo::DimVectorT * #endif diff --git a/third_party/iluvatar/include/triton/Analysis/AxisInfo.h b/third_party/iluvatar/include/triton/Analysis/AxisInfo.h index cdee76bb5..d09f84bab 100644 --- a/third_party/iluvatar/include/triton/Analysis/AxisInfo.h +++ b/third_party/iluvatar/include/triton/Analysis/AxisInfo.h @@ -27,7 +27,7 @@ class AxisInfo { typedef SmallVector DimVectorT; public: -#ifndef __ILUVATAR__ +#ifndef FLAGTREE_SPEC_AxisInfo_CorexFlag AxisInfo() : AxisInfo({}, {}, {}) {} AxisInfo(DimVectorT contiguity, DimVectorT divisibility, DimVectorT constancy) @@ -127,7 +127,7 @@ class AxisInfo { int64_t getConstancy(size_t dim) const { return constancy[dim]; } const DimVectorT &getConstancy() const { return constancy; } -#ifdef FLAGTREE_SPEC_AxisInfo_getCorexFlag +#ifdef FLAGTREE_SPEC_AxisInfo_CorexFlag // corexFlag is used to determine whether special instructions can be used to // accelerate data loading. int64_t getCorexFlag(size_t dim) const { return corexFlag[dim]; } @@ -151,42 +151,20 @@ class AxisInfo { DimVectorT *divisibility, DimVectorT *constancy); #endif -#ifndef __ILUVATAR__ bool operator==(const AxisInfo &other) const { return contiguity == other.contiguity && divisibility == other.divisibility && constancy == other.constancy && +#ifdef FLAGTREE_SPEC_AxisInfo_CorexFlag + corexFlag == other.corexFlag && +#endif constantValue == other.constantValue; } -#else - bool operator==(const AxisInfo &other) const { - return contiguity == other.contiguity && - divisibility == other.divisibility && constancy == other.constancy && - corexFlag == other.corexFlag && constantValue == other.constantValue; - } -#endif static AxisInfo getPessimisticValueState(Value value); // The gcd of both arguments for each dimension static AxisInfo join(const AxisInfo &lhs, const AxisInfo &rhs); -#ifndef __ILUVATAR__ - void print(raw_ostream &os) const { - auto print = [&](StringRef name, DimVectorT vec) { - os << name << " = ["; - llvm::interleaveComma(vec, os); - os << "]"; - }; - print("contiguity", contiguity); - print(", divisibility", divisibility); - print(", constancy", constancy); - os << ", constant_value = "; - if (constantValue) - os << *constantValue; - else - os << ""; - } -#else void print(raw_ostream &os) const { auto print = [&](StringRef name, DimVectorT vec) { os << name << " = ["; @@ -196,14 +174,15 @@ class AxisInfo { print("contiguity", contiguity); print(", divisibility", divisibility); print(", constancy", constancy); +#ifdef FLAGTREE_SPEC_AxisInfo_CorexFlag print(", corexflag", corexFlag); +#endif os << ", constant_value = "; if (constantValue) os << *constantValue; else os << ""; } -#endif private: DimVectorT contiguity; @@ -212,7 +191,7 @@ class AxisInfo { // The constant value of the lattice if we can infer it. std::optional constantValue; -#ifdef FLAGTREE_SPEC_CorexFlag +#ifdef FLAGTREE_SPEC_AxisInfo_CorexFlag DimVectorT corexFlag; #endif }; From c031abd14f8223d0af43b8ad680a8c38812f0d0e Mon Sep 17 00:00:00 2001 From: toudefu <2696810816@qq.com> Date: Wed, 24 Sep 2025 11:32:45 +0800 Subject: [PATCH 08/14] membar decoupling --- .../include/flagtree_spec.h | 1 + .../include/triton/Analysis/iluvatar_Membar.h | 6 ++++ .../lib/Analysis/CMakeLists.txt | 1 + .../lib/Analysis/Membar.cpp | 35 +++++++++++++++++++ .../iluvatar/include/triton/Analysis/Membar.h | 32 +++-------------- 5 files changed, 48 insertions(+), 27 deletions(-) create mode 100644 third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_Membar.h create mode 100644 third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/Membar.cpp diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h b/third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h index 8500aa9c9..195318214 100644 --- a/third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h +++ b/third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h @@ -1 +1,2 @@ #include "triton/Analysis/iluvatar_AxisInfo.h" +#include "triton/Analysis/iluvatar_Membar.h" diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_Membar.h b/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_Membar.h new file mode 100644 index 000000000..2b83b34ed --- /dev/null +++ b/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_Membar.h @@ -0,0 +1,6 @@ +#ifndef ILUVATAR_TRITON_ANALYSIS_MEMBAR_H +#define ILUVATAR_TRITON_ANALYSIS_MEMBAR_H + +#define FLAGTREE_SPEC_BlockInfo_Function + +#endif // ILUVATAR_TRITON_ANALYSIS_MEMBAR_H diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/CMakeLists.txt b/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/CMakeLists.txt index 6686f4229..b7e4a99ab 100644 --- a/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/CMakeLists.txt +++ b/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/CMakeLists.txt @@ -1,5 +1,6 @@ add_triton_library(FlagTree_iluvatar_TritonAnalysis AxisInfo.cpp + Membar.cpp DEPENDS TritonTableGen diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/Membar.cpp b/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/Membar.cpp new file mode 100644 index 000000000..1ff993208 --- /dev/null +++ b/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/Membar.cpp @@ -0,0 +1,35 @@ +#include "triton/Analysis/Membar.h" + +namespace mlir { + +// type: 0 all | 1 del W from other R |2 del R from other W +void BlockInfo::erase(BlockInfo &other, int type) { + if (type == 0) { + for (auto &sri : other.syncReadIntervals) + syncReadIntervals.erase(sri); + for (auto &swi : other.syncWriteIntervals) + syncWriteIntervals.erase(swi); + } else if (type == 1) { + for (auto &sri : other.syncReadIntervals) + syncWriteIntervals.erase(sri); + } else if (type == 2) { + for (auto &swi : other.syncWriteIntervals) + syncReadIntervals.erase(swi); + } +} + +// for debug +void BlockInfo::printIntervals() { + if (syncReadIntervals.size() > 0 || syncWriteIntervals.size() > 0) { + std::cout << " syncReadIntervals"; + for (auto &lhs : syncReadIntervals) + std::cout << " [" << lhs.start() << ", " << lhs.end() << "] "; + std::cout << "" << std::endl; + std::cout << " syncWriteIntervals"; + for (auto &lhs : syncWriteIntervals) + std::cout << " [" << lhs.start() << ", " << lhs.end() << "] "; + std::cout << "" << std::endl; + } +} + +} \ No newline at end of file diff --git a/third_party/iluvatar/include/triton/Analysis/Membar.h b/third_party/iluvatar/include/triton/Analysis/Membar.h index 9a9cf25f3..f02bba135 100644 --- a/third_party/iluvatar/include/triton/Analysis/Membar.h +++ b/third_party/iluvatar/include/triton/Analysis/Membar.h @@ -6,6 +6,8 @@ #include +#include "triton/../../backend/flagtree_backend_specialization/include/flagtree_spec.h" + namespace mlir { class OpBuilder; @@ -43,36 +45,12 @@ struct BlockInfo { syncWriteIntervals.clear(); } -#ifdef __ILUVATAR__ +#ifdef FLAGTREE_SPEC_BlockInfo_Function // type: 0 all | 1 del W from other R |2 del R from other W - void erase(BlockInfo &other, int type = 0) { - if (type == 0) { - for (auto &sri : other.syncReadIntervals) - syncReadIntervals.erase(sri); - for (auto &swi : other.syncWriteIntervals) - syncWriteIntervals.erase(swi); - } else if (type == 1) { - for (auto &sri : other.syncReadIntervals) - syncWriteIntervals.erase(sri); - } else if (type == 2) { - for (auto &swi : other.syncWriteIntervals) - syncReadIntervals.erase(swi); - } - } + void erase(BlockInfo &other, int type = 0); // for debug - void printIntervals() { - if (syncReadIntervals.size() > 0 || syncWriteIntervals.size() > 0) { - std::cout << " syncReadIntervals"; - for (auto &lhs : syncReadIntervals) - std::cout << " [" << lhs.start() << ", " << lhs.end() << "] "; - std::cout << "" << std::endl; - std::cout << " syncWriteIntervals"; - for (auto &lhs : syncWriteIntervals) - std::cout << " [" << lhs.start() << ", " << lhs.end() << "] "; - std::cout << "" << std::endl; - } - } + void printIntervals(); #endif /// Compares two BlockInfo objects. From e063f17729d8a233d2c602d7562b168ab6cead64 Mon Sep 17 00:00:00 2001 From: toudefu <2696810816@qq.com> Date: Wed, 24 Sep 2025 12:01:09 +0800 Subject: [PATCH 09/14] utility decoupling --- .../include/flagtree_spec.h | 1 + .../triton/Analysis/iluvatar_Utility.h | 6 ++ .../lib/Analysis/CMakeLists.txt | 1 + .../lib/Analysis/Utility.cpp | 78 +++++++++++++++++++ .../include/triton/Analysis/Utility.h | 8 +- third_party/iluvatar/lib/Analysis/Utility.cpp | 75 ------------------ 6 files changed, 91 insertions(+), 78 deletions(-) create mode 100644 third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_Utility.h create mode 100644 third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/Utility.cpp diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h b/third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h index 195318214..1f864329c 100644 --- a/third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h +++ b/third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h @@ -1,2 +1,3 @@ #include "triton/Analysis/iluvatar_AxisInfo.h" #include "triton/Analysis/iluvatar_Membar.h" +#include "triton/Analysis/iluvatar_Utility.h" diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_Utility.h b/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_Utility.h new file mode 100644 index 000000000..cf860cb2e --- /dev/null +++ b/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_Utility.h @@ -0,0 +1,6 @@ +#ifndef ILUVATAR_TRITON_ANALYSIS_UTILITY_H +#define ILUVATAR_TRITON_ANALYSIS_UTILITY_H + +#define FLAGTREE_SPEC_Utility_Function + +#endif // TRITON_ANALYSIS_UTILITY_H \ No newline at end of file diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/CMakeLists.txt b/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/CMakeLists.txt index b7e4a99ab..3e4c88d5a 100644 --- a/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/CMakeLists.txt +++ b/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/CMakeLists.txt @@ -1,6 +1,7 @@ add_triton_library(FlagTree_iluvatar_TritonAnalysis AxisInfo.cpp Membar.cpp + Utility.cpp DEPENDS TritonTableGen diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/Utility.cpp b/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/Utility.cpp new file mode 100644 index 000000000..2c0c5bf4e --- /dev/null +++ b/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/Utility.cpp @@ -0,0 +1,78 @@ +#include "triton/Analysis/Utility.h" + +namespace mlir { + +bool isMmaToDotSlowShortcut(RankedTensorType &srcTy, RankedTensorType &dstTy) { + + auto srcLayout = srcTy.getEncoding(); + auto dstLayout = dstTy.getEncoding(); + if (!srcLayout.isa()) + return false; + auto mmaLayout = srcLayout.cast(); + if (!dstLayout.isa()) + return false; + auto dotOperandLayout = dstLayout.cast(); + auto dstParLayout = dotOperandLayout.getParent(); + if (!dstParLayout.isa()) + return false; + auto dstMmaLayout = + dstParLayout.dyn_cast(); + return !isMmaToDotShortcut(srcTy, dstTy) && + mmaLayout.getVersionMajor() == 1 && + dstMmaLayout.getVersionMajor() == 1 && + mmaLayout.getWarpsPerCTA()[0] == dstMmaLayout.getWarpsPerCTA()[0] && + dotOperandLayout.getOpIdx() == 0 && !srcTy.getElementType().isF32(); +} + +void getBackwardSliceImplCorex(Operation *op, + SetVector *backwardSlice, + TransitiveFilter filter, + bool omitBlockArguments) { + if (!op || op->hasTrait()) + return; + + // Evaluate whether we should keep this def. + // This is useful in particular to implement scoping; i.e. return the + // transitive backwardSlice in the current scope. + if (filter && !filter(op)) + return; + + for (const auto &en : llvm::enumerate(op->getOperands())) { + auto operand = en.value(); + if (auto *definingOp = operand.getDefiningOp()) { + if (backwardSlice->count(definingOp) == 0) + getBackwardSliceImplCorex(definingOp, backwardSlice, filter, + omitBlockArguments); + } else if (auto blockArg = operand.dyn_cast()) { + if (omitBlockArguments) + continue; + + Block *block = blockArg.getOwner(); + Operation *parentOp = block->getParentOp(); + // TODO: determine whether we want to recurse backward into the other + // blocks of parentOp, which are not technically backward unless they flow + // into us. For now, just bail. + if (parentOp && backwardSlice->count(parentOp) == 0) { + // assert(parentOp->getNumRegions() == 1 && + // parentOp->getRegion(0).getBlocks().size() == 1); + getBackwardSliceImplCorex(parentOp, backwardSlice, filter, + omitBlockArguments); + } + } else { + llvm_unreachable("No definingOp and not a block argument."); + } + } + + backwardSlice->insert(op); +} + +void getBackwardSliceCorex(Operation *op, SetVector *backwardSlice, + TransitiveFilter filter, bool omitBlockArguments) { + getBackwardSliceImplCorex(op, backwardSlice, filter, omitBlockArguments); + + // Don't insert the top level operation, we just queried on it and don't + // want it in the results. + backwardSlice->remove(op); +} + +} \ No newline at end of file diff --git a/third_party/iluvatar/include/triton/Analysis/Utility.h b/third_party/iluvatar/include/triton/Analysis/Utility.h index b89b90215..7baac2d54 100644 --- a/third_party/iluvatar/include/triton/Analysis/Utility.h +++ b/third_party/iluvatar/include/triton/Analysis/Utility.h @@ -7,6 +7,8 @@ #include "triton/Dialect/Triton/IR/Dialect.h" #include "triton/Dialect/TritonGPU/IR/Dialect.h" +#include "triton/../../backend/flagtree_backend_specialization/include/flagtree_spec.h" + namespace mlir { inline bool isZeroConst(Value v) { @@ -192,8 +194,6 @@ bool isMfmaToDotShortcut(RankedTensorType &srcTy, RankedTensorType &dstTy); bool isMmaToDotShortcut(RankedTensorType srcTy, RankedTensorType dstTy); -bool isMmaToDotSlowShortcut(RankedTensorType &srcTy, RankedTensorType &dstTy); - bool isMmaToMmaShortcut(RankedTensorType srcTy, RankedTensorType dstTy); // Return true if the src and dst layout match. @@ -212,7 +212,9 @@ bool shouldUseDistSmem(Attribute srcLayout, Attribute dstLayout); SetVector multiRootTopologicalSort(const SetVector &toSort); -#ifdef __ILUVATAR__ +#ifdef FLAGTREE_SPEC_Utility_Function +bool isMmaToDotSlowShortcut(RankedTensorType &srcTy, RankedTensorType &dstTy); + /// This function dones't use assertion check. void getBackwardSliceCorex(Operation *op, SetVector *backwardSlice, TransitiveFilter filter = nullptr, diff --git a/third_party/iluvatar/lib/Analysis/Utility.cpp b/third_party/iluvatar/lib/Analysis/Utility.cpp index 232edc6e2..f2d522367 100644 --- a/third_party/iluvatar/lib/Analysis/Utility.cpp +++ b/third_party/iluvatar/lib/Analysis/Utility.cpp @@ -676,28 +676,6 @@ bool isMmaToDotShortcut(RankedTensorType srcTy, RankedTensorType dstTy) { #endif } -bool isMmaToDotSlowShortcut(RankedTensorType &srcTy, RankedTensorType &dstTy) { - - auto srcLayout = srcTy.getEncoding(); - auto dstLayout = dstTy.getEncoding(); - if (!srcLayout.isa()) - return false; - auto mmaLayout = srcLayout.cast(); - if (!dstLayout.isa()) - return false; - auto dotOperandLayout = dstLayout.cast(); - auto dstParLayout = dotOperandLayout.getParent(); - if (!dstParLayout.isa()) - return false; - auto dstMmaLayout = - dstParLayout.dyn_cast(); - return !isMmaToDotShortcut(srcTy, dstTy) && - mmaLayout.getVersionMajor() == 1 && - dstMmaLayout.getVersionMajor() == 1 && - mmaLayout.getWarpsPerCTA()[0] == dstMmaLayout.getWarpsPerCTA()[0] && - dotOperandLayout.getOpIdx() == 0 && !srcTy.getElementType().isF32(); -} - namespace { /// A data structure similar to SetVector but maintains @@ -830,59 +808,6 @@ multiRootTopologicalSort(const SetVector &toSort) { return res; } -#ifdef __ILUVATAR__ -void getBackwardSliceImplCorex(Operation *op, - SetVector *backwardSlice, - TransitiveFilter filter, - bool omitBlockArguments) { - if (!op || op->hasTrait()) - return; - - // Evaluate whether we should keep this def. - // This is useful in particular to implement scoping; i.e. return the - // transitive backwardSlice in the current scope. - if (filter && !filter(op)) - return; - - for (const auto &en : llvm::enumerate(op->getOperands())) { - auto operand = en.value(); - if (auto *definingOp = operand.getDefiningOp()) { - if (backwardSlice->count(definingOp) == 0) - getBackwardSliceImplCorex(definingOp, backwardSlice, filter, - omitBlockArguments); - } else if (auto blockArg = operand.dyn_cast()) { - if (omitBlockArguments) - continue; - - Block *block = blockArg.getOwner(); - Operation *parentOp = block->getParentOp(); - // TODO: determine whether we want to recurse backward into the other - // blocks of parentOp, which are not technically backward unless they flow - // into us. For now, just bail. - if (parentOp && backwardSlice->count(parentOp) == 0) { - // assert(parentOp->getNumRegions() == 1 && - // parentOp->getRegion(0).getBlocks().size() == 1); - getBackwardSliceImplCorex(parentOp, backwardSlice, filter, - omitBlockArguments); - } - } else { - llvm_unreachable("No definingOp and not a block argument."); - } - } - - backwardSlice->insert(op); -} - -void getBackwardSliceCorex(Operation *op, SetVector *backwardSlice, - TransitiveFilter filter, bool omitBlockArguments) { - getBackwardSliceImplCorex(op, backwardSlice, filter, omitBlockArguments); - - // Don't insert the top level operation, we just queried on it and don't - // want it in the results. - backwardSlice->remove(op); -} -#endif - SetVector multiRootGetSlice(Operation *op, TransitiveFilter backwardFilter, TransitiveFilter forwardFilter, From 05efdddc77fa6d85cacea34c037f62b02ffdf4a0 Mon Sep 17 00:00:00 2001 From: toudefu <2696810816@qq.com> Date: Wed, 24 Sep 2025 16:55:54 +0800 Subject: [PATCH 10/14] utility multiRootGetSlice decoupling --- .../triton/Analysis/iluvatar_Utility.h | 1 + .../lib/Analysis/Utility.cpp | 30 +++++++++++++++++++ .../include/triton/Analysis/Utility.h | 8 ++++- third_party/iluvatar/lib/Analysis/Utility.cpp | 10 ++----- 4 files changed, 41 insertions(+), 8 deletions(-) diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_Utility.h b/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_Utility.h index cf860cb2e..dfc9fc250 100644 --- a/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_Utility.h +++ b/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_Utility.h @@ -2,5 +2,6 @@ #define ILUVATAR_TRITON_ANALYSIS_UTILITY_H #define FLAGTREE_SPEC_Utility_Function +#define FLAGTREE_SPEC_Utility_multiRootGetSlice_ARG bool #endif // TRITON_ANALYSIS_UTILITY_H \ No newline at end of file diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/Utility.cpp b/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/Utility.cpp index 2c0c5bf4e..27f84e1b7 100644 --- a/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/Utility.cpp +++ b/third_party/iluvatar/backend/flagtree_backend_specialization/lib/Analysis/Utility.cpp @@ -75,4 +75,34 @@ void getBackwardSliceCorex(Operation *op, SetVector *backwardSlice, backwardSlice->remove(op); } +SetVector multiRootGetSlice(Operation *op, + TransitiveFilter backwardFilter, + TransitiveFilter forwardFilter, + bool omitBlockArguments) { + SetVector slice; + slice.insert(op); + + unsigned currentIndex = 0; + SetVector backwardSlice; + SetVector forwardSlice; + while (currentIndex != slice.size()) { + auto *currentOp = (slice)[currentIndex]; + // Compute and insert the backwardSlice starting from currentOp. + backwardSlice.clear(); + BackwardSliceOptions opt; + opt.omitBlockArguments = true; + opt.filter = backwardFilter; + getBackwardSliceCorex(currentOp, &backwardSlice, opt.filter, + opt.omitBlockArguments); + slice.insert(backwardSlice.begin(), backwardSlice.end()); + + // Compute and insert the forwardSlice starting from currentOp. + forwardSlice.clear(); + getForwardSlice(currentOp, &forwardSlice, forwardFilter); + slice.insert(forwardSlice.begin(), forwardSlice.end()); + ++currentIndex; + } + return multiRootTopologicalSort(slice); +} + } \ No newline at end of file diff --git a/third_party/iluvatar/include/triton/Analysis/Utility.h b/third_party/iluvatar/include/triton/Analysis/Utility.h index 7baac2d54..86ab7fd5c 100644 --- a/third_party/iluvatar/include/triton/Analysis/Utility.h +++ b/third_party/iluvatar/include/triton/Analysis/Utility.h @@ -228,10 +228,16 @@ void getBackwardSliceImplCorex(Operation *op, #endif /// This uses the toplogicalSort above +#ifdef FLAGTREE_SPEC_Utility_multiRootGetSlice_ARG SetVector multiRootGetSlice(Operation *op, TransitiveFilter backwardFilter = nullptr, TransitiveFilter forwardFilter = nullptr, - bool omitBlockArguments = true); + FLAGTREE_SPEC_Utility_multiRootGetSlice_ARG spec_arg = true); +#else +SetVector +multiRootGetSlice(Operation *op, TransitiveFilter backwardFilter = nullptr, + TransitiveFilter forwardFilter = nullptr); +#endif /// Create a basic DataFlowSolver with constant and dead code analysis included. std::unique_ptr createDataFlowSolver(); diff --git a/third_party/iluvatar/lib/Analysis/Utility.cpp b/third_party/iluvatar/lib/Analysis/Utility.cpp index f2d522367..251274231 100644 --- a/third_party/iluvatar/lib/Analysis/Utility.cpp +++ b/third_party/iluvatar/lib/Analysis/Utility.cpp @@ -808,10 +808,10 @@ multiRootTopologicalSort(const SetVector &toSort) { return res; } +#ifndef FLAGTREE_SPEC_Utility_multiRootGetSlice_ARG SetVector multiRootGetSlice(Operation *op, TransitiveFilter backwardFilter, - TransitiveFilter forwardFilter, - bool omitBlockArguments) { + TransitiveFilter forwardFilter) { SetVector slice; slice.insert(op); @@ -825,12 +825,7 @@ SetVector multiRootGetSlice(Operation *op, BackwardSliceOptions opt; opt.omitBlockArguments = true; opt.filter = backwardFilter; -#ifdef __ILUVATAR__ - getBackwardSliceCorex(currentOp, &backwardSlice, opt.filter, - opt.omitBlockArguments); -#elif getBackwardSlice(currentOp, &backwardSlice, opt); -#endif slice.insert(backwardSlice.begin(), backwardSlice.end()); // Compute and insert the forwardSlice starting from currentOp. @@ -841,6 +836,7 @@ SetVector multiRootGetSlice(Operation *op, } return multiRootTopologicalSort(slice); } +#endif namespace { // Copied from TestDeadCodeAnalysis.cpp, because some dead code analysis From 913a93b78a96bdef16d67ce2835597afcf320189 Mon Sep 17 00:00:00 2001 From: toudefu <2696810816@qq.com> Date: Wed, 24 Sep 2025 17:59:36 +0800 Subject: [PATCH 11/14] fix: head name --- .../include/triton/Analysis/iluvatar_AxisInfo.h | 2 +- .../include/triton/Analysis/iluvatar_Utility.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_AxisInfo.h b/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_AxisInfo.h index de7142aaf..92ba755b4 100644 --- a/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_AxisInfo.h +++ b/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_AxisInfo.h @@ -4,4 +4,4 @@ #define FLAGTREE_SPEC_AxisInfo_CorexFlag #define FLAGTREE_SPEC_AxisInfo_initPessimisticStateFromFunc_ARG AxisInfo::DimVectorT * -#endif +#endif // ILUVATAR_TRITON_ANALYSIS_AXISINFO_H \ No newline at end of file diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_Utility.h b/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_Utility.h index dfc9fc250..721671cae 100644 --- a/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_Utility.h +++ b/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Analysis/iluvatar_Utility.h @@ -4,4 +4,4 @@ #define FLAGTREE_SPEC_Utility_Function #define FLAGTREE_SPEC_Utility_multiRootGetSlice_ARG bool -#endif // TRITON_ANALYSIS_UTILITY_H \ No newline at end of file +#endif // ILUVATAR_TRITON_ANALYSIS_UTILITY_H \ No newline at end of file From 7ea98fc0693f86170bdc85fc4080118afb4b9617 Mon Sep 17 00:00:00 2001 From: toudefu <2696810816@qq.com> Date: Thu, 25 Sep 2025 09:46:32 +0800 Subject: [PATCH 12/14] conversion tritonGPUToLLVM elementwiseOpToLLVMBase decoupling --- .../include/flagtree_spec.h | 1 + .../TritonGPUToLLVM/iluvatar_ElementwiseOpToLLVMBase.h | 7 +++++++ .../Conversion/TritonGPUToLLVM/ElementwiseOpToLLVMBase.h | 4 +++- 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Conversion/TritonGPUToLLVM/iluvatar_ElementwiseOpToLLVMBase.h diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h b/third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h index 1f864329c..e0e67141d 100644 --- a/third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h +++ b/third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h @@ -1,3 +1,4 @@ #include "triton/Analysis/iluvatar_AxisInfo.h" #include "triton/Analysis/iluvatar_Membar.h" #include "triton/Analysis/iluvatar_Utility.h" +#include "triton/Conversion/TritonGPUToLLVM/iluvatar_ElementwiseOpToLLVMBase.h" diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Conversion/TritonGPUToLLVM/iluvatar_ElementwiseOpToLLVMBase.h b/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Conversion/TritonGPUToLLVM/iluvatar_ElementwiseOpToLLVMBase.h new file mode 100644 index 000000000..89715a919 --- /dev/null +++ b/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Conversion/TritonGPUToLLVM/iluvatar_ElementwiseOpToLLVMBase.h @@ -0,0 +1,7 @@ +#ifndef ILUVATAR_TRITON_CONVERSION_TRITONGPU_TO_ELEMENTWISE_OP_H +#define ILUVATAR_TRITON_CONVERSION_TRITONGPU_TO_ELEMENTWISE_OP_H + +#define FLAGTREE_SPEC_ElementwiseOpConversionBase_maybeDeduplicate +#define FLAGTREE_SPEC_ElementwiseOpConversionBase_matchAndRewrite + +#endif // ILUVATAR_TRITON_CONVERSION_TRITONGPU_TO_ELEMENTWISE_OP_H \ No newline at end of file diff --git a/third_party/iluvatar/include/triton/Conversion/TritonGPUToLLVM/ElementwiseOpToLLVMBase.h b/third_party/iluvatar/include/triton/Conversion/TritonGPUToLLVM/ElementwiseOpToLLVMBase.h index 1286b4e56..9b747edd5 100644 --- a/third_party/iluvatar/include/triton/Conversion/TritonGPUToLLVM/ElementwiseOpToLLVMBase.h +++ b/third_party/iluvatar/include/triton/Conversion/TritonGPUToLLVM/ElementwiseOpToLLVMBase.h @@ -102,12 +102,14 @@ class ElementwiseOpConversionBase : public ConvertOpToLLVMPattern { // test_core::test_fp8_dot_acc return resultVals; } +#ifdef FLAGTREE_SPEC_ElementwiseOpConversionBase_maybeDeduplicate if (isa(baseEncoding)) { // TODO: this logic seems incorrect for mma layout. Skip for now. // The following test crashes and some other miscompile: // test_core::test_fp8_dot_acc return resultVals; } +#endif SmallVector elemsPerThread = getElemsPerThread(rtType); int rank = elemsPerThread.size(); @@ -188,7 +190,7 @@ class ElementwiseOpConversionBase : public ConvertOpToLLVMPattern { // element type auto resultElementTy = getElementTypeOrSelf(resultTy); Type elemTy = this->getTypeConverter()->convertType(resultElementTy); -#ifdef __ILUVATAR__ +#ifdef FLAGTREE_SPEC_ElementwiseOpConversionBase_matchAndRewrite auto srcType = this->getTypeConverter()->convertType(resultTy); if (auto structTy = dyn_cast(srcType)) elemTy = structTy.getBody()[0]; From ffc374c39d846495ff4e1d9e5f4f72ad39f16385 Mon Sep 17 00:00:00 2001 From: toudefu <2696810816@qq.com> Date: Thu, 25 Sep 2025 09:58:50 +0800 Subject: [PATCH 13/14] conversion tritonGPUToLLVM TargetInfoBase decoupling --- .../include/flagtree_spec.h | 1 + .../Conversion/TritonGPUToLLVM/iluvatar_TargetInfoBase.h | 6 ++++++ .../triton/Conversion/TritonGPUToLLVM/TargetInfoBase.h | 8 ++++++++ 3 files changed, 15 insertions(+) create mode 100644 third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Conversion/TritonGPUToLLVM/iluvatar_TargetInfoBase.h diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h b/third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h index e0e67141d..065fd04f6 100644 --- a/third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h +++ b/third_party/iluvatar/backend/flagtree_backend_specialization/include/flagtree_spec.h @@ -2,3 +2,4 @@ #include "triton/Analysis/iluvatar_Membar.h" #include "triton/Analysis/iluvatar_Utility.h" #include "triton/Conversion/TritonGPUToLLVM/iluvatar_ElementwiseOpToLLVMBase.h" +#include "triton/Conversion/TritonGPUToLLVM/iluvatar_TargetInfoBase.h" diff --git a/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Conversion/TritonGPUToLLVM/iluvatar_TargetInfoBase.h b/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Conversion/TritonGPUToLLVM/iluvatar_TargetInfoBase.h new file mode 100644 index 000000000..bfffdfbf6 --- /dev/null +++ b/third_party/iluvatar/backend/flagtree_backend_specialization/include/triton/Conversion/TritonGPUToLLVM/iluvatar_TargetInfoBase.h @@ -0,0 +1,6 @@ +#ifndef ILUVATAR_TRITON_CONVERSION_TRITONGPU_TO_LLVM_TARGETINFOBASE_H +#define ILUVATAR_TRITON_CONVERSION_TRITONGPU_TO_LLVM_TARGETINFOBASE_H + +#define FLAGTREE_SPEC_TargetInfoBase_function + +#endif // ILUVATAR_TRITON_CONVERSION_TRITONGPU_TO_LLVM_TARGETINFOBASE_H \ No newline at end of file diff --git a/third_party/iluvatar/include/triton/Conversion/TritonGPUToLLVM/TargetInfoBase.h b/third_party/iluvatar/include/triton/Conversion/TritonGPUToLLVM/TargetInfoBase.h index 380c8cc1d..6702371fe 100644 --- a/third_party/iluvatar/include/triton/Conversion/TritonGPUToLLVM/TargetInfoBase.h +++ b/third_party/iluvatar/include/triton/Conversion/TritonGPUToLLVM/TargetInfoBase.h @@ -13,10 +13,18 @@ class TargetInfoBase { virtual Value ballot(ConversionPatternRewriter &rewriter, Location loc, Type type, Value cmp) const = 0; +#ifndef FLAGTREE_SPEC_TargetInfoBase_function + virtual void storeShared(ConversionPatternRewriter &rewriter, Location loc, + Value ptr, Value val, Value pred) const = 0; + virtual Value loadShared(ConversionPatternRewriter &rewriter, Location loc, + const TypeConverter *converter, Value ptr, + Type elemTy, Value pred) const = 0; +#else virtual Value storeShared(ConversionPatternRewriter &rewriter, Location loc, Value ptr, Value val, Value pred) const = 0; virtual Value loadShared(ConversionPatternRewriter &rewriter, Location loc, Value ptr, Type elemTy, Value pred) const = 0; +#endif virtual Value shuffleXor(ConversionPatternRewriter &rewriter, Location loc, Value val, int i) const = 0; From 7e0dae705a537cdc5dfb2533c60d62524a40ef4e Mon Sep 17 00:00:00 2001 From: toudefu <2696810816@qq.com> Date: Thu, 25 Sep 2025 10:48:10 +0800 Subject: [PATCH 14/14] fix: head flagtree_spec.h --- .../triton/Conversion/TritonGPUToLLVM/ElementwiseOpToLLVMBase.h | 2 ++ .../include/triton/Conversion/TritonGPUToLLVM/TargetInfoBase.h | 2 ++ 2 files changed, 4 insertions(+) diff --git a/third_party/iluvatar/include/triton/Conversion/TritonGPUToLLVM/ElementwiseOpToLLVMBase.h b/third_party/iluvatar/include/triton/Conversion/TritonGPUToLLVM/ElementwiseOpToLLVMBase.h index 9b747edd5..ddea5283d 100644 --- a/third_party/iluvatar/include/triton/Conversion/TritonGPUToLLVM/ElementwiseOpToLLVMBase.h +++ b/third_party/iluvatar/include/triton/Conversion/TritonGPUToLLVM/ElementwiseOpToLLVMBase.h @@ -8,6 +8,8 @@ #include "triton/Conversion/TritonGPUToLLVM/PatternTritonGPUOpToLLVM.h" #include "triton/Conversion/TritonGPUToLLVM/Utility.h" +#include "triton/../../backend/flagtree_backend_specialization/include/flagtree_spec.h" + using namespace mlir; using namespace mlir::triton; diff --git a/third_party/iluvatar/include/triton/Conversion/TritonGPUToLLVM/TargetInfoBase.h b/third_party/iluvatar/include/triton/Conversion/TritonGPUToLLVM/TargetInfoBase.h index 6702371fe..1da64cb8e 100644 --- a/third_party/iluvatar/include/triton/Conversion/TritonGPUToLLVM/TargetInfoBase.h +++ b/third_party/iluvatar/include/triton/Conversion/TritonGPUToLLVM/TargetInfoBase.h @@ -3,6 +3,8 @@ #include "triton/Conversion/MLIRTypes.h" +#include "triton/../../backend/flagtree_backend_specialization/include/flagtree_spec.h" + namespace mlir::triton { class TargetInfoBase { public: