TVM  0.9.4
Logger.h
Go to the documentation of this file.
1 
3 #pragma once
4 
5 #include <tvm/api.h>
6 
8 
9 #include <algorithm>
10 #include <fstream>
11 #include <memory>
12 
13 namespace tvm
14 {
15 
16 namespace graph
17 {
18 class CallGraph;
19 namespace abstract
20 {
21 class Outputs;
22 }
23 
24 namespace internal
25 {
26 class Inputs;
27 
29 {
30 public:
31  static Logger & logger();
32 
33  void disable();
34  void enable();
35 
36  const Log & log() const;
37 
38  template<typename U, typename EnumT>
39  void registerUpdate(U * node, EnumT u, void (U::*fn)());
40 
41  template<typename S, typename EnumO>
42  void addInput(Inputs * node, S * source, EnumO i);
43 
44  template<typename U, typename EnumO, typename EnumU>
45  void addOutputDependency(U * node, EnumO o, EnumU u);
46 
47  template<typename U, typename EnumU1, typename EnumU2>
48  void addInternalDependency(U * node, EnumU1 uDependent, EnumU2 u);
49 
50  template<typename U, typename EnumU, typename S, typename EnumO>
51  void addInputDependency(U * node, EnumU u, S * source, EnumO i);
52 
53  template<typename U, typename EnumO, typename S, typename EnumI>
54  void addDirectDependency(U * node, EnumO o, S * source, EnumI i);
55 
56  void addGraphOutput(CallGraph * g, Inputs * node);
57 
59  template<typename U>
60  void registerType(U * node);
61 
62  template<typename U>
63  void logCall(U * node, void (U::*fn)());
64 
65 private:
66  Logger() = default;
67 
68  // raw log
69  Log log_;
70  bool disabled_;
71 };
72 
73 // Helper function for pointer-to-member-function
74 template<typename T>
75 std::uintptr_t getPointerValue(void (T::*ptfm)())
76 {
77  auto cptr = reinterpret_cast<std::uintptr_t *>(&ptfm);
78  return *cptr;
79 }
80 
81 inline const Log & Logger::log() const { return log_; }
82 
83 template<typename U, typename EnumT>
84 inline void Logger::registerUpdate(U * node, EnumT u, void (U::*fn)())
85 {
86  if(disabled_)
87  return;
88 
89  Log::Update up{Log::EnumValue(u), U::UpdateName(u), getPointerValue<U>(fn), Log::Pointer(node)};
90  log_.updates_.push_back(up);
91  registerType(node);
92 }
93 
94 template<typename S, typename EnumO>
95 inline void Logger::addInput(Inputs * node, S * source, EnumO i)
96 {
97  if(disabled_)
98  return;
99 
100  Log::Input in = {Log::EnumValue(i), S::OutputName(i), Log::Pointer(source), Log::Pointer(node)};
101  log_.inputs_.push_back(in);
102  registerType(node);
103  registerType(source);
104 }
105 
106 template<typename U, typename EnumO, typename EnumU>
107 inline void Logger::addOutputDependency(U * node, EnumO o, EnumU u)
108 {
109  if(disabled_)
110  return;
111 
112  Log::Output out = {Log::EnumValue(o), U::OutputName(o), Log::Pointer(node)};
113  log_.outputs_.push_back(out);
114 
116  log_.outputDependencies_.push_back(dep);
117  registerType(node);
118 }
119 
120 template<typename U, typename EnumU1, typename EnumU2>
121 inline void Logger::addInternalDependency(U * node, EnumU1 uDependent, EnumU2 u)
122 {
123  if(disabled_)
124  return;
125 
126  Log::InternalDependency dep = {Log::EnumValue(u), Log::EnumValue(uDependent), Log::Pointer(node)};
127  log_.internalDependencies_.push_back(dep);
128  registerType(node);
129 }
130 
131 template<typename U, typename EnumU, typename S, typename EnumO>
132 inline void Logger::addInputDependency(U * node, EnumU u, S * source, EnumO i)
133 {
134  if(disabled_)
135  return;
136 
138  log_.inputDependencies_.push_back(dep);
139  registerType(node);
140  registerType(source);
141 }
142 
143 template<typename U, typename EnumO, typename S, typename EnumI>
144 inline void Logger::addDirectDependency(U * node, EnumO o, S * source, EnumI i)
145 {
146  if(disabled_)
147  return;
148 
149  Log::Output out = {Log::EnumValue(o), U::OutputName(o), Log::Pointer(node)};
150  log_.outputs_.push_back(out);
151 
153  log_.directDependencies_.push_back(dep);
154  registerType(node);
155  registerType(source);
156 }
157 
158 template<typename U>
159 inline void Logger::registerType(U * node)
160 {
161  if(disabled_)
162  return;
163 
164  std::type_index t(typeid(*node));
165  std::uintptr_t val = reinterpret_cast<std::uintptr_t>(node);
166  auto & types = log_.types_[val];
167  auto it = std::find(types.begin(), types.end(), t);
168  if(it == types.end())
169  {
170  types.push_back(t);
171  }
172 }
173 
174 } // namespace internal
175 
176 } // namespace graph
177 
178 } // namespace tvm
#define TVM_DLLAPI
Definition: api.h:35
Definition: CallGraph.h:23
Definition: Inputs.h:25
Definition: Log.h:56
std::vector< InternalDependency > internalDependencies_
Definition: Log.h:216
std::vector< OutputDependency > outputDependencies_
Definition: Log.h:215
std::vector< Output > outputs_
Definition: Log.h:213
std::vector< Input > inputs_
Definition: Log.h:212
std::vector< Update > updates_
Definition: Log.h:211
std::vector< InputDependency > inputDependencies_
Definition: Log.h:214
std::vector< DirectDependency > directDependencies_
Definition: Log.h:217
std::map< std::uintptr_t, std::vector< std::type_index > > types_
Definition: Log.h:232
Definition: Logger.h:29
void addOutputDependency(U *node, EnumO o, EnumU u)
Definition: Logger.h:107
void registerUpdate(U *node, EnumT u, void(U::*fn)())
Definition: Logger.h:84
void logCall(U *node, void(U::*fn)())
void registerType(U *node)
Definition: Logger.h:159
void addInput(Inputs *node, S *source, EnumO i)
Definition: Logger.h:95
static Logger & logger()
const Log & log() const
Definition: Logger.h:81
void addInputDependency(U *node, EnumU u, S *source, EnumO i)
Definition: Logger.h:132
void addGraphOutput(CallGraph *g, Inputs *node)
void addInternalDependency(U *node, EnumU1 uDependent, EnumU2 u)
Definition: Logger.h:121
void addDirectDependency(U *node, EnumO o, S *source, EnumI i)
Definition: Logger.h:144
std::uintptr_t getPointerValue(void(T::*ptfm)())
Definition: Logger.h:75
Definition: Clock.h:12