xref: /aosp_15_r20/external/executorch/extension/runner_util/inputs.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 <executorch/runtime/core/span.h>
12*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/executor/method.h>
13*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/executor/method_meta.h>
14*523fa7a6SAndroid Build Coastguard Worker 
15*523fa7a6SAndroid Build Coastguard Worker namespace executorch {
16*523fa7a6SAndroid Build Coastguard Worker namespace extension {
17*523fa7a6SAndroid Build Coastguard Worker 
18*523fa7a6SAndroid Build Coastguard Worker /**
19*523fa7a6SAndroid Build Coastguard Worker  * RAII helper that frees a set of buffers when destroyed. Movable.
20*523fa7a6SAndroid Build Coastguard Worker  */
21*523fa7a6SAndroid Build Coastguard Worker class BufferCleanup final {
22*523fa7a6SAndroid Build Coastguard Worker  public:
23*523fa7a6SAndroid Build Coastguard Worker   /**
24*523fa7a6SAndroid Build Coastguard Worker    * Takes ownership of `buffers.data()` and the elements of `buffers`, which
25*523fa7a6SAndroid Build Coastguard Worker    * each will be passed to `free()` when the object is destroyed.
26*523fa7a6SAndroid Build Coastguard Worker    */
BufferCleanup(executorch::runtime::Span<void * > buffers)27*523fa7a6SAndroid Build Coastguard Worker   explicit BufferCleanup(executorch::runtime::Span<void*> buffers)
28*523fa7a6SAndroid Build Coastguard Worker       : buffers_(buffers) {}
29*523fa7a6SAndroid Build Coastguard Worker 
30*523fa7a6SAndroid Build Coastguard Worker   /**
31*523fa7a6SAndroid Build Coastguard Worker    * Move ctor. Takes ownership of the data previously owned by `rhs`, leaving
32*523fa7a6SAndroid Build Coastguard Worker    * `rhs` with an empty list of buffers.
33*523fa7a6SAndroid Build Coastguard Worker    */
BufferCleanup(BufferCleanup && rhs)34*523fa7a6SAndroid Build Coastguard Worker   BufferCleanup(BufferCleanup&& rhs) noexcept : buffers_(rhs.buffers_) {
35*523fa7a6SAndroid Build Coastguard Worker     rhs.buffers_ = executorch::runtime::Span<void*>();
36*523fa7a6SAndroid Build Coastguard Worker   }
37*523fa7a6SAndroid Build Coastguard Worker 
~BufferCleanup()38*523fa7a6SAndroid Build Coastguard Worker   ~BufferCleanup() {
39*523fa7a6SAndroid Build Coastguard Worker     for (auto buffer : buffers_) {
40*523fa7a6SAndroid Build Coastguard Worker       free(buffer);
41*523fa7a6SAndroid Build Coastguard Worker     }
42*523fa7a6SAndroid Build Coastguard Worker     free(buffers_.data());
43*523fa7a6SAndroid Build Coastguard Worker   }
44*523fa7a6SAndroid Build Coastguard Worker 
45*523fa7a6SAndroid Build Coastguard Worker  private:
46*523fa7a6SAndroid Build Coastguard Worker   // Delete other rule-of-five methods.
47*523fa7a6SAndroid Build Coastguard Worker   BufferCleanup(const BufferCleanup&) = delete;
48*523fa7a6SAndroid Build Coastguard Worker   BufferCleanup& operator=(const BufferCleanup&) = delete;
49*523fa7a6SAndroid Build Coastguard Worker   BufferCleanup& operator=(BufferCleanup&&) noexcept = delete;
50*523fa7a6SAndroid Build Coastguard Worker 
51*523fa7a6SAndroid Build Coastguard Worker   executorch::runtime::Span<void*> buffers_;
52*523fa7a6SAndroid Build Coastguard Worker };
53*523fa7a6SAndroid Build Coastguard Worker 
54*523fa7a6SAndroid Build Coastguard Worker /**
55*523fa7a6SAndroid Build Coastguard Worker  * Allocates input tensors for the provided Method, filling them with ones. Does
56*523fa7a6SAndroid Build Coastguard Worker  * not modify inputs that are not Tensors.
57*523fa7a6SAndroid Build Coastguard Worker  *
58*523fa7a6SAndroid Build Coastguard Worker  * @param[in] method The Method that owns the inputs to prepare.
59*523fa7a6SAndroid Build Coastguard Worker  *
60*523fa7a6SAndroid Build Coastguard Worker  * @returns On success, an object that owns any allocated tensor memory. It must
61*523fa7a6SAndroid Build Coastguard Worker  *     remain alive when calling `method->execute()`.
62*523fa7a6SAndroid Build Coastguard Worker  * @returns An error on failure.
63*523fa7a6SAndroid Build Coastguard Worker  */
64*523fa7a6SAndroid Build Coastguard Worker executorch::runtime::Result<BufferCleanup> prepare_input_tensors(
65*523fa7a6SAndroid Build Coastguard Worker     executorch::runtime::Method& method);
66*523fa7a6SAndroid Build Coastguard Worker 
67*523fa7a6SAndroid Build Coastguard Worker namespace internal {
68*523fa7a6SAndroid Build Coastguard Worker /**
69*523fa7a6SAndroid Build Coastguard Worker  * INTERNAL-ONLY: Creates a Tensor using the provided shape and buffer,
70*523fa7a6SAndroid Build Coastguard Worker  * fills it with ones, and sets the input at `input_index`.
71*523fa7a6SAndroid Build Coastguard Worker  */
72*523fa7a6SAndroid Build Coastguard Worker executorch::runtime::Error fill_and_set_input(
73*523fa7a6SAndroid Build Coastguard Worker     executorch::runtime::Method& method,
74*523fa7a6SAndroid Build Coastguard Worker     executorch::runtime::TensorInfo& tensor_meta,
75*523fa7a6SAndroid Build Coastguard Worker     size_t input_index,
76*523fa7a6SAndroid Build Coastguard Worker     void* data_ptr);
77*523fa7a6SAndroid Build Coastguard Worker } // namespace internal
78*523fa7a6SAndroid Build Coastguard Worker 
79*523fa7a6SAndroid Build Coastguard Worker } // namespace extension
80*523fa7a6SAndroid Build Coastguard Worker } // namespace executorch
81*523fa7a6SAndroid Build Coastguard Worker 
82*523fa7a6SAndroid Build Coastguard Worker namespace torch {
83*523fa7a6SAndroid Build Coastguard Worker namespace executor {
84*523fa7a6SAndroid Build Coastguard Worker namespace util {
85*523fa7a6SAndroid Build Coastguard Worker // TODO(T197294990): Remove these deprecated aliases once all users have moved
86*523fa7a6SAndroid Build Coastguard Worker // to the new `::executorch` namespaces.
87*523fa7a6SAndroid Build Coastguard Worker using ::executorch::extension::BufferCleanup;
88*523fa7a6SAndroid Build Coastguard Worker using ::executorch::extension::prepare_input_tensors;
89*523fa7a6SAndroid Build Coastguard Worker } // namespace util
90*523fa7a6SAndroid Build Coastguard Worker } // namespace executor
91*523fa7a6SAndroid Build Coastguard Worker } // namespace torch
92