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 <executorch/runtime/core/evalue.h> 12*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/core/event_tracer.h> 13*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/core/exec_aten/exec_aten.h> 14*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/core/span.h> 15*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/executor/memory_manager.h> 16*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/executor/method_meta.h> 17*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/platform/compiler.h> 18*523fa7a6SAndroid Build Coastguard Worker 19*523fa7a6SAndroid Build Coastguard Worker // Forward declare flatbuffer types. This is a public header and must not 20*523fa7a6SAndroid Build Coastguard Worker // include the generated flatbuffer header. 21*523fa7a6SAndroid Build Coastguard Worker namespace executorch_flatbuffer { 22*523fa7a6SAndroid Build Coastguard Worker struct Chain; 23*523fa7a6SAndroid Build Coastguard Worker struct ExecutionPlan; 24*523fa7a6SAndroid Build Coastguard Worker struct EValue; 25*523fa7a6SAndroid Build Coastguard Worker } // namespace executorch_flatbuffer 26*523fa7a6SAndroid Build Coastguard Worker 27*523fa7a6SAndroid Build Coastguard Worker namespace executorch { 28*523fa7a6SAndroid Build Coastguard Worker namespace runtime { 29*523fa7a6SAndroid Build Coastguard Worker 30*523fa7a6SAndroid Build Coastguard Worker // Forward declare Program to avoid a circular reference. 31*523fa7a6SAndroid Build Coastguard Worker class Program; 32*523fa7a6SAndroid Build Coastguard Worker 33*523fa7a6SAndroid Build Coastguard Worker // Forward declare internal types. 34*523fa7a6SAndroid Build Coastguard Worker class BackendDelegate; 35*523fa7a6SAndroid Build Coastguard Worker struct Chain; 36*523fa7a6SAndroid Build Coastguard Worker class KernelRuntimeContext; 37*523fa7a6SAndroid Build Coastguard Worker using OpFunction = void (*)(KernelRuntimeContext&, EValue**); 38*523fa7a6SAndroid Build Coastguard Worker /// A list of pointers into the master values table that together compose the 39*523fa7a6SAndroid Build Coastguard Worker /// argument list for a single instruction 40*523fa7a6SAndroid Build Coastguard Worker using InstructionArgs = Span<EValue*>; 41*523fa7a6SAndroid Build Coastguard Worker 42*523fa7a6SAndroid Build Coastguard Worker /** 43*523fa7a6SAndroid Build Coastguard Worker * An executable method of an executorch program. Maps to a python method like 44*523fa7a6SAndroid Build Coastguard Worker * `forward()` on the original nn.Module. 45*523fa7a6SAndroid Build Coastguard Worker */ 46*523fa7a6SAndroid Build Coastguard Worker class Method final { 47*523fa7a6SAndroid Build Coastguard Worker public: 48*523fa7a6SAndroid Build Coastguard Worker /** 49*523fa7a6SAndroid Build Coastguard Worker * Move ctor. Takes ownership of resources previously owned by `rhs`, 50*523fa7a6SAndroid Build Coastguard Worker * and leaves `rhs` in an uninitialized state. 51*523fa7a6SAndroid Build Coastguard Worker */ Method(Method && rhs)52*523fa7a6SAndroid Build Coastguard Worker Method(Method&& rhs) noexcept 53*523fa7a6SAndroid Build Coastguard Worker : step_state_(rhs.step_state_), 54*523fa7a6SAndroid Build Coastguard Worker program_(rhs.program_), 55*523fa7a6SAndroid Build Coastguard Worker memory_manager_(rhs.memory_manager_), 56*523fa7a6SAndroid Build Coastguard Worker temp_allocator_(rhs.temp_allocator_), 57*523fa7a6SAndroid Build Coastguard Worker serialization_plan_(rhs.serialization_plan_), 58*523fa7a6SAndroid Build Coastguard Worker event_tracer_(rhs.event_tracer_), 59*523fa7a6SAndroid Build Coastguard Worker n_value_(rhs.n_value_), 60*523fa7a6SAndroid Build Coastguard Worker values_(rhs.values_), 61*523fa7a6SAndroid Build Coastguard Worker n_delegate_(rhs.n_delegate_), 62*523fa7a6SAndroid Build Coastguard Worker delegates_(rhs.delegates_), 63*523fa7a6SAndroid Build Coastguard Worker n_chains_(rhs.n_chains_), 64*523fa7a6SAndroid Build Coastguard Worker chains_(rhs.chains_), 65*523fa7a6SAndroid Build Coastguard Worker init_state_(rhs.init_state_) { 66*523fa7a6SAndroid Build Coastguard Worker // Required: clear out fields that the dtor looks at, so that we don't free 67*523fa7a6SAndroid Build Coastguard Worker // anything twice. 68*523fa7a6SAndroid Build Coastguard Worker rhs.n_value_ = 0; 69*523fa7a6SAndroid Build Coastguard Worker rhs.values_ = nullptr; 70*523fa7a6SAndroid Build Coastguard Worker rhs.n_delegate_ = 0; 71*523fa7a6SAndroid Build Coastguard Worker rhs.delegates_ = nullptr; 72*523fa7a6SAndroid Build Coastguard Worker 73*523fa7a6SAndroid Build Coastguard Worker // Helpful: Try to ensure that any other interactions with the old object 74*523fa7a6SAndroid Build Coastguard Worker // result in failures. 75*523fa7a6SAndroid Build Coastguard Worker rhs.init_state_ = InitializationState::Uninitialized; 76*523fa7a6SAndroid Build Coastguard Worker rhs.step_state_ = {}; 77*523fa7a6SAndroid Build Coastguard Worker rhs.program_ = nullptr; 78*523fa7a6SAndroid Build Coastguard Worker rhs.memory_manager_ = nullptr; 79*523fa7a6SAndroid Build Coastguard Worker rhs.serialization_plan_ = nullptr; 80*523fa7a6SAndroid Build Coastguard Worker rhs.event_tracer_ = nullptr; 81*523fa7a6SAndroid Build Coastguard Worker rhs.n_chains_ = 0; 82*523fa7a6SAndroid Build Coastguard Worker rhs.chains_ = nullptr; 83*523fa7a6SAndroid Build Coastguard Worker } 84*523fa7a6SAndroid Build Coastguard Worker 85*523fa7a6SAndroid Build Coastguard Worker /** 86*523fa7a6SAndroid Build Coastguard Worker * Sets the internal input value to be equivalent to the to the provided 87*523fa7a6SAndroid Build Coastguard Worker * value. 88*523fa7a6SAndroid Build Coastguard Worker * 89*523fa7a6SAndroid Build Coastguard Worker * @param[in] input_evalue The evalue to copy into the method input. If the 90*523fa7a6SAndroid Build Coastguard Worker * evalue is a tensor, the data is copied in most cases, so the tensor 91*523fa7a6SAndroid Build Coastguard Worker * passed in here does not always need to outlive this call. But there is 92*523fa7a6SAndroid Build Coastguard Worker * a case where the Method will keep a pointer to the tensor's data. 93*523fa7a6SAndroid Build Coastguard Worker * Based on the memory plan of the method, the inputs may not have 94*523fa7a6SAndroid Build Coastguard Worker * buffer space pre-allocated for them. In this case the executor will 95*523fa7a6SAndroid Build Coastguard Worker * alias the memory of the tensors provided as inputs here rather then 96*523fa7a6SAndroid Build Coastguard Worker * deepcopy the input into the memory planned arena. 97*523fa7a6SAndroid Build Coastguard Worker * 98*523fa7a6SAndroid Build Coastguard Worker * @param[in] input_idx Zero-based index of the input to set. Must be less 99*523fa7a6SAndroid Build Coastguard Worker * than the value returned by inputs_size(). 100*523fa7a6SAndroid Build Coastguard Worker * 101*523fa7a6SAndroid Build Coastguard Worker * @returns Error::Ok on success, non-Ok on failure. 102*523fa7a6SAndroid Build Coastguard Worker */ 103*523fa7a6SAndroid Build Coastguard Worker ET_NODISCARD Error set_input(const EValue& input_evalue, size_t input_idx); 104*523fa7a6SAndroid Build Coastguard Worker 105*523fa7a6SAndroid Build Coastguard Worker /** 106*523fa7a6SAndroid Build Coastguard Worker * Sets the values of all method inputs. 107*523fa7a6SAndroid Build Coastguard Worker * 108*523fa7a6SAndroid Build Coastguard Worker * See set_input() for a more detailed description of the behavior. 109*523fa7a6SAndroid Build Coastguard Worker * 110*523fa7a6SAndroid Build Coastguard Worker * @param[in] input_evalues The new values for all of the method inputs. The 111*523fa7a6SAndroid Build Coastguard Worker * type of each element must match the type of corresponding input. If the 112*523fa7a6SAndroid Build Coastguard Worker * value of an element is a tensor, attempts to allow dynamic shape, but 113*523fa7a6SAndroid Build Coastguard Worker * the dtype must always agree. 114*523fa7a6SAndroid Build Coastguard Worker * 115*523fa7a6SAndroid Build Coastguard Worker * @returns Error::Ok on success, non-Ok on failure. 116*523fa7a6SAndroid Build Coastguard Worker */ 117*523fa7a6SAndroid Build Coastguard Worker ET_NODISCARD Error 118*523fa7a6SAndroid Build Coastguard Worker set_inputs(const executorch::aten::ArrayRef<EValue>& input_evalues); 119*523fa7a6SAndroid Build Coastguard Worker 120*523fa7a6SAndroid Build Coastguard Worker /** 121*523fa7a6SAndroid Build Coastguard Worker * Sets the data buffer of the specified method output to the provided value. 122*523fa7a6SAndroid Build Coastguard Worker * 123*523fa7a6SAndroid Build Coastguard Worker * NOTE: Based on the memory plan of the method, the output tensors may not 124*523fa7a6SAndroid Build Coastguard Worker * have buffer space pre-allocated for them, in this case the executor will 125*523fa7a6SAndroid Build Coastguard Worker * point those tensors to the buffer provided here, so the user should take 126*523fa7a6SAndroid Build Coastguard Worker * care that the life span of this memory outlasts the executor forward. 127*523fa7a6SAndroid Build Coastguard Worker * 128*523fa7a6SAndroid Build Coastguard Worker * @param[in] buffer The block of memory to point the specified tensor at. 129*523fa7a6SAndroid Build Coastguard Worker * 130*523fa7a6SAndroid Build Coastguard Worker * @param[in] size the length of buffer in bytes, must be >= the nbytes of the 131*523fa7a6SAndroid Build Coastguard Worker * specified tensor. 132*523fa7a6SAndroid Build Coastguard Worker * 133*523fa7a6SAndroid Build Coastguard Worker * @param[in] output_idx The index of the output to set the data_ptr for. Must 134*523fa7a6SAndroid Build Coastguard Worker * correspond to a tensor, and that tensor must not have had a buffer 135*523fa7a6SAndroid Build Coastguard Worker * allocated by the memory plan. 136*523fa7a6SAndroid Build Coastguard Worker * 137*523fa7a6SAndroid Build Coastguard Worker * @returns Error::Ok on success, non-Ok on failure. 138*523fa7a6SAndroid Build Coastguard Worker */ 139*523fa7a6SAndroid Build Coastguard Worker ET_NODISCARD Error 140*523fa7a6SAndroid Build Coastguard Worker set_output_data_ptr(void* buffer, size_t size, size_t output_idx); 141*523fa7a6SAndroid Build Coastguard Worker 142*523fa7a6SAndroid Build Coastguard Worker /** 143*523fa7a6SAndroid Build Coastguard Worker * Copies the method's outputs into the provided array. 144*523fa7a6SAndroid Build Coastguard Worker * 145*523fa7a6SAndroid Build Coastguard Worker * WARNING: The output contains shallow copies of internal tensor outputs. 146*523fa7a6SAndroid Build Coastguard Worker * Please do not mutate returned Tensor elements. 147*523fa7a6SAndroid Build Coastguard Worker * 148*523fa7a6SAndroid Build Coastguard Worker * TODO(T139259264): Add checks to detect output mutation, or deep-copy 149*523fa7a6SAndroid Build Coastguard Worker * outputs. 150*523fa7a6SAndroid Build Coastguard Worker * 151*523fa7a6SAndroid Build Coastguard Worker * @param[in] output_evalues The array to copy the outputs into. The first 152*523fa7a6SAndroid Build Coastguard Worker * `outputs_size()` elements will be set to the corresponding output 153*523fa7a6SAndroid Build Coastguard Worker * values. The rest of the array will be set to the EValue value None. 154*523fa7a6SAndroid Build Coastguard Worker * @param[in] length The size of the `output_evalues` array in elements. Must 155*523fa7a6SAndroid Build Coastguard Worker * be greater than or equal to `outputs_size()`. 156*523fa7a6SAndroid Build Coastguard Worker * 157*523fa7a6SAndroid Build Coastguard Worker * @returns Error::Ok on success, non-Ok on failure. 158*523fa7a6SAndroid Build Coastguard Worker */ 159*523fa7a6SAndroid Build Coastguard Worker ET_NODISCARD Error get_outputs(EValue* output_evalues, size_t length); 160*523fa7a6SAndroid Build Coastguard Worker 161*523fa7a6SAndroid Build Coastguard Worker /** 162*523fa7a6SAndroid Build Coastguard Worker * Copies the method's inputs into the provided array. 163*523fa7a6SAndroid Build Coastguard Worker * 164*523fa7a6SAndroid Build Coastguard Worker * WARNING: The input contains shallow copies of internal tensor inputs. 165*523fa7a6SAndroid Build Coastguard Worker * Please do not mutate returned Tensor elements. 166*523fa7a6SAndroid Build Coastguard Worker * 167*523fa7a6SAndroid Build Coastguard Worker * @param[in] input_evalues The array to copy the inputs into. The first 168*523fa7a6SAndroid Build Coastguard Worker * `inputs_size()` elements will be set to the corresponding input 169*523fa7a6SAndroid Build Coastguard Worker * values. The rest of the array will be set to the EValue value None. 170*523fa7a6SAndroid Build Coastguard Worker * @param[in] length The size of the `input_evalues` array in elements. Must 171*523fa7a6SAndroid Build Coastguard Worker * be greater than or equal to `inputs_size()`. 172*523fa7a6SAndroid Build Coastguard Worker * 173*523fa7a6SAndroid Build Coastguard Worker * @returns Error::Ok on success, non-Ok on failure. 174*523fa7a6SAndroid Build Coastguard Worker */ 175*523fa7a6SAndroid Build Coastguard Worker ET_NODISCARD Error get_inputs(EValue* input_evalues, size_t length); 176*523fa7a6SAndroid Build Coastguard Worker 177*523fa7a6SAndroid Build Coastguard Worker /** 178*523fa7a6SAndroid Build Coastguard Worker * Execute the method. 179*523fa7a6SAndroid Build Coastguard Worker * 180*523fa7a6SAndroid Build Coastguard Worker * NOTE: Will fail if the method has been partially executed using the 181*523fa7a6SAndroid Build Coastguard Worker * `step()` api. 182*523fa7a6SAndroid Build Coastguard Worker * 183*523fa7a6SAndroid Build Coastguard Worker * @returns Error::Ok on success, non-Ok on failure. 184*523fa7a6SAndroid Build Coastguard Worker */ 185*523fa7a6SAndroid Build Coastguard Worker ET_NODISCARD Error execute(); 186*523fa7a6SAndroid Build Coastguard Worker 187*523fa7a6SAndroid Build Coastguard Worker /** 188*523fa7a6SAndroid Build Coastguard Worker * EXPERIMENTAL: Advances/executes a single instruction in the method. 189*523fa7a6SAndroid Build Coastguard Worker * 190*523fa7a6SAndroid Build Coastguard Worker * @retval Error::Ok step succeeded 191*523fa7a6SAndroid Build Coastguard Worker * @retval non-Ok step failed 192*523fa7a6SAndroid Build Coastguard Worker * @retval Error::EndOfMethod method finished executing successfully 193*523fa7a6SAndroid Build Coastguard Worker */ 194*523fa7a6SAndroid Build Coastguard Worker ET_EXPERIMENTAL ET_NODISCARD Error step(); 195*523fa7a6SAndroid Build Coastguard Worker 196*523fa7a6SAndroid Build Coastguard Worker /// DEPRECATED: Use `step()` instead. 197*523fa7a6SAndroid Build Coastguard Worker ET_DEPRECATED ET_NODISCARD Error experimental_step(); 198*523fa7a6SAndroid Build Coastguard Worker 199*523fa7a6SAndroid Build Coastguard Worker /** 200*523fa7a6SAndroid Build Coastguard Worker * EXPERIMENTAL: Resets execution state to the start of the Method. For use 201*523fa7a6SAndroid Build Coastguard Worker * with the `step()` API. 202*523fa7a6SAndroid Build Coastguard Worker * 203*523fa7a6SAndroid Build Coastguard Worker * @retval Error:Ok on success 204*523fa7a6SAndroid Build Coastguard Worker * @retval Error::InvalidState if called before step-based execution reached 205*523fa7a6SAndroid Build Coastguard Worker * the end of the Method. This means it is not possible to recover a 206*523fa7a6SAndroid Build Coastguard Worker * Method that failed mid-execution. 207*523fa7a6SAndroid Build Coastguard Worker */ 208*523fa7a6SAndroid Build Coastguard Worker ET_EXPERIMENTAL ET_NODISCARD Error reset_execution(); 209*523fa7a6SAndroid Build Coastguard Worker 210*523fa7a6SAndroid Build Coastguard Worker /// DEPRECATED: Use `reset_execution()` instead. 211*523fa7a6SAndroid Build Coastguard Worker ET_DEPRECATED ET_NODISCARD Error experimental_reset_execution(); 212*523fa7a6SAndroid Build Coastguard Worker 213*523fa7a6SAndroid Build Coastguard Worker /** 214*523fa7a6SAndroid Build Coastguard Worker * Returns the MethodMeta that corresponds to the calling Method. 215*523fa7a6SAndroid Build Coastguard Worker */ 216*523fa7a6SAndroid Build Coastguard Worker MethodMeta method_meta() const; 217*523fa7a6SAndroid Build Coastguard Worker 218*523fa7a6SAndroid Build Coastguard Worker /** 219*523fa7a6SAndroid Build Coastguard Worker * Returns the number of inputs the Method expects. 220*523fa7a6SAndroid Build Coastguard Worker */ 221*523fa7a6SAndroid Build Coastguard Worker size_t inputs_size() const; 222*523fa7a6SAndroid Build Coastguard Worker 223*523fa7a6SAndroid Build Coastguard Worker /** 224*523fa7a6SAndroid Build Coastguard Worker * Returns the number of outputs the Method returns. 225*523fa7a6SAndroid Build Coastguard Worker */ 226*523fa7a6SAndroid Build Coastguard Worker size_t outputs_size() const; 227*523fa7a6SAndroid Build Coastguard Worker 228*523fa7a6SAndroid Build Coastguard Worker /** 229*523fa7a6SAndroid Build Coastguard Worker * Retrieves the output at the specified index. 230*523fa7a6SAndroid Build Coastguard Worker */ 231*523fa7a6SAndroid Build Coastguard Worker const EValue& get_output(size_t i) const; 232*523fa7a6SAndroid Build Coastguard Worker 233*523fa7a6SAndroid Build Coastguard Worker EventTracer* get_event_tracer(); 234*523fa7a6SAndroid Build Coastguard Worker 235*523fa7a6SAndroid Build Coastguard Worker /// DEPRECATED: Use MethodMeta instead to access metadata, and set_input to 236*523fa7a6SAndroid Build Coastguard Worker /// update Method inputs. 237*523fa7a6SAndroid Build Coastguard Worker ET_DEPRECATED const EValue& get_input(size_t i) const; 238*523fa7a6SAndroid Build Coastguard Worker /// DEPRECATED: Use MethodMeta instead to access metadata, and set_input to 239*523fa7a6SAndroid Build Coastguard Worker /// update Method inputs. 240*523fa7a6SAndroid Build Coastguard Worker ET_DEPRECATED EValue& mutable_input(size_t i); 241*523fa7a6SAndroid Build Coastguard Worker /// DEPRECATED: Use MethodMeta instead to access metadata, and get_output to 242*523fa7a6SAndroid Build Coastguard Worker /// retrieve Method outputs. 243*523fa7a6SAndroid Build Coastguard Worker ET_DEPRECATED EValue& mutable_output(size_t i); 244*523fa7a6SAndroid Build Coastguard Worker 245*523fa7a6SAndroid Build Coastguard Worker ~Method(); 246*523fa7a6SAndroid Build Coastguard Worker 247*523fa7a6SAndroid Build Coastguard Worker private: 248*523fa7a6SAndroid Build Coastguard Worker // Delete other rule-of-five methods. 249*523fa7a6SAndroid Build Coastguard Worker Method(const Method&) = delete; 250*523fa7a6SAndroid Build Coastguard Worker Method& operator=(const Method&) noexcept = delete; 251*523fa7a6SAndroid Build Coastguard Worker Method& operator=(Method&&) = delete; 252*523fa7a6SAndroid Build Coastguard Worker 253*523fa7a6SAndroid Build Coastguard Worker // Let Program call load(). 254*523fa7a6SAndroid Build Coastguard Worker friend class Program; 255*523fa7a6SAndroid Build Coastguard Worker // Let Executor call the ctor and init(). 256*523fa7a6SAndroid Build Coastguard Worker friend class Executor; 257*523fa7a6SAndroid Build Coastguard Worker 258*523fa7a6SAndroid Build Coastguard Worker enum class InitializationState : uint8_t { 259*523fa7a6SAndroid Build Coastguard Worker Uninitialized, 260*523fa7a6SAndroid Build Coastguard Worker Initialized, 261*523fa7a6SAndroid Build Coastguard Worker InitializationFailed, 262*523fa7a6SAndroid Build Coastguard Worker }; 263*523fa7a6SAndroid Build Coastguard Worker 264*523fa7a6SAndroid Build Coastguard Worker /// Tracks what step in program execution we are on 265*523fa7a6SAndroid Build Coastguard Worker struct StepState { 266*523fa7a6SAndroid Build Coastguard Worker size_t chain_idx; 267*523fa7a6SAndroid Build Coastguard Worker size_t instr_idx; 268*523fa7a6SAndroid Build Coastguard Worker }; 269*523fa7a6SAndroid Build Coastguard Worker Method(const Program * program,MemoryManager * memory_manager,EventTracer * event_tracer,MemoryAllocator * temp_allocator)270*523fa7a6SAndroid Build Coastguard Worker Method( 271*523fa7a6SAndroid Build Coastguard Worker const Program* program, 272*523fa7a6SAndroid Build Coastguard Worker MemoryManager* memory_manager, 273*523fa7a6SAndroid Build Coastguard Worker EventTracer* event_tracer, 274*523fa7a6SAndroid Build Coastguard Worker MemoryAllocator* temp_allocator) 275*523fa7a6SAndroid Build Coastguard Worker : step_state_(), 276*523fa7a6SAndroid Build Coastguard Worker program_(program), 277*523fa7a6SAndroid Build Coastguard Worker memory_manager_(memory_manager), 278*523fa7a6SAndroid Build Coastguard Worker temp_allocator_(temp_allocator), 279*523fa7a6SAndroid Build Coastguard Worker serialization_plan_(nullptr), 280*523fa7a6SAndroid Build Coastguard Worker event_tracer_(event_tracer), 281*523fa7a6SAndroid Build Coastguard Worker n_value_(0), 282*523fa7a6SAndroid Build Coastguard Worker values_(nullptr), 283*523fa7a6SAndroid Build Coastguard Worker n_delegate_(0), 284*523fa7a6SAndroid Build Coastguard Worker delegates_(nullptr), 285*523fa7a6SAndroid Build Coastguard Worker n_chains_(0), 286*523fa7a6SAndroid Build Coastguard Worker chains_(nullptr), 287*523fa7a6SAndroid Build Coastguard Worker init_state_(InitializationState::Uninitialized) {} 288*523fa7a6SAndroid Build Coastguard Worker 289*523fa7a6SAndroid Build Coastguard Worker /// Static factory used by Program. 290*523fa7a6SAndroid Build Coastguard Worker ET_NODISCARD static Result<Method> load( 291*523fa7a6SAndroid Build Coastguard Worker executorch_flatbuffer::ExecutionPlan* s_plan, 292*523fa7a6SAndroid Build Coastguard Worker const Program* program, 293*523fa7a6SAndroid Build Coastguard Worker MemoryManager* memory_manager, 294*523fa7a6SAndroid Build Coastguard Worker EventTracer* event_tracer); 295*523fa7a6SAndroid Build Coastguard Worker 296*523fa7a6SAndroid Build Coastguard Worker /** 297*523fa7a6SAndroid Build Coastguard Worker * Initialize the method from its serialized representation. 298*523fa7a6SAndroid Build Coastguard Worker * 299*523fa7a6SAndroid Build Coastguard Worker * @returns Error::Ok on success, non-Ok on failure. 300*523fa7a6SAndroid Build Coastguard Worker */ 301*523fa7a6SAndroid Build Coastguard Worker ET_NODISCARD Error init(executorch_flatbuffer::ExecutionPlan* s_plan); 302*523fa7a6SAndroid Build Coastguard Worker 303*523fa7a6SAndroid Build Coastguard Worker /// Returns true if the Method was successfully initialized. initialized()304*523fa7a6SAndroid Build Coastguard Worker inline bool initialized() const { 305*523fa7a6SAndroid Build Coastguard Worker return init_state_ == InitializationState::Initialized; 306*523fa7a6SAndroid Build Coastguard Worker } 307*523fa7a6SAndroid Build Coastguard Worker 308*523fa7a6SAndroid Build Coastguard Worker const EValue& get_value(size_t i) const; 309*523fa7a6SAndroid Build Coastguard Worker EValue& mutable_value(size_t i); 310*523fa7a6SAndroid Build Coastguard Worker size_t get_input_index(size_t i) const; 311*523fa7a6SAndroid Build Coastguard Worker size_t get_output_index(size_t i) const; 312*523fa7a6SAndroid Build Coastguard Worker 313*523fa7a6SAndroid Build Coastguard Worker // Executes a single instruction using the state in step_state_ 314*523fa7a6SAndroid Build Coastguard Worker ET_NODISCARD Error execute_instruction(); 315*523fa7a6SAndroid Build Coastguard Worker 316*523fa7a6SAndroid Build Coastguard Worker StepState step_state_; 317*523fa7a6SAndroid Build Coastguard Worker const Program* program_; 318*523fa7a6SAndroid Build Coastguard Worker MemoryManager* memory_manager_; 319*523fa7a6SAndroid Build Coastguard Worker MemoryAllocator* temp_allocator_; 320*523fa7a6SAndroid Build Coastguard Worker executorch_flatbuffer::ExecutionPlan* serialization_plan_; 321*523fa7a6SAndroid Build Coastguard Worker EventTracer* event_tracer_; 322*523fa7a6SAndroid Build Coastguard Worker 323*523fa7a6SAndroid Build Coastguard Worker size_t n_value_; 324*523fa7a6SAndroid Build Coastguard Worker EValue* values_; 325*523fa7a6SAndroid Build Coastguard Worker 326*523fa7a6SAndroid Build Coastguard Worker size_t n_delegate_; 327*523fa7a6SAndroid Build Coastguard Worker BackendDelegate* delegates_; 328*523fa7a6SAndroid Build Coastguard Worker 329*523fa7a6SAndroid Build Coastguard Worker size_t n_chains_; 330*523fa7a6SAndroid Build Coastguard Worker Chain* chains_; 331*523fa7a6SAndroid Build Coastguard Worker 332*523fa7a6SAndroid Build Coastguard Worker InitializationState init_state_; 333*523fa7a6SAndroid Build Coastguard Worker 334*523fa7a6SAndroid Build Coastguard Worker /** 335*523fa7a6SAndroid Build Coastguard Worker * Parses the elements of the values_ array. On error, n_value_ will be set to 336*523fa7a6SAndroid Build Coastguard Worker * the number of successfully-initialized entries so that ~Method doesn't try 337*523fa7a6SAndroid Build Coastguard Worker * to clean up uninitialized entries. 338*523fa7a6SAndroid Build Coastguard Worker */ 339*523fa7a6SAndroid Build Coastguard Worker ET_NODISCARD Error parse_values(); 340*523fa7a6SAndroid Build Coastguard Worker 341*523fa7a6SAndroid Build Coastguard Worker ET_NODISCARD Error resolve_operator( 342*523fa7a6SAndroid Build Coastguard Worker int32_t op_index, 343*523fa7a6SAndroid Build Coastguard Worker OpFunction* kernels, 344*523fa7a6SAndroid Build Coastguard Worker size_t kernel_index, 345*523fa7a6SAndroid Build Coastguard Worker InstructionArgs args, 346*523fa7a6SAndroid Build Coastguard Worker size_t n_args); 347*523fa7a6SAndroid Build Coastguard Worker 348*523fa7a6SAndroid Build Coastguard Worker void log_outputs(); 349*523fa7a6SAndroid Build Coastguard Worker }; 350*523fa7a6SAndroid Build Coastguard Worker 351*523fa7a6SAndroid Build Coastguard Worker } // namespace runtime 352*523fa7a6SAndroid Build Coastguard Worker } // namespace executorch 353*523fa7a6SAndroid Build Coastguard Worker 354*523fa7a6SAndroid Build Coastguard Worker namespace torch { 355*523fa7a6SAndroid Build Coastguard Worker namespace executor { 356*523fa7a6SAndroid Build Coastguard Worker // TODO(T197294990): Remove these deprecated aliases once all users have moved 357*523fa7a6SAndroid Build Coastguard Worker // to the new `::executorch` namespaces. 358*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::Method; 359*523fa7a6SAndroid Build Coastguard Worker } // namespace executor 360*523fa7a6SAndroid Build Coastguard Worker } // namespace torch 361