xref: /aosp_15_r20/external/executorch/devtools/etdump/etdump_flatcc.h (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
1*523fa7a6SAndroid Build Coastguard Worker /*
2*523fa7a6SAndroid Build Coastguard Worker  * Copyright (c) Meta Platforms, Inc. and affiliates.
3*523fa7a6SAndroid Build Coastguard Worker  * All rights reserved.
4*523fa7a6SAndroid Build Coastguard Worker  *
5*523fa7a6SAndroid Build Coastguard Worker  * This source code is licensed under the BSD-style license found in the
6*523fa7a6SAndroid Build Coastguard Worker  * LICENSE file in the root directory of this source tree.
7*523fa7a6SAndroid Build Coastguard Worker  */
8*523fa7a6SAndroid Build Coastguard Worker 
9*523fa7a6SAndroid Build Coastguard Worker #pragma once
10*523fa7a6SAndroid Build Coastguard Worker 
11*523fa7a6SAndroid Build Coastguard Worker #include <cstdint>
12*523fa7a6SAndroid Build Coastguard Worker 
13*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/core/event_tracer.h>
14*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/core/span.h>
15*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/platform/platform.h>
16*523fa7a6SAndroid Build Coastguard Worker 
17*523fa7a6SAndroid Build Coastguard Worker #define ETDUMP_VERSION 0
18*523fa7a6SAndroid Build Coastguard Worker 
19*523fa7a6SAndroid Build Coastguard Worker struct flatcc_builder;
20*523fa7a6SAndroid Build Coastguard Worker 
21*523fa7a6SAndroid Build Coastguard Worker namespace executorch {
22*523fa7a6SAndroid Build Coastguard Worker namespace etdump {
23*523fa7a6SAndroid Build Coastguard Worker 
24*523fa7a6SAndroid Build Coastguard Worker namespace internal {
25*523fa7a6SAndroid Build Coastguard Worker struct ETDumpStaticAllocator {
26*523fa7a6SAndroid Build Coastguard Worker   ETDumpStaticAllocator() = default;
27*523fa7a6SAndroid Build Coastguard Worker 
28*523fa7a6SAndroid Build Coastguard Worker   void
set_bufferETDumpStaticAllocator29*523fa7a6SAndroid Build Coastguard Worker   set_buffer(uint8_t* buffer, size_t total_buf_size, size_t alloc_buf_size) {
30*523fa7a6SAndroid Build Coastguard Worker     data = buffer;
31*523fa7a6SAndroid Build Coastguard Worker     data_size = alloc_buf_size;
32*523fa7a6SAndroid Build Coastguard Worker     allocated = 0;
33*523fa7a6SAndroid Build Coastguard Worker     out_size = total_buf_size - alloc_buf_size;
34*523fa7a6SAndroid Build Coastguard Worker     front_cursor = &buffer[alloc_buf_size];
35*523fa7a6SAndroid Build Coastguard Worker     front_left = out_size / 2;
36*523fa7a6SAndroid Build Coastguard Worker   }
37*523fa7a6SAndroid Build Coastguard Worker 
38*523fa7a6SAndroid Build Coastguard Worker   // Pointer to backing buffer to allocate from.
39*523fa7a6SAndroid Build Coastguard Worker   uint8_t* data{nullptr};
40*523fa7a6SAndroid Build Coastguard Worker 
41*523fa7a6SAndroid Build Coastguard Worker   // Size of backing buffer.
42*523fa7a6SAndroid Build Coastguard Worker   size_t data_size{0};
43*523fa7a6SAndroid Build Coastguard Worker 
44*523fa7a6SAndroid Build Coastguard Worker   // Current allocation offset.
45*523fa7a6SAndroid Build Coastguard Worker   size_t allocated{0};
46*523fa7a6SAndroid Build Coastguard Worker 
47*523fa7a6SAndroid Build Coastguard Worker   // Size of build buffer.
48*523fa7a6SAndroid Build Coastguard Worker   size_t out_size{0};
49*523fa7a6SAndroid Build Coastguard Worker 
50*523fa7a6SAndroid Build Coastguard Worker   // Pointer to front of build buffer.
51*523fa7a6SAndroid Build Coastguard Worker   uint8_t* front_cursor{nullptr};
52*523fa7a6SAndroid Build Coastguard Worker 
53*523fa7a6SAndroid Build Coastguard Worker   // Bytes left in front of front_cursor.
54*523fa7a6SAndroid Build Coastguard Worker   size_t front_left{0};
55*523fa7a6SAndroid Build Coastguard Worker };
56*523fa7a6SAndroid Build Coastguard Worker } // namespace internal
57*523fa7a6SAndroid Build Coastguard Worker 
58*523fa7a6SAndroid Build Coastguard Worker struct ETDumpResult {
59*523fa7a6SAndroid Build Coastguard Worker   void* buf;
60*523fa7a6SAndroid Build Coastguard Worker   size_t size;
61*523fa7a6SAndroid Build Coastguard Worker };
62*523fa7a6SAndroid Build Coastguard Worker 
63*523fa7a6SAndroid Build Coastguard Worker class ETDumpGen : public ::executorch::runtime::EventTracer {
64*523fa7a6SAndroid Build Coastguard Worker  public:
65*523fa7a6SAndroid Build Coastguard Worker   ETDumpGen(::executorch::runtime::Span<uint8_t> buffer = {nullptr, (size_t)0});
66*523fa7a6SAndroid Build Coastguard Worker   ~ETDumpGen() override;
67*523fa7a6SAndroid Build Coastguard Worker   void clear_builder();
68*523fa7a6SAndroid Build Coastguard Worker 
69*523fa7a6SAndroid Build Coastguard Worker   void create_event_block(const char* name) override;
70*523fa7a6SAndroid Build Coastguard Worker   virtual ::executorch::runtime::EventTracerEntry start_profiling(
71*523fa7a6SAndroid Build Coastguard Worker       const char* name,
72*523fa7a6SAndroid Build Coastguard Worker       ::executorch::runtime::ChainID chain_id = -1,
73*523fa7a6SAndroid Build Coastguard Worker       ::executorch::runtime::DebugHandle debug_handle = 0) override;
74*523fa7a6SAndroid Build Coastguard Worker   virtual void end_profiling(
75*523fa7a6SAndroid Build Coastguard Worker       ::executorch::runtime::EventTracerEntry prof_entry) override;
76*523fa7a6SAndroid Build Coastguard Worker   virtual ::executorch::runtime::EventTracerEntry start_profiling_delegate(
77*523fa7a6SAndroid Build Coastguard Worker       const char* name,
78*523fa7a6SAndroid Build Coastguard Worker       ::executorch::runtime::DebugHandle delegate_debug_index) override;
79*523fa7a6SAndroid Build Coastguard Worker   virtual void end_profiling_delegate(
80*523fa7a6SAndroid Build Coastguard Worker       ::executorch::runtime::EventTracerEntry prof_entry,
81*523fa7a6SAndroid Build Coastguard Worker       const void* metadata,
82*523fa7a6SAndroid Build Coastguard Worker       size_t metadata_len) override;
83*523fa7a6SAndroid Build Coastguard Worker   virtual void log_profiling_delegate(
84*523fa7a6SAndroid Build Coastguard Worker       const char* name,
85*523fa7a6SAndroid Build Coastguard Worker       ::executorch::runtime::DebugHandle delegate_debug_index,
86*523fa7a6SAndroid Build Coastguard Worker       et_timestamp_t start_time,
87*523fa7a6SAndroid Build Coastguard Worker       et_timestamp_t end_time,
88*523fa7a6SAndroid Build Coastguard Worker       const void* metadata,
89*523fa7a6SAndroid Build Coastguard Worker       size_t metadata_len) override;
90*523fa7a6SAndroid Build Coastguard Worker   virtual void track_allocation(
91*523fa7a6SAndroid Build Coastguard Worker       ::executorch::runtime::AllocatorID id,
92*523fa7a6SAndroid Build Coastguard Worker       size_t size) override;
93*523fa7a6SAndroid Build Coastguard Worker   virtual ::executorch::runtime::AllocatorID track_allocator(
94*523fa7a6SAndroid Build Coastguard Worker       const char* name) override;
95*523fa7a6SAndroid Build Coastguard Worker   virtual void log_evalue(
96*523fa7a6SAndroid Build Coastguard Worker       const ::executorch::runtime::EValue& evalue,
97*523fa7a6SAndroid Build Coastguard Worker       ::executorch::runtime::LoggedEValueType evalue_type =
98*523fa7a6SAndroid Build Coastguard Worker           ::executorch::runtime::LoggedEValueType::kIntermediateOutput)
99*523fa7a6SAndroid Build Coastguard Worker       override;
100*523fa7a6SAndroid Build Coastguard Worker   /**
101*523fa7a6SAndroid Build Coastguard Worker    * Log an intermediate tensor output from a delegate.
102*523fa7a6SAndroid Build Coastguard Worker    */
103*523fa7a6SAndroid Build Coastguard Worker   virtual void log_intermediate_output_delegate(
104*523fa7a6SAndroid Build Coastguard Worker       const char* name,
105*523fa7a6SAndroid Build Coastguard Worker       ::executorch::runtime::DebugHandle delegate_debug_index,
106*523fa7a6SAndroid Build Coastguard Worker       const exec_aten::Tensor& output) override;
107*523fa7a6SAndroid Build Coastguard Worker 
108*523fa7a6SAndroid Build Coastguard Worker   /**
109*523fa7a6SAndroid Build Coastguard Worker    * Log an intermediate tensor array output from a delegate.
110*523fa7a6SAndroid Build Coastguard Worker    */
111*523fa7a6SAndroid Build Coastguard Worker   virtual void log_intermediate_output_delegate(
112*523fa7a6SAndroid Build Coastguard Worker       const char* name,
113*523fa7a6SAndroid Build Coastguard Worker       ::executorch::runtime::DebugHandle delegate_debug_index,
114*523fa7a6SAndroid Build Coastguard Worker       const ::executorch::runtime::ArrayRef<exec_aten::Tensor> output) override;
115*523fa7a6SAndroid Build Coastguard Worker 
116*523fa7a6SAndroid Build Coastguard Worker   /**
117*523fa7a6SAndroid Build Coastguard Worker    * Log an intermediate int output from a delegate.
118*523fa7a6SAndroid Build Coastguard Worker    */
119*523fa7a6SAndroid Build Coastguard Worker   virtual void log_intermediate_output_delegate(
120*523fa7a6SAndroid Build Coastguard Worker       const char* name,
121*523fa7a6SAndroid Build Coastguard Worker       ::executorch::runtime::DebugHandle delegate_debug_index,
122*523fa7a6SAndroid Build Coastguard Worker       const int& output) override;
123*523fa7a6SAndroid Build Coastguard Worker 
124*523fa7a6SAndroid Build Coastguard Worker   /**
125*523fa7a6SAndroid Build Coastguard Worker    * Log an intermediate bool output from a delegate.
126*523fa7a6SAndroid Build Coastguard Worker    */
127*523fa7a6SAndroid Build Coastguard Worker   virtual void log_intermediate_output_delegate(
128*523fa7a6SAndroid Build Coastguard Worker       const char* name,
129*523fa7a6SAndroid Build Coastguard Worker       ::executorch::runtime::DebugHandle delegate_debug_index,
130*523fa7a6SAndroid Build Coastguard Worker       const bool& output) override;
131*523fa7a6SAndroid Build Coastguard Worker 
132*523fa7a6SAndroid Build Coastguard Worker   /**
133*523fa7a6SAndroid Build Coastguard Worker    * Log an intermediate double output from a delegate.
134*523fa7a6SAndroid Build Coastguard Worker    */
135*523fa7a6SAndroid Build Coastguard Worker   virtual void log_intermediate_output_delegate(
136*523fa7a6SAndroid Build Coastguard Worker       const char* name,
137*523fa7a6SAndroid Build Coastguard Worker       ::executorch::runtime::DebugHandle delegate_debug_index,
138*523fa7a6SAndroid Build Coastguard Worker       const double& output) override;
139*523fa7a6SAndroid Build Coastguard Worker   void set_debug_buffer(::executorch::runtime::Span<uint8_t> buffer);
140*523fa7a6SAndroid Build Coastguard Worker   ETDumpResult get_etdump_data();
141*523fa7a6SAndroid Build Coastguard Worker   size_t get_num_blocks();
142*523fa7a6SAndroid Build Coastguard Worker   bool is_static_etdump();
143*523fa7a6SAndroid Build Coastguard Worker   void reset();
144*523fa7a6SAndroid Build Coastguard Worker 
145*523fa7a6SAndroid Build Coastguard Worker  private:
146*523fa7a6SAndroid Build Coastguard Worker   enum class State {
147*523fa7a6SAndroid Build Coastguard Worker     Init,
148*523fa7a6SAndroid Build Coastguard Worker     BlockCreated,
149*523fa7a6SAndroid Build Coastguard Worker     AddingAllocators,
150*523fa7a6SAndroid Build Coastguard Worker     AddingEvents,
151*523fa7a6SAndroid Build Coastguard Worker     Done,
152*523fa7a6SAndroid Build Coastguard Worker   };
153*523fa7a6SAndroid Build Coastguard Worker 
154*523fa7a6SAndroid Build Coastguard Worker   void check_ready_to_add_events();
155*523fa7a6SAndroid Build Coastguard Worker   int64_t create_string_entry(const char* name);
156*523fa7a6SAndroid Build Coastguard Worker   size_t copy_tensor_to_debug_buffer(exec_aten::Tensor tensor);
157*523fa7a6SAndroid Build Coastguard Worker 
158*523fa7a6SAndroid Build Coastguard Worker   /**
159*523fa7a6SAndroid Build Coastguard Worker    * Templated helper function used to log various types of intermediate output.
160*523fa7a6SAndroid Build Coastguard Worker    * Supported types include tensor, tensor array, int, bool and double.
161*523fa7a6SAndroid Build Coastguard Worker    */
162*523fa7a6SAndroid Build Coastguard Worker   template <typename T>
163*523fa7a6SAndroid Build Coastguard Worker   void log_intermediate_output_delegate_helper(
164*523fa7a6SAndroid Build Coastguard Worker       const char* name,
165*523fa7a6SAndroid Build Coastguard Worker       ::executorch::runtime::DebugHandle delegate_debug_index,
166*523fa7a6SAndroid Build Coastguard Worker       const T& output);
167*523fa7a6SAndroid Build Coastguard Worker 
168*523fa7a6SAndroid Build Coastguard Worker   struct flatcc_builder* builder_;
169*523fa7a6SAndroid Build Coastguard Worker   size_t num_blocks_ = 0;
170*523fa7a6SAndroid Build Coastguard Worker   ::executorch::runtime::Span<uint8_t> debug_buffer_;
171*523fa7a6SAndroid Build Coastguard Worker   size_t debug_buffer_offset_ = 0;
172*523fa7a6SAndroid Build Coastguard Worker   int bundled_input_index_ = -1;
173*523fa7a6SAndroid Build Coastguard Worker   State state_ = State::Init;
174*523fa7a6SAndroid Build Coastguard Worker   struct internal::ETDumpStaticAllocator alloc_;
175*523fa7a6SAndroid Build Coastguard Worker };
176*523fa7a6SAndroid Build Coastguard Worker 
177*523fa7a6SAndroid Build Coastguard Worker } // namespace etdump
178*523fa7a6SAndroid Build Coastguard Worker } // namespace executorch
179*523fa7a6SAndroid Build Coastguard Worker 
180*523fa7a6SAndroid Build Coastguard Worker namespace torch {
181*523fa7a6SAndroid Build Coastguard Worker namespace executor {
182*523fa7a6SAndroid Build Coastguard Worker // TODO(T197294990): Remove these deprecated aliases once all users have moved
183*523fa7a6SAndroid Build Coastguard Worker // to the new `::executorch` namespaces.
184*523fa7a6SAndroid Build Coastguard Worker using etdump_result = ::executorch::etdump::ETDumpResult;
185*523fa7a6SAndroid Build Coastguard Worker using ::executorch::etdump::ETDumpGen;
186*523fa7a6SAndroid Build Coastguard Worker } // namespace executor
187*523fa7a6SAndroid Build Coastguard Worker } // namespace torch
188