tvm
Loading...
Searching...
No Matches
state.h
Go to the documentation of this file.
1/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
23#ifndef TVM_S_TIR_SCHEDULE_STATE_H_
24#define TVM_S_TIR_SCHEDULE_STATE_H_
25
26#include <tvm/ffi/reflection/registry.h>
27#include <tvm/ir/module.h>
28#include <tvm/ir/prim/expr.h>
30#include <tvm/s_tir/stmt.h>
31#include <tvm/tirx/function.h>
32
33#include <unordered_map>
34#include <utility>
35
36namespace tvm {
37namespace s_tir {
38using namespace tvm::tirx;
39
47struct SBlockInfo {
49 SBlockScope scope{ffi::UnsafeInit()};
50 // The properties below are information about the current block realization under its parent scope
52 bool affine_binding{false};
57 bool region_cover{false};
67 bool stage_pipeline{false};
68
69 SBlockInfo() = default;
70
71 explicit SBlockInfo(SBlockScope scope, bool affine_binding = false, bool region_cover = false,
72 bool stage_pipeline = false)
73 : scope(std::move(scope)), //
77};
78
89
102class ScheduleStateObj : public ffi::Object {
103 public:
111 std::unordered_map<StmtSRef, SBlockInfo, ffi::ObjectPtrHash, ffi::ObjectPtrEqual> block_info;
113 std::unordered_map<const StmtNode*, StmtSRef> stmt2ref;
124
125 static void RegisterReflection() {
126 namespace refl = tvm::ffi::reflection;
127 refl::ObjectDef<ScheduleStateObj>()
128 .def_ro("mod", &ScheduleStateObj::mod)
129 .def_ro("debug_mask", &ScheduleStateObj::debug_mask)
130 .def_ro("enable_check", &ScheduleStateObj::enable_check);
131 }
132
152 TVM_DLL void Replace(const tirx::StmtSRef& src_sref, const Stmt& tgt_stmt,
153 const ffi::Map<SBlock, SBlock>& block_sref_reuse);
160 TVM_DLL void DebugVerify() const;
161
162 static constexpr const bool _type_mutable = true;
163 TVM_FFI_DECLARE_OBJECT_INFO_FINAL("s_tir.ScheduleState", ScheduleStateObj, ffi::Object);
164
165 /******** Property of blocks ********/
167 TVM_DLL SBlockInfo GetSBlockInfo(const StmtSRef& block_sref) const;
173 TVM_DLL void UpdateScopeSBlockInfo(const Stmt& stmt);
179 SBlockScope GetSBlockScope(const StmtSRef& scope_root) const {
180 return GetSBlockInfo(scope_root).scope;
181 }
187 bool IsAffineBlockBinding(const StmtSRef& block_sref) const {
188 return GetSBlockInfo(block_sref).affine_binding;
189 }
196 bool IsRegionCoveredConsumer(const StmtSRef& consumer_block_sref) const {
197 return GetSBlockInfo(consumer_block_sref).region_cover;
198 }
204 bool IsStagePipeline(const StmtSRef& scope_root) const {
205 return GetSBlockInfo(scope_root).stage_pipeline;
206 }
207};
208
213class ScheduleState : public ffi::ObjectRef {
214 public:
215 explicit ScheduleState(ffi::UnsafeInit tag, ffi::ObjectPtr<ScheduleStateObj> data)
216 : ffi::ObjectRef(tag) {
217 data_ = std::move(data);
218 }
219
227 TVM_DLL explicit ScheduleState(IRModule mod, int debug_mask = 0, bool enable_check = true);
228
230};
231
232} // namespace s_tir
233} // namespace tvm
234
235#endif // TVM_S_TIR_SCHEDULE_STATE_H_
Managed reference class to IRModuleNode.
Definition module.h:255
Container of all statements.
Definition stmt.h:62
The state of scheduling, which exposes a Replace method as the primary interface for all the scheduli...
Definition state.h:102
bool IsRegionCoveredConsumer(const StmtSRef &consumer_block_sref) const
Check a cached flag indicating if each of the specific consumer block's read region is fully produced...
Definition state.h:196
void UpdateScopeSBlockInfo(const Stmt &stmt)
Recalculate the SBlockInfo recursively under stmt. If stmt is a SBlock itself, we will not reset its ...
bool enable_check
Whether to enable prequisite checks for schedule primitives.
Definition state.h:123
bool IsAffineBlockBinding(const StmtSRef &block_sref) const
Check a cached flag indicating if the specific block has quasi-affine bindings.
Definition state.h:187
std::unordered_map< const StmtNode *, StmtSRef > stmt2ref
The reverse mapping from block/for-loop to their corresponding srefs.
Definition state.h:113
std::unordered_map< StmtSRef, SBlockInfo, ffi::ObjectPtrHash, ffi::ObjectPtrEqual > block_info
Mapping from a block sref to its correpsonding SBlockInfo, tracking the dependency inside the block s...
Definition state.h:111
static void RegisterReflection()
Definition state.h:125
int debug_mask
Do extra correctness checking after the class creation and each time after calling the Replace method...
Definition state.h:119
SBlockInfo GetSBlockInfo(const StmtSRef &block_sref) const
Returns the SBlockInfo correpsonding to the block sref.
IRModule mod
The AST of the module being scheduled.
Definition state.h:105
void DebugVerify() const
Trigger the verification according to the debug_mask bitmask. 1) If the bitmask kVerifySRefTree is on...
static constexpr const bool _type_mutable
Definition state.h:162
void Replace(const tirx::StmtSRef &src_sref, const Stmt &tgt_stmt, const ffi::Map< SBlock, SBlock > &block_sref_reuse)
Replace the part of the AST, as being pointed to by src_sref, with a specific statement tgt_stmt,...
SBlockScope GetSBlockScope(const StmtSRef &scope_root) const
Get the SBlockScope correpsonding to the sref of scope root block.
Definition state.h:179
bool IsStagePipeline(const StmtSRef &scope_root) const
Check a cached flag indicating if a block scope is an equivalence of a stage pipeline.
Definition state.h:204
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("s_tir.ScheduleState", ScheduleStateObj, ffi::Object)
Managed reference to ScheduleStateObj.
Definition state.h:213
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(ScheduleState, ffi::ObjectRef, ScheduleStateObj)
ScheduleState(ffi::UnsafeInit tag, ffi::ObjectPtr< ScheduleStateObj > data)
Definition state.h:215
ScheduleState(IRModule mod, int debug_mask=0, bool enable_check=true)
Construct a schedule state from an IRModule.
Managed reference to SBlockScopeObj.
Definition sblock_scope.h:308
Managed reference to StmtSRefObj.
Definition sblock_scope.h:108
TIR expressions.
IRModule that holds the functions and type definitions.
ScheduleDebugMask
The bitmask of the debug flag in the ScheduleStateObj.
Definition state.h:83
@ kVerifySRefTree
Verify the correctness of the sref tree.
Definition state.h:85
@ kVerifyCachedFlags
Verify the correctness of affine_binding, region_cover and stage_pipeline.
Definition state.h:87
Backend-defined execution hierarchy nodes shared by layouts and tile calls.
Definition axis_group_graph.h:41
An object that builds and maintains block scope and StmtSref mapping for Dependence analysis.
Definition attr.h:23
S-TIR (Schedulable TIR) statements and attributes.
Definition of two pillar data structure for TensorIR scheduling: StmtSRef, SBlockScope.
The information about a TensorIR block, it contains two categories of information 1) Info on the bloc...
Definition state.h:47
bool region_cover
Property of a block, indicating each of the block's read regions is fully produced by its producers.
Definition state.h:57
SBlockInfo(SBlockScope scope, bool affine_binding=false, bool region_cover=false, bool stage_pipeline=false)
Definition state.h:71
SBlockScope scope
Property of a block scope rooted at the block, storing dependencies in the scope.
Definition state.h:49
bool affine_binding
Property of a block, indicating the block realization binding is quasi-affine.
Definition state.h:52
bool stage_pipeline
This property indicates that the block scope (rooted at its corresponding block) is equivalent to of ...
Definition state.h:67
TIR Function.