tvm
Loading...
Searching...
No Matches
schedule.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 */
19#ifndef TVM_S_TIR_SCHEDULE_SCHEDULE_H_
20#define TVM_S_TIR_SCHEDULE_SCHEDULE_H_
21
22#include <tvm/ir/prim/expr.h>
26#include <tvm/tirx/index_map.h>
27
28namespace tvm {
29namespace s_tir {
30using namespace tvm::prim;
31using namespace tvm::tirx;
32
36 kDetail = 0,
38 kFast = 1,
40 kNone = 2,
41};
42
46 kRead = 0,
48 kWrite = 1,
49};
50
51/**************** Random variable: SBlockRV ****************/
52
54class SBlockRVNode : public ffi::Object {
55 public:
56 static void RegisterReflection() {
57 namespace refl = tvm::ffi::reflection;
58 refl::ObjectDef<SBlockRVNode>();
59 }
60 TVM_FFI_DECLARE_OBJECT_INFO_FINAL("s_tir.SBlockRV", SBlockRVNode, ffi::Object);
61};
62
67class SBlockRV : public ffi::ObjectRef {
68 public:
72};
73
74/**************** Random variable: LoopRV ****************/
75
77class LoopRVNode : public ffi::Object {
78 public:
79 static void RegisterReflection() {
80 namespace refl = tvm::ffi::reflection;
81 refl::ObjectDef<LoopRVNode>();
82 }
83 TVM_FFI_DECLARE_OBJECT_INFO_FINAL("s_tir.LoopRV", LoopRVNode, ffi::Object);
84};
85
90class LoopRV : public ffi::ObjectRef {
91 public:
95};
96
97/**************** Random variable: ExprRV ****************/
98
101
103
104/**************** The Schedule class ****************/
105
106class Schedule;
107
109class ScheduleNode : public ffi::Object {
110 friend class Schedule;
111
112 public:
113 virtual ~ScheduleNode() = default;
114
115 static constexpr const bool _type_mutable = true;
116 TVM_FFI_DECLARE_OBJECT_INFO_FINAL("s_tir.Schedule", ScheduleNode, ffi::Object);
117
118 public:
120 virtual IRModule mod() const { return state()->mod; }
122 virtual ScheduleState state() const = 0;
124 virtual ffi::Optional<Trace> trace() const = 0;
126 virtual ffi::Optional<GlobalVar> func_working_on() const = 0;
141 virtual void WorkOn(const ffi::String& func_name) = 0;
150 virtual Schedule Copy() = 0;
158
159 public:
160 /******** Lookup/Remove random variables ********/
166 virtual SBlock Get(const SBlockRV& block_rv) const = 0;
172 virtual For Get(const LoopRV& loop_rv) const = 0;
178 virtual PrimExpr Get(const ExprRV& expr_rv) const = 0;
184 virtual StmtSRef GetSRef(const SBlockRV& block_rv) const = 0;
190 virtual StmtSRef GetSRef(const LoopRV& loop_rv) const = 0;
196 virtual bool HasBlock(const SBlockRV& block_rv) const = 0;
202 virtual StmtSRef GetSRef(const StmtNode* stmt) const;
208 StmtSRef GetSRef(const Stmt& stmt) const { return this->GetSRef(stmt.get()); }
213 virtual void RemoveRV(const SBlockRV& block_rv) = 0;
218 virtual void RemoveRV(const LoopRV& loop_rv) = 0;
223 virtual void RemoveRV(const ExprRV& expr_rv) = 0;
224
225 public:
226 /******** Schedule: Sampling ********/
234 virtual ExprRV SampleCategorical(const ffi::Array<int64_t>& candidates,
235 const ffi::Array<FloatImm>& probs,
236 ffi::Optional<int64_t> decision = std::nullopt) = 0;
245 virtual ffi::Array<ExprRV> SamplePerfectTile(
246 const LoopRV& loop_rv, int n, int max_innermost_factor,
247 ffi::Optional<ffi::Array<int64_t>> decision = std::nullopt) = 0;
263 virtual ffi::Array<ExprRV> SamplePartitionedTile(
264 const LoopRV& loop_rv, int n, int partition_pos, int innerpart_factor,
265 ffi::Optional<ffi::Array<int64_t>> decision = std::nullopt) = 0;
273 ffi::Optional<int64_t> decision = std::nullopt) = 0;
274
275 /******** Schedule: Get blocks & loops ********/
290 virtual SBlockRV GetSBlock(const ffi::String& name,
291 const ffi::Optional<ffi::String>& func_name = std::nullopt) = 0;
297 virtual ffi::Array<LoopRV> GetLoops(const SBlockRV& block_rv) = 0;
303 virtual ffi::Array<SBlockRV> GetChildBlocks(const SBlockRV& block_rv) = 0;
309 virtual ffi::Array<SBlockRV> GetChildBlocks(const LoopRV& loop_rv) = 0;
316 virtual ffi::Array<SBlockRV> GetProducers(const SBlockRV& block_rv) = 0;
323 virtual ffi::Array<SBlockRV> GetConsumers(const SBlockRV& block_rv) = 0;
332 virtual ffi::Array<SBlockRV> GetOutputBlocks(const SBlockRV& scope_block_rv) = 0;
333 /******** Schedule: Transform loops ********/
343 virtual LoopRV Merge(const ffi::Array<LoopRV>& loop_rvs) = 0;
354 virtual LoopRV Fuse(const ffi::Array<LoopRV>& loop_rvs, bool preserve_unit_iters = true) = 0;
367 virtual ffi::Array<LoopRV> Split(const LoopRV& loop_rv,
368 const ffi::Array<ffi::Optional<ExprRV>>& factors,
369 bool preserve_unit_iters = true,
370 bool disable_predication = false) = 0;
380 virtual ffi::Array<LoopRV> LoopPartition(const LoopRV& loop_rv,
381 const ffi::Array<ffi::Optional<ExprRV>>& factors,
382 bool preserve_unit_iters = true) = 0;
395 virtual void Reorder(const ffi::Array<LoopRV>& ordered_loop_rvs) = 0;
402 const ffi::Array<int64_t> new_order) = 0;
408 virtual LoopRV AddUnitLoop(const SBlockRV& block_rv) = 0;
414 virtual LoopRV AddUnitLoop(const LoopRV& loop_rv) = 0;
415 /******** Schedule: Manipulate ForKind ********/
425 virtual void Parallel(const LoopRV& loop_rv) = 0;
435 virtual void Vectorize(const LoopRV& loop_rv) = 0;
447 virtual void Bind(const LoopRV& loop_rv, const ffi::String& thread_axis) = 0;
452 virtual void Unroll(const LoopRV& loop_rv) = 0;
453 /******** Schedule: Insert cache stages ********/
465 const ffi::String& storage_scope,
466 const ffi::Array<SBlockRV> consumer_blocks = {}) = 0;
478 const ffi::String& storage_scope,
479 const ffi::Array<SBlockRV> consumer_blocks = {}) = 0;
493 const ffi::String& storage_scope,
494 const IndexMap& index_map) = 0;
508 const ffi::String& storage_scope,
509 const IndexMap& index_map) = 0;
518 virtual ffi::Array<SBlockRV> CacheInplace(const SBlockRV& block_rv, int read_buffer_index,
519 const ffi::String& storage_scope) = 0;
528 virtual ffi::Array<SBlockRV> CacheIndex(const SBlockRV& block_rv,
529 const ffi::String& storage_scope, int cse_thresh) = 0;
543 /******** Schedule: Data movement ********/
545 const ffi::String& storage_scope) = 0;
547 const ffi::String& storage_scope) = 0;
548 /******** Schedule: Compute location ********/
569 virtual void ComputeAt(const SBlockRV& block_rv, const LoopRV& loop_rv, bool preserve_unit_loops,
570 int index = -1) = 0;
590 virtual void ReverseComputeAt(const SBlockRV& block_rv, const LoopRV& loop_rv,
591 bool preserve_unit_loops, int index = -1) = 0;
602 virtual void ComputeInline(const SBlockRV& block) = 0;
614 virtual void ReverseComputeInline(const SBlockRV& block) = 0;
621 const SBlockRV& epilogue_block) = 0;
622 /******** Schedule: Reduction ********/
656 virtual SBlockRV RFactor(const LoopRV& loop_rv, int factor_axis) = 0;
657 /******** Schedule: SBlock annotation ********/
670 virtual void StorageAlign(const SBlockRV& block_rv, int buffer_index, int axis, int factor,
671 int offset) = 0;
679 virtual void SetScope(const SBlockRV& block_rv, int buffer_index,
680 const ffi::String& storage_scope) = 0;
691 const ffi::String& dtype) = 0;
692 /******** Schedule: Blockize & Tensorize ********/
699 virtual SBlockRV Blockize(const LoopRV& loop_rv, bool preserve_unit_iters = true) = 0;
706 virtual SBlockRV Blockize(const ffi::Array<SBlockRV>& blocks,
707 bool preserve_unit_iters = true) = 0;
714 virtual void Tensorize(const LoopRV& loop_rv, const ffi::String& intrin,
715 bool preserve_unit_iters = true) = 0;
722 virtual void Tensorize(const SBlockRV& block_rv, const ffi::String& intrin,
723 bool preserve_unit_iters = true) = 0;
724
725 /******** Schedule: Annotation ********/
732 virtual void Annotate(const LoopRV& loop_rv, const ffi::String& ann_key, const Any& ann_val) = 0;
739 virtual void Annotate(const SBlockRV& block_rv, const ffi::String& ann_key,
740 const Any& ann_val) = 0;
746 virtual void Unannotate(const LoopRV& loop_rv, const ffi::String& ann_key) = 0;
752 virtual void Unannotate(const SBlockRV& block_rv, const ffi::String& ann_key) = 0;
753
754 /******** Schedule: Layout transformation ********/
788 const ffi::Optional<IndexMap>& pad_value = std::nullopt,
789 bool assume_injective_transform = false) = 0;
790
799 virtual void TransformBlockLayout(const SBlockRV& block_rv, const IndexMap& index_map) = 0;
800
801 /******** Schedule: Padding ********/
810
828 virtual void PadEinsum(const SBlockRV& block_rv, const ffi::Array<int64_t>& padding) = 0;
829
830 /******** Schedule: Buffer transformation ********/
845 virtual void RollingBuffer(const SBlockRV& block_rv, int write_buffer_index) = 0;
846
856 const IndexMap& index_map) = 0;
857
858 /******** Schedule: Misc ********/
860 virtual void EnterPostproc() = 0;
861
868 virtual void UnsafeHideBufferAccess(const SBlockRV& block_rv, const ffi::String& buf_type,
869 const ffi::Array<IntImm>& buf_index_array) = 0;
870};
871
887class Schedule : public ffi::ObjectRef {
888 public:
904 bool enable_check = true);
921 bool enable_check = true);
923};
924
925} // namespace s_tir
926} // namespace tvm
927
928#endif // TVM_S_TIR_SCHEDULE_SCHEDULE_H_
Base type of all the expressions.
Definition base_expr.h:300
Managed reference class to IRModuleNode.
Definition module.h:255
Typed reference/view over any Expr whose ExprNode::ty is PrimType.
Definition base_expr.h:401
RAII wrapper function to enter and exit a context object similar to python's with syntax.
Definition with_context.h:59
A random variable that evaluates to a TensorIR for loop.
Definition schedule.h:77
static void RegisterReflection()
Definition schedule.h:79
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("s_tir.LoopRV", LoopRVNode, ffi::Object)
Managed reference to LoopRVNode.
Definition schedule.h:90
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(LoopRV, ffi::ObjectRef, LoopRVNode)
LoopRV()
Constructor.
A random variable that evaluates to a TensorIR block.
Definition schedule.h:54
static void RegisterReflection()
Definition schedule.h:56
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("s_tir.SBlockRV", SBlockRVNode, ffi::Object)
Managed reference to SBlockRVNode.
Definition schedule.h:67
SBlockRV()
Constructor.
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(SBlockRV, ffi::ObjectRef, SBlockRVNode)
The user-facing schedule class.
Definition schedule.h:109
virtual ~ScheduleNode()=default
virtual ffi::Array< ExprRV > SamplePerfectTile(const LoopRV &loop_rv, int n, int max_innermost_factor, ffi::Optional< ffi::Array< int64_t > > decision=std::nullopt)=0
Sample the factors to perfect tile a specific loop.
virtual SBlockRV RFactor(const LoopRV &loop_rv, int factor_axis)=0
Factorize an associative reduction block by the specified loop.
virtual void Unroll(const LoopRV &loop_rv)=0
Unroll the input loop. It requires nothing.
virtual void Bind(const LoopRV &loop_rv, const ffi::String &thread_axis)=0
Bind the input loop to the given thread axis. It requires: 1) The scope block that the loop is in sho...
virtual ffi::Array< SBlockRV > CacheInplace(const SBlockRV &block_rv, int read_buffer_index, const ffi::String &storage_scope)=0
Create 2 blocks that read&write a buffer region into a read/write cache. It requires the target block...
virtual ScheduleState state() const =0
virtual void PadEinsum(const SBlockRV &block_rv, const ffi::Array< int64_t > &padding)=0
Pad the computation of Einsum.
virtual void ReverseComputeAt(const SBlockRV &block_rv, const LoopRV &loop_rv, bool preserve_unit_loops, int index=-1)=0
Move a consumer block under the specific loop, and regenerate the loops induced by the block so that ...
StmtSRef GetSRef(const Stmt &stmt) const
Get the block/loop sref corresponding to the specific statement.
Definition schedule.h:208
virtual ffi::Optional< GlobalVar > func_working_on() const =0
virtual void StorageAlign(const SBlockRV &block_rv, int buffer_index, int axis, int factor, int offset)=0
Set alignment requirement for specific dimension such that stride[axis] == k * factor + offset for so...
virtual void RemoveRV(const SBlockRV &block_rv)=0
Remove a block random variable from the symbol table.
virtual ffi::Optional< Trace > trace() const =0
virtual SBlockRV CacheRead(const SBlockRV &block_rv, int read_buffer_index, const ffi::String &storage_scope, const ffi::Array< SBlockRV > consumer_blocks={})=0
Create a block that reads a buffer region into a read cache. It requires: 1) There is at most one blo...
virtual SBlockRV Blockize(const LoopRV &loop_rv, bool preserve_unit_iters=true)=0
Convert the subtree rooted at a specific loop into a block.
virtual ffi::Array< LoopRV > LoopPartition(const LoopRV &loop_rv, const ffi::Array< ffi::Optional< ExprRV > > &factors, bool preserve_unit_iters=true)=0
Partition the loops into sequence of multiple loops 1) The loop can't have annotation or thread bindi...
virtual void UnsafeSetDType(const SBlockRV &block_rv, int buffer_index, const ffi::String &dtype)=0
Set the data type of a buffer, where the buffer is specified by a block and a write-index.
virtual void Parallel(const LoopRV &loop_rv)=0
Parallelize the input loop. It requires: 1) The scope block that the loop is in should have stage-pip...
virtual PrimExpr Get(const ExprRV &expr_rv) const =0
Get the expr corresponding to the specific random variable.
virtual ExprRV SampleCategorical(const ffi::Array< int64_t > &candidates, const ffi::Array< FloatImm > &probs, ffi::Optional< int64_t > decision=std::nullopt)=0
Sample an integer given the probability distribution.
virtual ffi::Array< SBlockRV > GetProducers(const SBlockRV &block_rv)=0
Get the producer of a specific block, under the same block scope.
virtual void Vectorize(const LoopRV &loop_rv)=0
Vectorize the input loop. It requires: 1) The scope block that the loop is in should have stage-pipel...
virtual SBlockRV ReIndex(const SBlockRV &block_rv, int buffer_index, BufferIndexType buffer_index_type)=0
Create a block that read/write a buffer region into a read/write cache with reindexing....
virtual StmtSRef GetSRef(const SBlockRV &block_rv) const =0
Get the block sref corresponding to the specific SBlockRV.
virtual ffi::Array< LoopRV > GetLoops(const SBlockRV &block_rv)=0
Get the parent loops of the block in its scope, from outer to inner.
virtual void AnnotateBufferAccess(const SBlockRV &block_rv, int buffer_index, BufferIndexType buffer_index_type, const IndexMap &index_map)=0
Annotate the buffer access of a block.
virtual void UnsafeHideBufferAccess(const SBlockRV &block_rv, const ffi::String &buf_type, const ffi::Array< IntImm > &buf_index_array)=0
Hide some buffer access in the given block.
virtual bool HasBlock(const SBlockRV &block_rv) const =0
Check the existance of a specific SBlockRV.
virtual void SetScope(const SBlockRV &block_rv, int buffer_index, const ffi::String &storage_scope)=0
Set the storage scope of a buffer, where the buffer is specified by a block and a write-index.
virtual void ReorderBlockIterVar(const SBlockRV &block_rv, const ffi::Array< int64_t > new_order)=0
Reorder the itervars inside a block.
virtual ffi::Array< SBlockRV > GetChildBlocks(const LoopRV &loop_rv)=0
Get the leaf blocks of under a specific loop.
virtual void RemoveRV(const ExprRV &expr_rv)=0
Remove an integer random variable from the symbol table.
virtual LoopRV AddUnitLoop(const SBlockRV &block_rv)=0
Create a new unit loop on top of the specific block.
virtual ffi::Array< ExprRV > SamplePartitionedTile(const LoopRV &loop_rv, int n, int partition_pos, int innerpart_factor, ffi::Optional< ffi::Array< int64_t > > decision=std::nullopt)=0
Sample the factors to a partitioned tile for a specific loop.
virtual void ReverseComputeInline(const SBlockRV &block)=0
Inline a block into its only producer. It requires: 1) The block is a complete non-root block,...
virtual void Seed(LinearCongruentialEngine::TRandState seed)=0
Seed the randomness.
virtual void ComputeInline(const SBlockRV &block)=0
Inline a block into its consumer(s). It requires: 1) The block is a complete non-root block,...
virtual void Unannotate(const LoopRV &loop_rv, const ffi::String &ann_key)=0
Unannotate a loop's annotation with key ann_key.
virtual LoopRV Fuse(const ffi::Array< LoopRV > &loop_rvs, bool preserve_unit_iters=true)=0
Fuse a list of consecutive loops into one. It requires: 1) The loops can't have annotations or thread...
virtual SBlockRV Blockize(const ffi::Array< SBlockRV > &blocks, bool preserve_unit_iters=true)=0
Convert specified blocks into a nested block.
virtual void ComputeAt(const SBlockRV &block_rv, const LoopRV &loop_rv, bool preserve_unit_loops, int index=-1)=0
Move a producer block under the specific loop, and regenerate the loops induced by the block so that ...
virtual IRModule mod() const
Get the IRModule associated with this schedule.
Definition schedule.h:120
virtual SBlockRV ReadAt(const LoopRV &loop_rv, const SBlockRV &block_rv, int read_buffer_index, const ffi::String &storage_scope)=0
virtual StmtSRef GetSRef(const StmtNode *stmt) const
Get the block/loop sref corresponding to the specific statement.
virtual ffi::Array< SBlockRV > GetOutputBlocks(const SBlockRV &scope_block_rv)=0
Get the list of output blocks within the given scope An output block is a block which has atleast one...
virtual void TransformBlockLayout(const SBlockRV &block_rv, const IndexMap &index_map)=0
Apply a transformation represented by IndexMap to block.
virtual ffi::Array< LoopRV > Split(const LoopRV &loop_rv, const ffi::Array< ffi::Optional< ExprRV > > &factors, bool preserve_unit_iters=true, bool disable_predication=false)=0
Split a loop into a list of consecutive loops. It requires: 1) The loop can't have annotation or thre...
virtual void EnterPostproc()=0
A no-op that marks the start of postprocessing phase of scheduling.
virtual LinearCongruentialEngine::TRandState ForkSeed()=0
Fork the random state.
virtual SBlockRV GetSBlock(const ffi::String &name, const ffi::Optional< ffi::String > &func_name=std::nullopt)=0
Retrieve a block in a specific function with its name.
virtual ffi::Array< SBlockRV > GetConsumers(const SBlockRV &block_rv)=0
Get the consumers of a specific block, under the same block scope.
virtual void WorkOn(const ffi::String &func_name)=0
Instruct the schedule to work on a function in the IRModule.
virtual SBlock Get(const SBlockRV &block_rv) const =0
Get the block corresponding to the specific SBlockRV.
static constexpr const bool _type_mutable
Definition schedule.h:115
virtual ffi::Array< SBlockRV > GetChildBlocks(const SBlockRV &block_rv)=0
Get the leaf blocks of a specific scope.
virtual Schedule Copy()=0
Returns a copy of the schedule, including both its state and its symbol table, guaranteeing that 1) S...
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("s_tir.Schedule", ScheduleNode, ffi::Object)
virtual void FuseReductionEpilogue(const SBlockRV &reduction_block, const SBlockRV &epilogue_block)=0
Fuse an epilogue block into a reduction block.
virtual void Reorder(const ffi::Array< LoopRV > &ordered_loop_rvs)=0
Reorder a list of loops. It doesn't require the loops to be consecutive. It requires: 1) The loops ar...
virtual void RemoveRV(const LoopRV &loop_rv)=0
Remove a loop random variable from the symbol table.
virtual void Tensorize(const LoopRV &loop_rv, const ffi::String &intrin, bool preserve_unit_iters=true)=0
Tensorize the computation enclosed by loop with the tensor intrin.
virtual SBlockRV DecomposePadding(const SBlockRV &block_rv, const LoopRV &loop_rv)=0
Decompose a padding block into a block filling const pad values and a block writing in-bound values.
virtual For Get(const LoopRV &loop_rv) const =0
Get the for loop corresponding to the specific LoopRV.
virtual SBlockRV ReindexCacheWrite(const SBlockRV &block_rv, int write_buffer_index, const ffi::String &storage_scope, const IndexMap &index_map)=0
Create a block that writes a buffer region into a write cache. It requires: 1) There is only one bloc...
virtual void Annotate(const LoopRV &loop_rv, const ffi::String &ann_key, const Any &ann_val)=0
Annotate a loop with a key value pair.
virtual SBlockRV WriteAt(const LoopRV &loop_rv, const SBlockRV &block_rv, int write_buffer_index, const ffi::String &storage_scope)=0
virtual LoopRV SampleComputeLocation(const SBlockRV &block_rv, ffi::Optional< int64_t > decision=std::nullopt)=0
Sample a compute-at location of the given block.
virtual void Unannotate(const SBlockRV &block_rv, const ffi::String &ann_key)=0
Unannotate a block's annotation with key ann_key.
virtual LoopRV AddUnitLoop(const LoopRV &loop_rv)=0
Create a new unit loop on top of the specific loop.
virtual SBlockRV CacheWrite(const SBlockRV &block_rv, int write_buffer_index, const ffi::String &storage_scope, const ffi::Array< SBlockRV > consumer_blocks={})=0
Create a block that writes a buffer region into a write cache. It requires: 1) There is only one bloc...
virtual void TransformLayout(const SBlockRV &block_rv, int buffer_index, BufferIndexType buffer_index_type, const IndexMap &index_map, const ffi::Optional< IndexMap > &pad_value=std::nullopt, bool assume_injective_transform=false)=0
Apply a transformation represented by IndexMap to buffer.
virtual void Annotate(const SBlockRV &block_rv, const ffi::String &ann_key, const Any &ann_val)=0
Annotate a block with a key value pair.
virtual LoopRV Merge(const ffi::Array< LoopRV > &loop_rvs)=0
Merge a list of loops into one. The loops under their LCA requires: 1) Under the same scope 2) Can't ...
virtual void RollingBuffer(const SBlockRV &block_rv, int write_buffer_index)=0
Compute the target buffer via rolling buffering.
virtual void Tensorize(const SBlockRV &block_rv, const ffi::String &intrin, bool preserve_unit_iters=true)=0
Tensorize the computation enclosed by loop with the tensor intrin.
virtual SBlockRV ReindexCacheRead(const SBlockRV &block_rv, int read_buffer_index, const ffi::String &storage_scope, const IndexMap &index_map)=0
Create a block that reads a buffer region into a read cache. It requires: 1) There is at most one blo...
virtual ffi::Array< SBlockRV > CacheIndex(const SBlockRV &block_rv, const ffi::String &storage_scope, int cse_thresh)=0
Create a block to cache precomputed index for later use. if there is no index computation,...
virtual SBlockRV DecomposeReduction(const SBlockRV &block_rv, const LoopRV &loop_rv)=0
Decompose a reduction block into two separate blocks. a) The init block, which is translated from the...
virtual StmtSRef GetSRef(const LoopRV &loop_rv) const =0
Get the loop sref corresponding to the specific LoopRV.
Managed reference to ScheduleStateNode.
Definition state.h:213
Managed reference to ScheduleNode.
Definition schedule.h:887
static Schedule Concrete(IRModule mod, LinearCongruentialEngine::TRandState seed, int debug_mask, ScheduleErrorRenderLevel error_render_level, bool enable_check=true)
Construct a concrete TensorIR schedule from an IRModule.
static Schedule Traced(IRModule mod, LinearCongruentialEngine::TRandState seed, int debug_mask, ScheduleErrorRenderLevel error_render_level, bool enable_check=true)
Construct a traced concrete TensorIR schedule from an IRModule.
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(Schedule, ffi::ObjectRef, ScheduleNode)
Managed reference to ForNode.
Definition stmt.h:644
Definition index_map.h:192
Managed reference to SBlockNode.
Definition stmt.h:881
Base node of all statements.
Definition stmt.h:43
Managed reference to StmtSRefNode.
Definition sblock_scope.h:107
Container of all statements.
Definition stmt.h:67
Defines a remapping of buffer indices.
TIR expressions.
Definition builtin.h:25
ScheduleErrorRenderLevel
The level of detailed error message rendering.
Definition schedule.h:34
@ kNone
No error message at all.
@ kDetail
Render a detailed error message.
@ kFast
Render the error in fast mode.
BufferIndexType
Type of buffer index.
Definition schedule.h:44
@ kRead
Index of a read buffer.
@ kWrite
Index of a written buffer.
Definition axis_group_graph.h:39
An object that builds and maintains block scope and StmtSref mapping for Dependence analysis.
Definition analyzer.h:40
Random number generator. It provides a generic interface consistent with std::uniform_random_bit_gene...
This file defines ScheduleState, the core data structure of TensorIR scheduling.