xref: /aosp_15_r20/external/executorch/runtime/platform/profiler.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 <stdint.h>
12*523fa7a6SAndroid Build Coastguard Worker #include <stdlib.h>
13*523fa7a6SAndroid Build Coastguard Worker #include <string.h>
14*523fa7a6SAndroid Build Coastguard Worker 
15*523fa7a6SAndroid Build Coastguard Worker namespace executorch {
16*523fa7a6SAndroid Build Coastguard Worker namespace runtime {
17*523fa7a6SAndroid Build Coastguard Worker 
18*523fa7a6SAndroid Build Coastguard Worker // Version string used to check for compatibility with post-processing
19*523fa7a6SAndroid Build Coastguard Worker // tool
20*523fa7a6SAndroid Build Coastguard Worker #define ET_PROF_VER 0x00000001
21*523fa7a6SAndroid Build Coastguard Worker 
22*523fa7a6SAndroid Build Coastguard Worker // By default we support profiling upto 1024 perf events. Build
23*523fa7a6SAndroid Build Coastguard Worker // targets can override this to increase the profiling buffer size
24*523fa7a6SAndroid Build Coastguard Worker // during compilation.
25*523fa7a6SAndroid Build Coastguard Worker #ifndef MAX_PROFILE_EVENTS
26*523fa7a6SAndroid Build Coastguard Worker #define MAX_PROFILE_EVENTS 1024
27*523fa7a6SAndroid Build Coastguard Worker #endif
28*523fa7a6SAndroid Build Coastguard Worker // By default we support profiling upto 1024 memory allocation events.
29*523fa7a6SAndroid Build Coastguard Worker // Build targets can choose to override this, which will consequently have
30*523fa7a6SAndroid Build Coastguard Worker // the effect of increasing/decreasing the profiling buffer size.
31*523fa7a6SAndroid Build Coastguard Worker #ifndef MAX_MEM_PROFILE_EVENTS
32*523fa7a6SAndroid Build Coastguard Worker #define MAX_MEM_PROFILE_EVENTS 1024
33*523fa7a6SAndroid Build Coastguard Worker #endif
34*523fa7a6SAndroid Build Coastguard Worker // By default we support profiling only upto 16 allocators. If users
35*523fa7a6SAndroid Build Coastguard Worker // have more allocators than these then they can override this during
36*523fa7a6SAndroid Build Coastguard Worker // compilation time. There will be an increase/decrease in the profiling
37*523fa7a6SAndroid Build Coastguard Worker // buffer size based on the way this value is changed.
38*523fa7a6SAndroid Build Coastguard Worker #ifndef MEM_PROFILE_MAX_ALLOCATORS
39*523fa7a6SAndroid Build Coastguard Worker #define MEM_PROFILE_MAX_ALLOCATORS 32
40*523fa7a6SAndroid Build Coastguard Worker #endif
41*523fa7a6SAndroid Build Coastguard Worker // By default we support only one profiling block. If users want to profile
42*523fa7a6SAndroid Build Coastguard Worker // something that will be iterated on multiple times then they will have to
43*523fa7a6SAndroid Build Coastguard Worker // increment this to support their use case. In post-processing the stats for
44*523fa7a6SAndroid Build Coastguard Worker // all these iterations will be consolidated.
45*523fa7a6SAndroid Build Coastguard Worker #ifndef MAX_PROFILE_BLOCKS
46*523fa7a6SAndroid Build Coastguard Worker #define MAX_PROFILE_BLOCKS 2
47*523fa7a6SAndroid Build Coastguard Worker #endif
48*523fa7a6SAndroid Build Coastguard Worker 
49*523fa7a6SAndroid Build Coastguard Worker #define PROF_NAME_MAX_LEN 32
50*523fa7a6SAndroid Build Coastguard Worker 
51*523fa7a6SAndroid Build Coastguard Worker typedef struct alignas(8) {
52*523fa7a6SAndroid Build Coastguard Worker   union {
53*523fa7a6SAndroid Build Coastguard Worker     const char* name_str;
54*523fa7a6SAndroid Build Coastguard Worker     char name[PROF_NAME_MAX_LEN];
55*523fa7a6SAndroid Build Coastguard Worker   };
56*523fa7a6SAndroid Build Coastguard Worker   // chain_idx == -1 is a null value, when profile event happens out of chain
57*523fa7a6SAndroid Build Coastguard Worker   // execution
58*523fa7a6SAndroid Build Coastguard Worker   int32_t chain_idx;
59*523fa7a6SAndroid Build Coastguard Worker   uint32_t instruction_idx;
60*523fa7a6SAndroid Build Coastguard Worker   uint64_t start_time;
61*523fa7a6SAndroid Build Coastguard Worker   uint64_t end_time;
62*523fa7a6SAndroid Build Coastguard Worker } prof_event_t;
63*523fa7a6SAndroid Build Coastguard Worker 
64*523fa7a6SAndroid Build Coastguard Worker typedef struct alignas(8) {
65*523fa7a6SAndroid Build Coastguard Worker   uint32_t allocator_id;
66*523fa7a6SAndroid Build Coastguard Worker   uint32_t allocation_size;
67*523fa7a6SAndroid Build Coastguard Worker } mem_prof_event_t;
68*523fa7a6SAndroid Build Coastguard Worker 
69*523fa7a6SAndroid Build Coastguard Worker typedef struct alignas(8) {
70*523fa7a6SAndroid Build Coastguard Worker   char name[PROF_NAME_MAX_LEN];
71*523fa7a6SAndroid Build Coastguard Worker   uint64_t allocator_id;
72*523fa7a6SAndroid Build Coastguard Worker } prof_allocator_t;
73*523fa7a6SAndroid Build Coastguard Worker 
74*523fa7a6SAndroid Build Coastguard Worker typedef struct alignas(8) {
75*523fa7a6SAndroid Build Coastguard Worker   uint8_t* prof_data;
76*523fa7a6SAndroid Build Coastguard Worker   uint32_t num_bytes;
77*523fa7a6SAndroid Build Coastguard Worker   uint32_t num_blocks;
78*523fa7a6SAndroid Build Coastguard Worker } prof_result_t;
79*523fa7a6SAndroid Build Coastguard Worker 
80*523fa7a6SAndroid Build Coastguard Worker typedef struct alignas(8) {
81*523fa7a6SAndroid Build Coastguard Worker   char name[32];
82*523fa7a6SAndroid Build Coastguard Worker   uint32_t prof_ver;
83*523fa7a6SAndroid Build Coastguard Worker   uint32_t max_prof_entries;
84*523fa7a6SAndroid Build Coastguard Worker   uint32_t prof_entries;
85*523fa7a6SAndroid Build Coastguard Worker   uint32_t max_allocator_entries;
86*523fa7a6SAndroid Build Coastguard Worker   uint32_t allocator_entries;
87*523fa7a6SAndroid Build Coastguard Worker   uint32_t max_mem_prof_entries;
88*523fa7a6SAndroid Build Coastguard Worker   uint32_t mem_prof_entries;
89*523fa7a6SAndroid Build Coastguard Worker } prof_header_t;
90*523fa7a6SAndroid Build Coastguard Worker 
91*523fa7a6SAndroid Build Coastguard Worker /*
92*523fa7a6SAndroid Build Coastguard Worker This is what the layout of the profiling buffer looks like.
93*523fa7a6SAndroid Build Coastguard Worker ---------------------------------------
94*523fa7a6SAndroid Build Coastguard Worker | Profiling header                    |
95*523fa7a6SAndroid Build Coastguard Worker ---------------------------------------
96*523fa7a6SAndroid Build Coastguard Worker | Profile events (Perf events)        |
97*523fa7a6SAndroid Build Coastguard Worker ---------------------------------------
98*523fa7a6SAndroid Build Coastguard Worker | Memory allocators info              |
99*523fa7a6SAndroid Build Coastguard Worker ---------------------------------------
100*523fa7a6SAndroid Build Coastguard Worker | Profile events (Memory allocations) |
101*523fa7a6SAndroid Build Coastguard Worker ---------------------------------------
102*523fa7a6SAndroid Build Coastguard Worker */
103*523fa7a6SAndroid Build Coastguard Worker 
104*523fa7a6SAndroid Build Coastguard Worker // offsets of the various sections in the profiling buffer
105*523fa7a6SAndroid Build Coastguard Worker // Total size required for profiling buffer
106*523fa7a6SAndroid Build Coastguard Worker constexpr uint32_t prof_buf_size = sizeof(prof_header_t) +
107*523fa7a6SAndroid Build Coastguard Worker     sizeof(prof_event_t) * MAX_PROFILE_EVENTS +
108*523fa7a6SAndroid Build Coastguard Worker     sizeof(mem_prof_event_t) * MAX_MEM_PROFILE_EVENTS +
109*523fa7a6SAndroid Build Coastguard Worker     sizeof(prof_allocator_t) * MEM_PROFILE_MAX_ALLOCATORS;
110*523fa7a6SAndroid Build Coastguard Worker 
111*523fa7a6SAndroid Build Coastguard Worker constexpr size_t prof_header_offset = 0;
112*523fa7a6SAndroid Build Coastguard Worker constexpr size_t prof_events_offset = sizeof(prof_header_t);
113*523fa7a6SAndroid Build Coastguard Worker constexpr size_t prof_mem_alloc_info_offset =
114*523fa7a6SAndroid Build Coastguard Worker     prof_events_offset + sizeof(prof_event_t) * MAX_PROFILE_EVENTS;
115*523fa7a6SAndroid Build Coastguard Worker constexpr size_t prof_mem_alloc_events_offset = prof_mem_alloc_info_offset +
116*523fa7a6SAndroid Build Coastguard Worker     sizeof(prof_allocator_t) * MEM_PROFILE_MAX_ALLOCATORS;
117*523fa7a6SAndroid Build Coastguard Worker 
118*523fa7a6SAndroid Build Coastguard Worker // Set the initial state for the profiler assuming we're using the
119*523fa7a6SAndroid Build Coastguard Worker // statically allocated buffer declared in the profiler module.
120*523fa7a6SAndroid Build Coastguard Worker void profiler_init(void);
121*523fa7a6SAndroid Build Coastguard Worker 
122*523fa7a6SAndroid Build Coastguard Worker // This starts the profiling of this event and returns a token
123*523fa7a6SAndroid Build Coastguard Worker // by which this event can be referred to in the future.
124*523fa7a6SAndroid Build Coastguard Worker uint32_t begin_profiling(const char* name);
125*523fa7a6SAndroid Build Coastguard Worker 
126*523fa7a6SAndroid Build Coastguard Worker // End profiling event represented by token_id
127*523fa7a6SAndroid Build Coastguard Worker void end_profiling(uint32_t token_id);
128*523fa7a6SAndroid Build Coastguard Worker 
129*523fa7a6SAndroid Build Coastguard Worker // Dump profiler results, return pointer to prof event array and number of
130*523fa7a6SAndroid Build Coastguard Worker // events in it.
131*523fa7a6SAndroid Build Coastguard Worker void dump_profile_stats(prof_result_t* prof_result);
132*523fa7a6SAndroid Build Coastguard Worker 
133*523fa7a6SAndroid Build Coastguard Worker void reset_profile_stats();
134*523fa7a6SAndroid Build Coastguard Worker 
135*523fa7a6SAndroid Build Coastguard Worker void track_allocation(int32_t id, uint32_t size);
136*523fa7a6SAndroid Build Coastguard Worker 
137*523fa7a6SAndroid Build Coastguard Worker uint32_t track_allocator(const char* name);
138*523fa7a6SAndroid Build Coastguard Worker 
139*523fa7a6SAndroid Build Coastguard Worker void profiling_create_block(const char* name);
140*523fa7a6SAndroid Build Coastguard Worker 
141*523fa7a6SAndroid Build Coastguard Worker // This class enables scope based profiling where needed. Profiling
142*523fa7a6SAndroid Build Coastguard Worker // will be started when the object is created and will end when the
143*523fa7a6SAndroid Build Coastguard Worker // object goes out of scope.
144*523fa7a6SAndroid Build Coastguard Worker class ExecutorchProfiler {
145*523fa7a6SAndroid Build Coastguard Worker  public:
146*523fa7a6SAndroid Build Coastguard Worker   explicit ExecutorchProfiler(const char* name);
147*523fa7a6SAndroid Build Coastguard Worker 
148*523fa7a6SAndroid Build Coastguard Worker   ~ExecutorchProfiler();
149*523fa7a6SAndroid Build Coastguard Worker 
150*523fa7a6SAndroid Build Coastguard Worker  private:
151*523fa7a6SAndroid Build Coastguard Worker   uint32_t prof_tok;
152*523fa7a6SAndroid Build Coastguard Worker };
153*523fa7a6SAndroid Build Coastguard Worker 
154*523fa7a6SAndroid Build Coastguard Worker typedef struct {
155*523fa7a6SAndroid Build Coastguard Worker   int32_t chain_idx;
156*523fa7a6SAndroid Build Coastguard Worker   uint32_t instruction_idx;
157*523fa7a6SAndroid Build Coastguard Worker } prof_state_t;
158*523fa7a6SAndroid Build Coastguard Worker 
159*523fa7a6SAndroid Build Coastguard Worker const prof_state_t& get_profile_tls_state();
160*523fa7a6SAndroid Build Coastguard Worker 
161*523fa7a6SAndroid Build Coastguard Worker void set_profile_tls_state(const prof_state_t& state);
162*523fa7a6SAndroid Build Coastguard Worker 
163*523fa7a6SAndroid Build Coastguard Worker class ExecutorchProfilerInstructionScope {
164*523fa7a6SAndroid Build Coastguard Worker  public:
165*523fa7a6SAndroid Build Coastguard Worker   explicit ExecutorchProfilerInstructionScope(const prof_state_t& state);
166*523fa7a6SAndroid Build Coastguard Worker   ~ExecutorchProfilerInstructionScope();
167*523fa7a6SAndroid Build Coastguard Worker 
168*523fa7a6SAndroid Build Coastguard Worker   // ScopeGuard: non-copyable, non-movable
169*523fa7a6SAndroid Build Coastguard Worker   ExecutorchProfilerInstructionScope(
170*523fa7a6SAndroid Build Coastguard Worker       const ExecutorchProfilerInstructionScope&) = delete;
171*523fa7a6SAndroid Build Coastguard Worker   ExecutorchProfilerInstructionScope& operator=(
172*523fa7a6SAndroid Build Coastguard Worker       const ExecutorchProfilerInstructionScope&) = delete;
173*523fa7a6SAndroid Build Coastguard Worker 
174*523fa7a6SAndroid Build Coastguard Worker   ExecutorchProfilerInstructionScope(ExecutorchProfilerInstructionScope&&) =
175*523fa7a6SAndroid Build Coastguard Worker       delete;
176*523fa7a6SAndroid Build Coastguard Worker   ExecutorchProfilerInstructionScope& operator=(
177*523fa7a6SAndroid Build Coastguard Worker       ExecutorchProfilerInstructionScope&&) = delete;
178*523fa7a6SAndroid Build Coastguard Worker 
179*523fa7a6SAndroid Build Coastguard Worker  private:
180*523fa7a6SAndroid Build Coastguard Worker   prof_state_t old_state_;
181*523fa7a6SAndroid Build Coastguard Worker };
182*523fa7a6SAndroid Build Coastguard Worker 
183*523fa7a6SAndroid Build Coastguard Worker } // namespace runtime
184*523fa7a6SAndroid Build Coastguard Worker } // namespace executorch
185*523fa7a6SAndroid Build Coastguard Worker 
186*523fa7a6SAndroid Build Coastguard Worker namespace torch {
187*523fa7a6SAndroid Build Coastguard Worker namespace executor {
188*523fa7a6SAndroid Build Coastguard Worker // TODO(T197294990): Remove these deprecated aliases once all users have moved
189*523fa7a6SAndroid Build Coastguard Worker // to the new `::executorch` namespaces.
190*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::begin_profiling;
191*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::dump_profile_stats;
192*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::end_profiling;
193*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::ExecutorchProfiler;
194*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::ExecutorchProfilerInstructionScope;
195*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::get_profile_tls_state;
196*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::mem_prof_event_t;
197*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::prof_allocator_t;
198*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::prof_buf_size;
199*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::prof_event_t;
200*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::prof_events_offset;
201*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::prof_header_offset;
202*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::prof_header_t;
203*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::prof_mem_alloc_events_offset;
204*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::prof_mem_alloc_info_offset;
205*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::prof_result_t;
206*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::prof_state_t;
207*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::profiler_init;
208*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::profiling_create_block;
209*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::reset_profile_stats;
210*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::set_profile_tls_state;
211*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::track_allocation;
212*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::track_allocator;
213*523fa7a6SAndroid Build Coastguard Worker } // namespace executor
214*523fa7a6SAndroid Build Coastguard Worker } // namespace torch
215*523fa7a6SAndroid Build Coastguard Worker 
216*523fa7a6SAndroid Build Coastguard Worker #ifdef PROFILING_ENABLED
217*523fa7a6SAndroid Build Coastguard Worker 
218*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_PROFILE_CREATE_BLOCK(name) \
219*523fa7a6SAndroid Build Coastguard Worker   ::executorch::runtime::profiling_create_block(name);
220*523fa7a6SAndroid Build Coastguard Worker 
221*523fa7a6SAndroid Build Coastguard Worker // Convenience macros to begin and end profiling. These can be inserted
222*523fa7a6SAndroid Build Coastguard Worker // anywhere as it'll be ensured that for the prod builds these will
223*523fa7a6SAndroid Build Coastguard Worker // essentially be noops.
224*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_BEGIN_PROF(name) \
225*523fa7a6SAndroid Build Coastguard Worker   ::executorch::runtime::begin_profiling(name);
226*523fa7a6SAndroid Build Coastguard Worker 
227*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_END_PROF(token_id) \
228*523fa7a6SAndroid Build Coastguard Worker   ::executorch::runtime::end_profiling(token_id);
229*523fa7a6SAndroid Build Coastguard Worker 
230*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_SCOPE_PROF(name) \
231*523fa7a6SAndroid Build Coastguard Worker   ::executorch::runtime::ExecutorchProfiler profiler(name);
232*523fa7a6SAndroid Build Coastguard Worker 
233*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_PROFILE_INSTRUCTION_SCOPE(chain_idx, instruction_idx) \
234*523fa7a6SAndroid Build Coastguard Worker   ::executorch::runtime::ExecutorchProfilerInstructionScope              \
235*523fa7a6SAndroid Build Coastguard Worker       __profiler_instruction_scope({chain_idx, instruction_idx});
236*523fa7a6SAndroid Build Coastguard Worker 
237*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_DUMP_PROFILE_RESULTS(prof_result) \
238*523fa7a6SAndroid Build Coastguard Worker   ::executorch::runtime::dump_profile_stats(prof_result);
239*523fa7a6SAndroid Build Coastguard Worker 
240*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_RESET_PROFILE_RESULTS() \
241*523fa7a6SAndroid Build Coastguard Worker   ::executorch::runtime::reset_profile_stats();
242*523fa7a6SAndroid Build Coastguard Worker 
243*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_TRACK_ALLOCATOR(name) \
244*523fa7a6SAndroid Build Coastguard Worker   ::executorch::runtime::track_allocator(name);
245*523fa7a6SAndroid Build Coastguard Worker 
246*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_TRACK_ALLOCATION(id, size) \
247*523fa7a6SAndroid Build Coastguard Worker   ::executorch::runtime::track_allocation(id, size);
248*523fa7a6SAndroid Build Coastguard Worker 
249*523fa7a6SAndroid Build Coastguard Worker #else
250*523fa7a6SAndroid Build Coastguard Worker 
251*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_PROFILE_CREATE_BLOCK(name) \
252*523fa7a6SAndroid Build Coastguard Worker   do {                                        \
253*523fa7a6SAndroid Build Coastguard Worker     (void)(name);                             \
254*523fa7a6SAndroid Build Coastguard Worker   } while (0)
255*523fa7a6SAndroid Build Coastguard Worker 
256*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_BEGIN_PROF(name) \
257*523fa7a6SAndroid Build Coastguard Worker   {}
258*523fa7a6SAndroid Build Coastguard Worker 
259*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_END_PROF(token_id) \
260*523fa7a6SAndroid Build Coastguard Worker   do {                                \
261*523fa7a6SAndroid Build Coastguard Worker     (void)(token_id);                 \
262*523fa7a6SAndroid Build Coastguard Worker   } while (0)
263*523fa7a6SAndroid Build Coastguard Worker 
264*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_SCOPE_PROF(name) \
265*523fa7a6SAndroid Build Coastguard Worker   do {                              \
266*523fa7a6SAndroid Build Coastguard Worker     (void)(name);                   \
267*523fa7a6SAndroid Build Coastguard Worker   } while (0)
268*523fa7a6SAndroid Build Coastguard Worker 
269*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_PROFILE_INSTRUCTION_SCOPE(chain_idx, instruction_idx) \
270*523fa7a6SAndroid Build Coastguard Worker   do {                                                                   \
271*523fa7a6SAndroid Build Coastguard Worker     (void)(chain_idx);                                                   \
272*523fa7a6SAndroid Build Coastguard Worker     (void)(instruction_idx);                                             \
273*523fa7a6SAndroid Build Coastguard Worker   } while (0)
274*523fa7a6SAndroid Build Coastguard Worker 
275*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_DUMP_PROFILE_RESULTS(prof_result_test) \
276*523fa7a6SAndroid Build Coastguard Worker   memset(prof_result_test, 0, sizeof(::executorch::runtime::prof_result_t));
277*523fa7a6SAndroid Build Coastguard Worker 
278*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_RESET_PROFILE_RESULTS() \
279*523fa7a6SAndroid Build Coastguard Worker   {}
280*523fa7a6SAndroid Build Coastguard Worker 
281*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_TRACK_ALLOCATOR(name) ((void)(name), -1)
282*523fa7a6SAndroid Build Coastguard Worker 
283*523fa7a6SAndroid Build Coastguard Worker #define EXECUTORCH_TRACK_ALLOCATION(id, size) \
284*523fa7a6SAndroid Build Coastguard Worker   do {                                        \
285*523fa7a6SAndroid Build Coastguard Worker     (void)(id);                               \
286*523fa7a6SAndroid Build Coastguard Worker     (void)(size);                             \
287*523fa7a6SAndroid Build Coastguard Worker   } while (0)
288*523fa7a6SAndroid Build Coastguard Worker 
289*523fa7a6SAndroid Build Coastguard Worker #endif
290