tvm
exec_builder.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 
23 #ifndef TVM_RELAX_EXEC_BUILDER_H_
24 #define TVM_RELAX_EXEC_BUILDER_H_
25 
26 #include <tvm/ffi/extra/structural_equal.h>
27 #include <tvm/ffi/extra/structural_hash.h>
28 #include <tvm/ffi/function.h>
29 #include <tvm/ffi/reflection/registry.h>
30 #include <tvm/ir/expr.h>
31 #include <tvm/ir/repr.h>
34 
35 #include <string>
36 #include <unordered_map>
37 #include <vector>
38 
39 namespace tvm {
40 namespace relax {
41 
42 namespace vm = tvm::runtime::vm;
43 
44 class ExecBuilder;
45 
49 class ExecBuilderNode : public ffi::Object {
50  public:
56  void DeclareFunction(const std::string& func, vm::VMFuncInfo::FuncKind kind);
65  void EmitFunction(const std::string& func, int64_t num_inputs,
66  ffi::Optional<ffi::Array<ffi::String>> param_names,
67  vm::VMFuncInfo::FuncKind kind = vm::VMFuncInfo::FuncKind::kVMFunc,
68  int64_t init_register_size = 0);
73  void EndFunction(const std::string& func);
80  void EmitCall(const std::string& func, std::vector<vm::Instruction::Arg> args, vm::RegName ret);
87  void EmitCall(vm::Instruction::Arg func, std::vector<vm::Instruction::Arg> args, vm::RegName ret);
98  void EmitGoto(vm::Index pc_offset);
105  void EmitIf(vm::Instruction::Arg cond, vm::Index false_offset);
111  vm::Instruction::Arg GetFunction(const std::string& name);
120  template <typename T>
122  ffi::Any rv;
123  rv = value;
124  return ConvertConstant_(rv);
125  }
134  void SaveMemoryScope(vm::Instruction::Arg idx, ffi::String scope);
143  ffi::ObjectPtr<vm::VMExecutable> Get();
148  TVM_DLL static ExecBuilder Create();
149 
150  static void RegisterReflection() {
151  namespace refl = tvm::ffi::reflection;
152  refl::ObjectDef<ExecBuilderNode>();
153  }
154 
155  static constexpr const bool _type_mutable = true;
156  TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.ExecBuilder", ExecBuilderNode, ffi::Object);
157 
158  private:
167  vm::Instruction::Arg ConvertConstant_(ffi::Any obj);
168 
173  void CheckExecutable();
177  void Formalize();
178 
180  ffi::ObjectPtr<vm::VMExecutable> exec_; // mutable
182  std::unordered_map<ffi::Any, vm::Index, ffi::StructuralHash, ffi::StructuralEqual>
183  const_dedup_map_;
184 };
185 
186 class ExecBuilder : public ffi::ObjectRef {
187  public:
189 };
190 
191 } // namespace relax
192 } // namespace tvm
193 
194 #endif // TVM_RELAX_EXEC_BUILDER_H_
The bytecode for the virtual machine.
A builder provides api to build VM executable with instructions.
Definition: exec_builder.h:49
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.ExecBuilder", ExecBuilderNode, ffi::Object)
void EndFunction(const std::string &func)
Annotate the end of a vm function.
void EmitGoto(vm::Index pc_offset)
Emit a goto instruction.
void SaveMemoryScope(vm::Instruction::Arg idx, ffi::String scope)
update memory scopes.
void EmitCall(vm::Instruction::Arg func, std::vector< vm::Instruction::Arg > args, vm::RegName ret)
Emit a call instruction with func as argument.
vm::VMExecutable * exec() const
Raw access to underlying executable build in progress.
static void RegisterReflection()
Definition: exec_builder.h:150
static ExecBuilder Create()
Create an ExecBuilder.
vm::Instruction::Arg GetFunction(const std::string &name)
Get function index by its name.
void EmitCall(const std::string &func, std::vector< vm::Instruction::Arg > args, vm::RegName ret)
Emit a call instruction for a packed function.
ffi::ObjectPtr< vm::VMExecutable > Get()
Finalize the build, run formalize and get the final result.
vm::Instruction::Arg ConvertConstant(T value)
Convert a constant value something that exec builder can understand.
Definition: exec_builder.h:121
void DeclareFunction(const std::string &func, vm::VMFuncInfo::FuncKind kind)
Declare a function, it is OK to have multiple declarations.
void EmitIf(vm::Instruction::Arg cond, vm::Index false_offset)
Emit an If instruction.
static constexpr const bool _type_mutable
Definition: exec_builder.h:155
void EmitFunction(const std::string &func, int64_t num_inputs, ffi::Optional< ffi::Array< ffi::String >> param_names, vm::VMFuncInfo::FuncKind kind=vm::VMFuncInfo::FuncKind::kVMFunc, int64_t init_register_size=0)
To annotate the start of a vm function.
void EmitRet(vm::Instruction::Arg result)
Emit a ret instruction.
Definition: exec_builder.h:186
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(ExecBuilder, ffi::ObjectRef, ExecBuilderNode)
The virtual machine executable emitted by the VM compiler.
Definition: executable.h:89
Base expr nodes in TVM.
Definition: builtin.h:29
ExecWord Index
An alias for the integer type used ubiquitously in the VM.
Definition: bytecode.h:48
ExecWord RegName
A register name.
Definition: bytecode.h:43
tvm::relax::Var Arg(const ffi::String &name, const tvm::relax::StructInfo &struct_info)
Add a parameter to the last function frame.
An object that builds and maintains block scope and StmtSref mapping for Dependence analysis.
Definition: analyzer.h:37
PrimExpr ret(PrimExpr value, Span span=Span())
Return the value.
ostream operator<< for ffi::ObjectRef, Any, and Variant, delegating to ffi::ReprPrint....
FuncKind
kind of the function.
Definition: executable.h:55