24 #ifndef TVM_TE_OPERATION_H_
25 #define TVM_TE_OPERATION_H_
35 #include <unordered_map>
50 std::vector<std::vector<IntSet>>
data;
98 const std::unordered_map<Tensor, Tensor>& rmap)
const = 0;
109 const std::unordered_map<const VarNode*, IntSet>& dom_map,
110 std::unordered_map<Tensor, TensorDom>* out_dom_map)
const = 0;
120 const std::unordered_map<Tensor, TensorDom>& tensor_dom,
121 std::unordered_map<IterVar, Range>* out_dom_map)
const = 0;
132 const std::unordered_map<IterVar, Range>& realize_map,
const Stmt& body,
133 String storage_scope =
"")
const = 0;
142 bool debug_keep_trivial_loop)
const = 0;
144 static constexpr
const char* _type_key =
"Operation";
165 const std::unordered_map<
Tensor,
Tensor>& rmap) const final;
170 std::unordered_map<
IterVar,
Range>* out_dom_map) const final;
172 const
Stmt& body,
String storage_scope = "") const final;
174 bool debug_keep_trivial_loop) const final;
177 v->Visit(
"name", &
name);
178 v->Visit(
"tag", &
tag);
179 v->Visit(
"attrs", &
attrs);
180 v->Visit(
"shape", &
shape);
181 v->Visit(
"dtype", &
dtype);
184 static constexpr
const char*
_type_key =
"PlaceholderOp";
214 std::unordered_map<
IterVar,
Range>* out_dom_map) const final;
216 const
Stmt& body,
String storage_scope = "") const final;
217 virtual
size_t num_schedulable_dims() const = 0;
219 static constexpr const
char* _type_key = "BaseComputeOp";
237 const std::unordered_map<
Tensor,
Tensor>& rmap) const final;
238 void PropBoundToInputs(const
Operation& self, arith::Analyzer* analyzer,
242 bool debug_keep_trivial_loop) const final;
243 size_t num_schedulable_dims() const final;
246 v->Visit(
"name", &name);
247 v->Visit(
"tag", &tag);
248 v->Visit(
"attrs", &attrs);
249 v->Visit(
"axis", &axis);
251 v->Visit(
"body", &body);
254 static constexpr
const char* _type_key =
"ComputeOp";
293 const std::unordered_map<
Tensor,
Tensor>& rmap) const final;
294 void PropBoundToInputs(const
Operation& self, arith::Analyzer* analyzer,
298 bool debug_keep_trivial_loop) const final;
299 size_t num_schedulable_dims() const final;
302 v->Visit(
"name", &name);
303 v->Visit(
"tag", &tag);
304 v->Visit(
"axis", &axis);
306 v->Visit(
"schedulable_ndim", &schedulable_ndim);
307 v->Visit(
"intrin", &intrin);
308 v->Visit(
"inputs", &inputs);
309 v->Visit(
"input_regions", &input_regions);
310 v->Visit(
"scalar_inputs", &scalar_inputs);
313 static constexpr
const char* _type_key =
"TensorComputeOp";
368 const std::unordered_map<
Tensor,
Tensor>& rmap) const final;
369 void PropBoundToInputs(const
Operation& self, arith::Analyzer* analyzer,
373 std::unordered_map<
IterVar,
Range>* out_dom_map) const final;
375 const
Stmt& body,
String storage_scope = "") const final;
377 bool debug_keep_trivial_loop) const final;
380 v->Visit(
"name", &name);
381 v->Visit(
"tag", &tag);
382 v->Visit(
"attrs", &attrs);
383 v->Visit(
"scan_axis", &scan_axis);
384 v->Visit(
"init", &init);
385 v->Visit(
"update", &update);
386 v->Visit(
"state_placeholder", &state_placeholder);
387 v->Visit(
"inputs", &inputs);
388 v->Visit(
"spatial_axis_", &spatial_axis_);
391 static constexpr
const char* _type_key =
"ScanOp";
431 const std::unordered_map<
Tensor,
Tensor>& rmap) const final;
432 void PropBoundToInputs(const
Operation& self, arith::Analyzer* analyzer,
436 std::unordered_map<
IterVar,
Range>* out_dom_map) const final;
438 const
Stmt& body,
String storage_scope = "") const final;
440 bool debug_keep_trivial_loop) const final;
443 v->Visit(
"name", &name);
444 v->Visit(
"tag", &tag);
445 v->Visit(
"attrs", &attrs);
446 v->Visit(
"inputs", &inputs);
447 v->Visit(
"input_placeholders", &input_placeholders);
448 v->Visit(
"output_placeholders", &output_placeholders);
449 v->Visit(
"body", &body);
452 static constexpr
const char* _type_key =
"ExternOp";
496 const std::unordered_map<
Tensor,
Tensor>& rmap) const final;
497 void PropBoundToInputs(const
Operation& self, arith::Analyzer* analyzer,
501 std::unordered_map<
IterVar,
Range>* out_dom_map) const final;
503 const
Stmt& body,
String storage_scope = "") const final;
505 bool debug_keep_trivial_loop) const final;
508 v->Visit(
"name", &name);
509 v->Visit(
"tag", &tag);
510 v->Visit(
"attrs", &attrs);
511 v->Visit(
"inputs", &inputs);
512 v->Visit(
"outputs", &outputs);
513 v->Visit(
"axis", &axis);
514 v->Visit(
"body", &body);
517 static constexpr
const char* _type_key =
"HybridOp";
569 std::string name =
"placeholder");
593 std::string name =
"tensor", std::string tag =
"",
610 std::string name =
"scan", std::string tag =
"",
615 std::string name =
"tensor", std::string tag =
"",
621 std::string name =
"tensor", std::string tag =
"",
627 std::string name =
"tensor", std::string tag =
"",
633 std::string name =
"tensor", std::string tag =
"",
Algebra expression simplifications.
Symbolic n-dimensional array, to represent a memory buffer.
Visitor class to get the attributes of an AST/IR node. The content is going to be called for each fie...
Definition: reflection.h:52
Reference to PrimExprNode.
Definition: expr.h:115
Range container
Definition: expr.h:725
Analyzer that contains bunch of sub-analyzers.
Definition: analyzer.h:629
Managed reference to IntSetNode.
Definition: int_set.h:68
Array, container representing a contiguous sequence of ObjectRefs.
Definition: array.h:289
Runtime primitive data type.
Definition: data_type.h:43
static DataType Float(int bits, int lanes=1)
Construct an float type.
Definition: data_type.h:236
static DataType Int(int bits, int lanes=1)
Construct an int type.
Definition: data_type.h:219
Map container of NodeRef->NodeRef in DSL graph. Map implements copy on write semantics,...
Definition: map.h:1271
base class of all object containers.
Definition: object.h:171
Reference to string objects.
Definition: string.h:98
A Compute op that compute a tensor on certain domain. This is the base class for ComputeOp (operating...
Definition: operation.h:204
Array< IterVar > axis
IterVar on each axis.
Definition: operation.h:207
Array< IterVar > root_iter_vars() const final
Array< IterVar > reduce_axis
IterVar on each reduction axis, if the body is a Reduce.
Definition: operation.h:209
A Compute op that compute a tensor on certain domain.
Definition: operation.h:226
Array< PrimExpr > body
the compute expression
Definition: operation.h:229
TVM_DECLARE_FINAL_OBJECT_INFO(ComputeOpNode, BaseComputeOpNode)
ComputeOpNode()
constructor
Definition: operation.h:231
int num_outputs() const final
Managed reference to ComputeOpNode.
Definition: operation.h:262
TVM_DEFINE_OBJECT_REF_METHODS(ComputeOp, Operation, ComputeOpNode)
ComputeOp(std::string name, std::string tag, Map< String, ObjectRef > attrs, Array< IterVar > axis, Array< PrimExpr > body)
TVM_DEFINE_OBJECT_REF_COW_METHOD(ComputeOpNode)
External computation that cannot be splitted.
Definition: operation.h:411
Array< Buffer > output_placeholders
Symbolic placeholder representation of outputs.
Definition: operation.h:418
Array< Tensor > inputs
The input tensors.
Definition: operation.h:414
int num_outputs() const final
TVM_DECLARE_FINAL_OBJECT_INFO(ExternOpNode, OperationNode)
Stmt body
the statement that generates the computation.
Definition: operation.h:420
ExternOpNode()
constructor
Definition: operation.h:423
Array< Buffer > input_placeholders
Symbolic placeholder representation of inputs.
Definition: operation.h:416
Managed reference to ExternOpNode.
Definition: operation.h:460
TVM_DEFINE_OBJECT_REF_METHODS(ExternOp, Operation, ExternOpNode)
ExternOp(std::string name, std::string tag, Map< String, ObjectRef > attrs, Array< Tensor > inputs, Array< Buffer > input_placeholders, Array< Buffer > output_placeholders, Stmt body)
A computation operator that generated by hybrid script.
Definition: operation.h:472
HybridOpNode()
constructor
Definition: operation.h:488
Array< Tensor > inputs
The input tensors.
Definition: operation.h:475
Array< Tensor > outputs
Symbolic placeholder representation of outputs.
Definition: operation.h:477
Stmt body
the statement that generates the computation. This is slightly different from the body in ExternOpNod...
Definition: operation.h:485
int num_outputs() const final
TVM_DECLARE_FINAL_OBJECT_INFO(HybridOpNode, OperationNode)
Array< IterVar > axis
The axis of iterations.
Definition: operation.h:479
Managed reference to HybridOpNode.
Definition: operation.h:525
TVM_DEFINE_OBJECT_REF_METHODS(HybridOp, Operation, HybridOpNode)
HybridOp(std::string name, std::string tag, Map< String, ObjectRef > attrs, Array< Tensor > inputs, Array< Tensor > outputs, Stmt body)
Base class of all operation nodes.
Definition: operation.h:56
virtual ~OperationNode()
Definition: operation.h:65
virtual Stmt BuildProvide(const Stage &stage, const std::unordered_map< IterVar, Range > &dom_map, bool debug_keep_trivial_loop) const =0
Build the statement that provide the output tensors.
virtual void GatherBound(const Operation &self, const std::unordered_map< Tensor, TensorDom > &tensor_dom, std::unordered_map< IterVar, Range > *out_dom_map) const =0
Gather the bound from output tensor. Set the range of each root_iter_vars in the op to out_dom_map.
TVM_DECLARE_BASE_OBJECT_INFO(OperationNode, Object)
virtual void PropBoundToInputs(const Operation &self, arith::Analyzer *analyzer, const std::unordered_map< const VarNode *, IntSet > &dom_map, std::unordered_map< Tensor, TensorDom > *out_dom_map) const =0
Propagate the bounds to inputs.
Map< String, ObjectRef > attrs
additional attributes of the operation
Definition: operation.h:63
virtual DataType output_dtype(size_t i) const =0
Get data type. i-th output tensor.
virtual Array< PrimExpr > output_shape(size_t i) const =0
Get shape of i-th output tensor.
virtual int num_outputs() const =0
virtual Array< IterVar > root_iter_vars() const =0
virtual Array< Tensor > InputTensors() const =0
List all the input Tensors.
virtual Operation ReplaceInputs(const Operation &self, const std::unordered_map< Tensor, Tensor > &rmap) const =0
Replace the input of the operation by pattern specified by rmap.
virtual Stmt BuildRealize(const Stage &stage, const std::unordered_map< IterVar, Range > &realize_map, const Stmt &body, String storage_scope="") const =0
Build the Realize statement that realizes the op's output tensors.
std::string name
optional name of the operation
Definition: operation.h:59
std::string tag
optional tag of the operation
Definition: operation.h:61
Operation that produces tensors.
Definition: tensor.h:47
const OperationNode * operator->() const
access the internal node container
Definition: operation.h:640
A placeholder op represents an input placeholder.
Definition: operation.h:152
Array< PrimExpr > output_shape(size_t i) const final
Get shape of i-th output tensor.
Array< PrimExpr > shape
The shape of the input.
Definition: operation.h:155
Stmt BuildProvide(const Stage &stage, const std::unordered_map< IterVar, Range > &dom_map, bool debug_keep_trivial_loop) const final
Build the statement that provide the output tensors.
TVM_DECLARE_BASE_OBJECT_INFO(PlaceholderOpNode, OperationNode)
DataType dtype
The data type of the input.
Definition: operation.h:157
static constexpr const char * _type_key
Definition: operation.h:184
Array< Tensor > InputTensors() const final
List all the input Tensors.
void VisitAttrs(AttrVisitor *v)
Definition: operation.h:176
int num_outputs() const final
DataType output_dtype(size_t i) const final
Get data type. i-th output tensor.
Operation ReplaceInputs(const Operation &self, const std::unordered_map< Tensor, Tensor > &rmap) const final
Replace the input of the operation by pattern specified by rmap.
Stmt BuildRealize(const Stage &stage, const std::unordered_map< IterVar, Range > &realize_map, const Stmt &body, String storage_scope="") const final
Build the Realize statement that realizes the op's output tensors.
void PropBoundToInputs(const Operation &self, arith::Analyzer *analyzer, const std::unordered_map< const VarNode *, IntSet > &dom_map, std::unordered_map< Tensor, TensorDom > *out_dom_map) const final
Propagate the bounds to inputs.
void GatherBound(const Operation &self, const std::unordered_map< Tensor, TensorDom > &tensor_dom, std::unordered_map< IterVar, Range > *out_dom_map) const final
Gather the bound from output tensor. Set the range of each root_iter_vars in the op to out_dom_map.
Array< IterVar > root_iter_vars() const final
Managed reference to PlaceholderOpNode.
Definition: operation.h:192
TVM_DEFINE_OBJECT_REF_METHODS(PlaceholderOp, Operation, PlaceholderOpNode)
PlaceholderOp(std::string name, Array< PrimExpr > shape, DataType dtype)
Symbolic scan.
Definition: operation.h:334
ScanOpNode()
constructor
Definition: operation.h:360
int num_outputs() const final
TVM_DECLARE_FINAL_OBJECT_INFO(ScanOpNode, OperationNode)
Array< Tensor > state_placeholder
The placeholder to refer as states in update.
Definition: operation.h:343
Array< Tensor > init
the initialization tensors
Definition: operation.h:339
IterVar scan_axis
IterVar to scan over.
Definition: operation.h:337
Array< IterVar > spatial_axis_
Spatial axis to indicate spatial dimension of each output. They corresponds to flattened spatial axis...
Definition: operation.h:358
Array< Tensor > inputs
the inputs to the scan, these are optionally provided But they can be helpful to provide hints to spe...
Definition: operation.h:348
Array< Tensor > update
the update function represented by tensor
Definition: operation.h:341
Managed reference to ScanOpNode.
Definition: operation.h:399
TVM_DEFINE_OBJECT_REF_METHODS(ScanOp, Operation, ScanOpNode)
ScanOp(std::string name, std::string tag, Map< String, ObjectRef > attrs, IterVar axis, Array< Tensor > init, Array< Tensor > update, Array< Tensor > state_placeholder, Array< Tensor > input)
Stage, contains scheduling for a stage of computation.
Definition: schedule.h:58
A TenorCompute op that compute a tensor with an tensor intrinsic.
Definition: operation.h:274
Array< Region > input_regions
region of input tensors
Definition: operation.h:283
TensorIntrin intrin
TensorIntrin used to compute.
Definition: operation.h:279
TensorComputeOpNode()
constructor
Definition: operation.h:287
TVM_DECLARE_FINAL_OBJECT_INFO(TensorComputeOpNode, BaseComputeOpNode)
Array< Tensor > inputs
input tensors of intrin
Definition: operation.h:281
Array< PrimExpr > scalar_inputs
scalar expression inputs
Definition: operation.h:285
int schedulable_ndim
number of axes that can be scheduled
Definition: operation.h:277
int num_outputs() const final
Managed reference to TensorComputeOpNode.
Definition: operation.h:321
TVM_DEFINE_OBJECT_REF_METHODS(TensorComputeOp, Operation, TensorComputeOpNode)
TensorComputeOp(std::string name, std::string tag, Array< IterVar > axis, Array< IterVar > reduce_axis, int schedulable_ndim, TensorIntrin intrin, Array< Tensor > tensors, Array< Region > regions, Array< PrimExpr > scalar_inputs)
Managed reference to TensorIntrinNode.
Definition: tensor_intrin.h:93
Tensor structure representing a possible input, or intermediate computation result.
Definition: tensor.h:102
Iteration Variable, represents an iteration over an integer interval.
Definition: var.h:315
Container of all statements.
Definition: stmt.h:59
A variable node in the IR.
Definition: var.h:48
a named variable in TIR
Definition: var.h:89
Tensor placeholder(Array< PrimExpr > shape, DataType dtype=DataType::Float(32), std::string name="placeholder")
create a place holder tensor.
Array< Tensor > scan(Array< Tensor > init, Array< Tensor > update, Array< Tensor > state_placeholder, Array< Tensor > inputs=Array< Tensor >(), std::string name="scan", std::string tag="", Map< String, ObjectRef > attrs={})
Construct new tensors by scan.
std::function< PrimExpr(const Array< Var > &i)> FCompute
The compute function to specify the input source of a Tensor.
Definition: operation.h:557
IterVar thread_axis(Range dom, std::string tag)
Create a new IterVar that represents an axis in thread.
IterVar reduce_axis(Range dom, std::string name="rv")
Create a new IterVar for reduction operations.
std::function< Array< PrimExpr >(const Array< Var > &i)> FBatchCompute
The compute function to specify the inputs source of Tensors.
Definition: operation.h:560
Var var(std::string name_hint, DataType t=DataType::Int(32))
Construct a new Var expression.
Tensor compute(Array< PrimExpr > shape, FCompute fcompute, std::string name="tensor", std::string tag="", Map< String, ObjectRef > attrs={})
Construct a new tensor by computing over shape, using the computation rule: result_tensor[axis] = fco...
Tensor shape(const Tensor &src, DataType dtype, const std::string name="T_shape", const std::string tag=kInjective)
Get the shape of input tensor.
Definition: transform.h:1913
runtime implementation for LibTorch/TorchScript.
Definition: analyzer.h:36
#define TVM_DECLARE_BASE_OBJECT_INFO(TypeName, ParentType)
helper macro to declare a base object type that can be inherited.
Definition: object.h:679
Temporary data structure to store union of bounds of each axis of Tensor.
Definition: operation.h:46
TensorDom(int ndim)
Definition: operation.h:48
std::vector< std::vector< IntSet > > data
The domain data.
Definition: operation.h:50
Common operators defined for Expr.