tvm
runner.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_META_SCHEDULE_RUNNER_H_
20 #define TVM_S_TIR_META_SCHEDULE_RUNNER_H_
21 
22 #include <tvm/ffi/container/array.h>
23 #include <tvm/ffi/function.h>
24 #include <tvm/ffi/optional.h>
25 #include <tvm/ffi/reflection/registry.h>
26 #include <tvm/ffi/string.h>
27 #include <tvm/ir/expr.h>
29 
30 namespace tvm {
31 namespace s_tir {
32 namespace meta_schedule {
33 
35 class RunnerInputNode : public ffi::Object {
36  public:
38  ffi::String artifact_path;
40  ffi::String device_type;
42  ffi::Array<ArgInfo> args_info;
43 
44  static void RegisterReflection() {
45  namespace refl = tvm::ffi::reflection;
46  refl::ObjectDef<RunnerInputNode>()
47  .def_ro("artifact_path", &RunnerInputNode::artifact_path)
48  .def_ro("device_type", &RunnerInputNode::device_type)
49  .def_ro("args_info", &RunnerInputNode::args_info);
50  }
51  TVM_FFI_DECLARE_OBJECT_INFO_FINAL("s_tir.meta_schedule.RunnerInput", RunnerInputNode,
52  ffi::Object);
53 };
54 
59 class RunnerInput : public ffi::ObjectRef {
60  public:
67  TVM_DLL explicit RunnerInput(ffi::String artifact_path, ffi::String device_type,
68  ffi::Array<ArgInfo> args_info);
70 };
71 
73 class RunnerResultNode : public ffi::Object {
74  public:
76  ffi::Optional<ffi::Array<FloatImm>> run_secs;
78  ffi::Optional<ffi::String> error_msg;
79 
80  static void RegisterReflection() {
81  namespace refl = tvm::ffi::reflection;
82  refl::ObjectDef<RunnerResultNode>()
83  .def_ro("run_secs", &RunnerResultNode::run_secs)
84  .def_ro("error_msg", &RunnerResultNode::error_msg);
85  }
86  TVM_FFI_DECLARE_OBJECT_INFO_FINAL("s_tir.meta_schedule.RunnerResult", RunnerResultNode,
87  ffi::Object);
88 };
89 
94 class RunnerResult : public ffi::ObjectRef {
95  public:
101  TVM_DLL explicit RunnerResult(ffi::Optional<ffi::Array<FloatImm>> run_secs,
102  ffi::Optional<ffi::String> error_msg);
104 };
105 
111 class RunnerFutureNode : public ffi::Object {
112  public:
117  using FDone = ffi::TypedFunction<bool()>;
122  using FResult = ffi::TypedFunction<RunnerResult()>;
123 
128 
129  static void RegisterReflection() {
130  // `f_done` is not registered
131  // `f_result` is not registered
132  namespace refl = tvm::ffi::reflection;
133  refl::ObjectDef<RunnerFutureNode>();
134  }
135 
140  bool Done() const {
141  TVM_FFI_ICHECK(f_done != nullptr) << "PyRunnerFuture's Done method not implemented!";
142  return f_done();
143  }
149  TVM_FFI_ICHECK(f_result != nullptr) << "PyRunnerFuture's Result method not implemented!";
150  return f_result();
151  }
152  TVM_FFI_DECLARE_OBJECT_INFO_FINAL("s_tir.meta_schedule.RunnerFuture", RunnerFutureNode,
153  ffi::Object);
154 };
155 
160 class RunnerFuture : public ffi::ObjectRef {
161  public:
164 
170  TVM_DLL explicit RunnerFuture(FDone f_done, FResult f_result);
172 };
173 
175 class RunnerNode : public ffi::Object {
176  public:
183  using FRun = ffi::TypedFunction<ffi::Array<RunnerFuture>(ffi::Array<RunnerInput>)>;
184 
186  virtual ~RunnerNode() = default;
187 
193  virtual ffi::Array<RunnerFuture> Run(ffi::Array<RunnerInput> runner_inputs) = 0;
194 
195  static void RegisterReflection() {
196  namespace refl = tvm::ffi::reflection;
197  refl::ObjectDef<RunnerNode>();
198  }
199 
200  static constexpr const bool _type_mutable = true;
201  TVM_FFI_DECLARE_OBJECT_INFO("s_tir.meta_schedule.Runner", RunnerNode, ffi::Object);
202 };
203 
208 class Runner : public ffi::ObjectRef {
209  public:
215  explicit Runner(ffi::ObjectPtr<RunnerNode> data) : ffi::ObjectRef(data) {
216  TVM_FFI_ICHECK(data != nullptr);
217  }
223  TVM_DLL static Runner PyRunner(FRun f_run);
225 };
226 
228 class PyRunnerNode : public RunnerNode {
229  public:
232 
233  static void RegisterReflection() {
234  // `f_run` is not registered
235  namespace refl = tvm::ffi::reflection;
236  refl::ObjectDef<PyRunnerNode>();
237  }
238 
239  ffi::Array<RunnerFuture> Run(ffi::Array<RunnerInput> runner_inputs) final {
240  TVM_FFI_ICHECK(f_run != nullptr) << "PyRunner's Run method not implemented!";
241  return f_run(runner_inputs);
242  }
243  TVM_FFI_DECLARE_OBJECT_INFO_FINAL("s_tir.meta_schedule.PyRunner", PyRunnerNode, RunnerNode);
244 };
245 
246 } // namespace meta_schedule
247 } // namespace s_tir
248 } // namespace tvm
249 
250 #endif // TVM_S_TIR_META_SCHEDULE_RUNNER_H_
An abstract runner with customized build method on the python-side.
Definition: runner.h:228
static void RegisterReflection()
Definition: runner.h:233
FRun f_run
The packed function to run the built artifacts and get runner futures.
Definition: runner.h:231
ffi::Array< RunnerFuture > Run(ffi::Array< RunnerInput > runner_inputs) final
Run the built artifact and get runner futures.
Definition: runner.h:239
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("s_tir.meta_schedule.PyRunner", PyRunnerNode, RunnerNode)
A class to asynchronously fetch runner's output.
Definition: runner.h:111
ffi::TypedFunction< bool()> FDone
The function type to check whether the runner has finished.
Definition: runner.h:117
RunnerResult Result() const
Fetch the runner's output if it is ready.
Definition: runner.h:148
bool Done() const
Check whether the runner has finished.
Definition: runner.h:140
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("s_tir.meta_schedule.RunnerFuture", RunnerFutureNode, ffi::Object)
ffi::TypedFunction< RunnerResult()> FResult
The function type to fetch runner output if it is ready.
Definition: runner.h:122
static void RegisterReflection()
Definition: runner.h:129
FResult f_result
The packed function to fetch runner output if it is ready.
Definition: runner.h:127
FDone f_done
The packed function to check whether the runner has finished.
Definition: runner.h:125
Managed reference to RunnerFutureNode.
Definition: runner.h:160
RunnerFuture(FDone f_done, FResult f_result)
Constructor of RunnerFuture.
RunnerFutureNode::FDone FDone
Definition: runner.h:162
RunnerFutureNode::FResult FResult
Definition: runner.h:163
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(RunnerFuture, ffi::ObjectRef, RunnerFutureNode)
Runner's input containing path of artifact, type of device and argument info.
Definition: runner.h:35
ffi::String device_type
The type of device.
Definition: runner.h:40
static void RegisterReflection()
Definition: runner.h:44
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("s_tir.meta_schedule.RunnerInput", RunnerInputNode, ffi::Object)
ffi::String artifact_path
The path to the built artifact.
Definition: runner.h:38
ffi::Array< ArgInfo > args_info
The argument information.
Definition: runner.h:42
Managed reference to RunnerInputNode.
Definition: runner.h:59
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(RunnerInput, ffi::ObjectRef, RunnerInputNode)
RunnerInput(ffi::String artifact_path, ffi::String device_type, ffi::Array< ArgInfo > args_info)
Constructor of RunnerInput.
The abstract runner interface.
Definition: runner.h:175
TVM_FFI_DECLARE_OBJECT_INFO("s_tir.meta_schedule.Runner", RunnerNode, ffi::Object)
virtual ffi::Array< RunnerFuture > Run(ffi::Array< RunnerInput > runner_inputs)=0
Run the built artifact and get runner futures.
static void RegisterReflection()
Definition: runner.h:195
ffi::TypedFunction< ffi::Array< RunnerFuture >(ffi::Array< RunnerInput >)> FRun
The function type to run the built artifacts and get runner futures.
Definition: runner.h:183
virtual ~RunnerNode()=default
Default destructor.
static constexpr const bool _type_mutable
Definition: runner.h:200
Runner's output containing measurement result of MeasureCandidate or error msg if any.
Definition: runner.h:73
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("s_tir.meta_schedule.RunnerResult", RunnerResultNode, ffi::Object)
ffi::Optional< ffi::Array< FloatImm > > run_secs
The run time in seconds.
Definition: runner.h:76
static void RegisterReflection()
Definition: runner.h:80
ffi::Optional< ffi::String > error_msg
The error message, if any.
Definition: runner.h:78
Managed reference to RunnerResultNode.
Definition: runner.h:94
RunnerResult(ffi::Optional< ffi::Array< FloatImm >> run_secs, ffi::Optional< ffi::String > error_msg)
Constructor.
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(RunnerResult, ffi::ObjectRef, RunnerResultNode)
Managed reference to RunnerNode.
Definition: runner.h:208
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(Runner, ffi::ObjectRef, RunnerNode)
static Runner PyRunner(FRun f_run)
Create a runner with customized build method on the python-side.
Runner(ffi::ObjectPtr< RunnerNode > data)
Constructor from ffi::ObjectPtr<RunnerNode>.
Definition: runner.h:215
RunnerNode::FRun FRun
Definition: runner.h:210
Base expr nodes in TVM.
constexpr const char * device_type
The device type.
Definition: stmt.h:1011
An object that builds and maintains block scope and StmtSref mapping for Dependence analysis.
Definition: analyzer.h:37