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