tvm
function.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 
24 #ifndef TVM_TIR_FUNCTION_H_
25 #define TVM_TIR_FUNCTION_H_
26 
27 #include <tvm/ffi/container/map.h>
28 #include <tvm/ffi/container/variant.h>
29 #include <tvm/ir/cow.h>
30 #include <tvm/ir/function.h>
31 #include <tvm/runtime/tensor.h>
32 #include <tvm/tirx/buffer.h>
33 #include <tvm/tirx/expr.h>
34 #include <tvm/tirx/stmt.h>
35 
36 #include <string>
37 
38 namespace tvm {
39 namespace tirx {
40 
49 class PrimFuncNode : public BaseFuncNode {
50  public:
52  ffi::Array<tirx::Var> params;
100  ffi::Map<tirx::Var, Buffer> buffer_map;
103 
104  static void RegisterReflection() {
105  namespace refl = tvm::ffi::reflection;
106  refl::ObjectDef<PrimFuncNode>()
107  .def_ro("params", &PrimFuncNode::params, refl::AttachFieldFlag::SEqHashDefRecursive())
108  .def_ro("ret_type", &PrimFuncNode::ret_type)
109  .def_ro("buffer_map", &PrimFuncNode::buffer_map)
110  .def_ro("body", &PrimFuncNode::body);
111  refl::TypeAttrDef<PrimFuncNode>()
112  .def("__s_equal__", &PrimFuncNode::SEqual)
113  .def("__s_hash__", &PrimFuncNode::SHash);
114  }
115 
116  bool SEqual(const PrimFuncNode* other,
117  ffi::TypedFunction<bool(AnyView, AnyView, bool, AnyView)> equal) const {
118  // `ty` is derived from the fields below. PrimFunc transformations update
119  // those source fields without maintaining this redundant cache eagerly.
120  // Remove this exception once all PrimFunc mutation paths recompute `ty`.
121  return equal(attrs, other->attrs, false, "attrs") &&
122  equal(params, other->params, true, "params") &&
123  equal(ret_type, other->ret_type, false, "ret_type") &&
124  equal(buffer_map, other->buffer_map, false, "buffer_map") &&
125  equal(body, other->body, false, "body");
126  }
127 
128  int64_t SHash(int64_t init_hash, ffi::TypedFunction<int64_t(AnyView, int64_t, bool)> hash) const {
129  int64_t hash_value = init_hash;
130  hash_value = hash(attrs, hash_value, false);
131  hash_value = hash(params, hash_value, true);
132  hash_value = hash(ret_type, hash_value, false);
133  hash_value = hash(buffer_map, hash_value, false);
134  hash_value = hash(body, hash_value, false);
135  return hash_value;
136  }
137 
146 
148 };
149 
154 class PrimFunc : public BaseFunc {
155  public:
174  TVM_DLL PrimFunc(ffi::Array<tirx::Var> params, Stmt body, Type ret_type = VoidType(),
175  ffi::Map<tirx::Var, Buffer> buffer_map = ffi::Map<tirx::Var, Buffer>(),
176  DictAttrs attrs = DictAttrs(), Span span = Span());
177 
180 };
181 
185 class TensorIntrinNode : public ffi::Object {
186  public:
191 
192  static void RegisterReflection() {
193  namespace refl = tvm::ffi::reflection;
194  refl::ObjectDef<TensorIntrinNode>()
195  .def_ro("desc", &TensorIntrinNode::desc)
196  .def_ro("impl", &TensorIntrinNode::impl);
197  }
198  TVM_FFI_DECLARE_OBJECT_INFO_FINAL("tirx.TensorIntrin", TensorIntrinNode, ffi::Object);
199 };
200 
204 class TensorIntrin : public ffi::ObjectRef {
205  public:
211  TVM_DLL explicit TensorIntrin(PrimFunc desc, PrimFunc impl);
212 
222  TVM_DLL static void Register(ffi::String name, TensorIntrin intrin, bool override = false);
223 
233  TVM_DLL static ffi::Optional<TensorIntrin> Get(ffi::String name, bool allow_missing = false);
234 
236 };
237 
276 PrimFunc Specialize(PrimFunc func, const ffi::Map<Var, ffi::Variant<Buffer, Expr>>& param_map);
277 
283 namespace attr {
284 
331 constexpr const char* kKernelLaunchParams = "tirx.kernel_launch_params";
332 
338 constexpr const char* kLaunchBoundsMinBlocksPerSM = "tirx.launch_bounds_min_blocks_per_sm";
339 
345 constexpr const char* kNoAlias = "tirx.noalias";
346 
355 constexpr const char* kIsEntryFunc = "tirx.is_entry_func";
356 
362 constexpr const char* kIsGlobalFunc = "tirx.is_global_func";
363 
369 constexpr const char* kIsHostFunc = "tirx.is_host_func";
370 
376 constexpr const char* kIsScheduled = "tirx.is_scheduled";
377 
378 } // namespace attr
379 } // namespace tirx
380 } // namespace tvm
381 #endif // TVM_TIR_FUNCTION_H_
Symbolic n-dimensional array, to represent a memory buffer.
Base node of all functions.
Definition: function.h:156
DictAttrs attrs
Additional attributes storing the meta-data.
Definition: function.h:159
Managed reference to BaseFuncNode.
Definition: function.h:250
Managed reference to DictAttrsNode.
Definition: attrs.h:102
Managed reference to FuncTypeNode.
Definition: type.h:168
Definition: source_map.h:111
Managed reference to TypeNode.
Definition: base_expr.h:77
static Type Missing()
Sentinel for a type that has not been populated yet.
Primitive functions that contains TIR statements.
Definition: function.h:49
ffi::Array< tirx::Var > params
Function parameters.
Definition: function.h:52
ffi::Map< tirx::Var, Buffer > buffer_map
Maps some parameters to specific Buffer data structures.
Definition: function.h:100
static void RegisterReflection()
Definition: function.h:104
int64_t SHash(int64_t init_hash, ffi::TypedFunction< int64_t(AnyView, int64_t, bool)> hash) const
Definition: function.h:128
FuncType func_type_annotation() const
Return the derived function annotation of this function.
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("tirx.PrimFunc", PrimFuncNode, BaseFuncNode)
tirx::Stmt body
The body of the function.
Definition: function.h:102
bool SEqual(const PrimFuncNode *other, ffi::TypedFunction< bool(AnyView, AnyView, bool, AnyView)> equal) const
Definition: function.h:116
Type ret_type
The return type of the function.
Definition: function.h:54
Managed reference to PrimFuncNode.
Definition: function.h:154
PrimFunc(ffi::Array< tirx::Var > params, Stmt body, Type ret_type=VoidType(), ffi::Map< tirx::Var, Buffer > buffer_map=ffi::Map< tirx::Var, Buffer >(), DictAttrs attrs=DictAttrs(), Span span=Span())
Constructor.
TVM_DEFINE_OBJECT_REF_COW_METHOD(PrimFuncNode)
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(PrimFunc, BaseFunc, PrimFuncNode)
Container of all statements.
Definition: stmt.h:64
Tensor intrinsics for tensorization.
Definition: function.h:185
PrimFunc desc
The function to describe the computation.
Definition: function.h:188
PrimFunc impl
The function of the implementation for the execution.
Definition: function.h:190
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("tirx.TensorIntrin", TensorIntrinNode, ffi::Object)
static void RegisterReflection()
Definition: function.h:192
Managed reference to TensorIntrinNode.
Definition: function.h:204
static void Register(ffi::String name, TensorIntrin intrin, bool override=false)
Create and register a TensorIntrin. After registration, the TensorIntrin can be looked up with its na...
TensorIntrin(PrimFunc desc, PrimFunc impl)
Constructor.
static ffi::Optional< TensorIntrin > Get(ffi::String name, bool allow_missing=false)
Look up TensorIntrin by name. Raises an exception if not found.
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(TensorIntrin, ffi::ObjectRef, TensorIntrinNode)
a named variable in TIR
Definition: var.h:68
Copy-on-write helper macro for IR ffi::ObjectRef types.
Function nodes.
constexpr const char * kIsHostFunc
Mark the function as run on the host, mutually exclusive with kTarget.
Definition: function.h:369
constexpr const char * kLaunchBoundsMinBlocksPerSM
CUDA launch bound minimum CTAs per SM.
Definition: function.h:338
constexpr const char * kIsEntryFunc
Mark the function as the entry function of the final generated runtime module.
Definition: function.h:355
constexpr const char * kIsGlobalFunc
Mark the function as the global function called from the host.
Definition: function.h:362
constexpr const char * kIsScheduled
Mark the function as scheduled, so the default schedule will pass will skip it.
Definition: function.h:376
constexpr const char * kNoAlias
Whether to set noalias rule on the function arguments.
Definition: function.h:345
constexpr const char * kKernelLaunchParams
List of thread IterVar that a DeviceLaunch function corresponds to.
Definition: function.h:331
PrimFunc Specialize(PrimFunc func, const ffi::Map< Var, ffi::Variant< Buffer, Expr >> &param_map)
Specialize parameters of PrimFunc.
An object that builds and maintains block scope and StmtSref mapping for Dependence analysis.
Definition: analyzer.h:40
PrimExpr equal(PrimExpr a, PrimExpr b, Span span=Span())
equal
Type VoidType()
Definition: type.h:129
A device-independent managed Tensor abstraction.
TIR expressions.
TIR statements.