xref: /aosp_15_r20/external/ComputeLibrary/arm_compute/graph/IDeviceBackend.h (revision c217d954acce2dbc11938adb493fc0abd69584f3)
1*c217d954SCole Faust /*
2*c217d954SCole Faust  * Copyright (c) 2018-2019,2021 Arm Limited.
3*c217d954SCole Faust  *
4*c217d954SCole Faust  * SPDX-License-Identifier: MIT
5*c217d954SCole Faust  *
6*c217d954SCole Faust  * Permission is hereby granted, free of charge, to any person obtaining a copy
7*c217d954SCole Faust  * of this software and associated documentation files (the "Software"), to
8*c217d954SCole Faust  * deal in the Software without restriction, including without limitation the
9*c217d954SCole Faust  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10*c217d954SCole Faust  * sell copies of the Software, and to permit persons to whom the Software is
11*c217d954SCole Faust  * furnished to do so, subject to the following conditions:
12*c217d954SCole Faust  *
13*c217d954SCole Faust  * The above copyright notice and this permission notice shall be included in all
14*c217d954SCole Faust  * copies or substantial portions of the Software.
15*c217d954SCole Faust  *
16*c217d954SCole Faust  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*c217d954SCole Faust  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*c217d954SCole Faust  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19*c217d954SCole Faust  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*c217d954SCole Faust  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21*c217d954SCole Faust  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22*c217d954SCole Faust  * SOFTWARE.
23*c217d954SCole Faust  */
24*c217d954SCole Faust #ifndef ARM_COMPUTE_GRAPH_IDEVICEBACKEND_H
25*c217d954SCole Faust #define ARM_COMPUTE_GRAPH_IDEVICEBACKEND_H
26*c217d954SCole Faust 
27*c217d954SCole Faust #include "arm_compute/graph/ITensorHandle.h"
28*c217d954SCole Faust #include "arm_compute/graph/Types.h"
29*c217d954SCole Faust #include "arm_compute/runtime/IFunction.h"
30*c217d954SCole Faust #include "arm_compute/runtime/IMemoryManager.h"
31*c217d954SCole Faust #include "arm_compute/runtime/IWeightsManager.h"
32*c217d954SCole Faust 
33*c217d954SCole Faust #include <memory>
34*c217d954SCole Faust 
35*c217d954SCole Faust namespace arm_compute
36*c217d954SCole Faust {
37*c217d954SCole Faust namespace graph
38*c217d954SCole Faust {
39*c217d954SCole Faust // Forward declarations
40*c217d954SCole Faust class Graph;
41*c217d954SCole Faust class GraphContext;
42*c217d954SCole Faust class Tensor;
43*c217d954SCole Faust class INode;
44*c217d954SCole Faust 
45*c217d954SCole Faust namespace backends
46*c217d954SCole Faust {
47*c217d954SCole Faust /** Device backend interface */
48*c217d954SCole Faust class IDeviceBackend
49*c217d954SCole Faust {
50*c217d954SCole Faust public:
51*c217d954SCole Faust     /** Virtual Destructor */
52*c217d954SCole Faust     virtual ~IDeviceBackend() = default;
53*c217d954SCole Faust     /** Initializes the backend */
54*c217d954SCole Faust     virtual void initialize_backend() = 0;
55*c217d954SCole Faust     /** Setups the given graph context
56*c217d954SCole Faust      *
57*c217d954SCole Faust      * @param[in,out] ctx Graph context
58*c217d954SCole Faust      */
59*c217d954SCole Faust     virtual void setup_backend_context(GraphContext &ctx) = 0;
60*c217d954SCole Faust     /** Release the backend specific resources associated to a given graph context
61*c217d954SCole Faust      *
62*c217d954SCole Faust      * @param[in,out] ctx Graph context
63*c217d954SCole Faust      */
64*c217d954SCole Faust     virtual void release_backend_context(GraphContext &ctx) = 0;
65*c217d954SCole Faust     /** Checks if an instantiated backend is actually supported
66*c217d954SCole Faust      *
67*c217d954SCole Faust      * @return True if the backend is supported else false
68*c217d954SCole Faust      */
69*c217d954SCole Faust     virtual bool is_backend_supported() = 0;
70*c217d954SCole Faust     /** Gets a backend memory allocator
71*c217d954SCole Faust      *
72*c217d954SCole Faust      * @return Backend memory allocator
73*c217d954SCole Faust      */
74*c217d954SCole Faust     virtual IAllocator *backend_allocator() = 0;
75*c217d954SCole Faust     /** Create a backend Tensor
76*c217d954SCole Faust      *
77*c217d954SCole Faust      * @param[in] tensor The tensor we want to create a backend tensor for
78*c217d954SCole Faust      *
79*c217d954SCole Faust      * @return Backend tensor handle
80*c217d954SCole Faust      */
81*c217d954SCole Faust     virtual std::unique_ptr<ITensorHandle> create_tensor(const Tensor &tensor) = 0;
82*c217d954SCole Faust     /** Create a backend Sub-Tensor
83*c217d954SCole Faust      *
84*c217d954SCole Faust      * @param[in] parent        Parent sub-tensor handle
85*c217d954SCole Faust      * @param[in] shape         Shape of the sub-tensor
86*c217d954SCole Faust      * @param[in] coords        Starting coordinates of the sub-tensor
87*c217d954SCole Faust      * @param[in] extend_parent Extends parent shape if true
88*c217d954SCole Faust      *
89*c217d954SCole Faust      * @return Backend sub-tensor handle
90*c217d954SCole Faust      */
91*c217d954SCole Faust     virtual std::unique_ptr<ITensorHandle> create_subtensor(ITensorHandle *parent, TensorShape shape, Coordinates coords, bool extend_parent) = 0;
92*c217d954SCole Faust     /** Configure a backend Node
93*c217d954SCole Faust      *
94*c217d954SCole Faust      * @note This creates an appropriate configured backend function for the given node
95*c217d954SCole Faust      *
96*c217d954SCole Faust      * @param[in] node The node we want to configure
97*c217d954SCole Faust      * @param[in] ctx  Context to use
98*c217d954SCole Faust      *
99*c217d954SCole Faust      * @return Backend execution function
100*c217d954SCole Faust      */
101*c217d954SCole Faust     virtual std::unique_ptr<arm_compute::IFunction> configure_node(INode &node, GraphContext &ctx) = 0;
102*c217d954SCole Faust     /** Validate a node
103*c217d954SCole Faust      *
104*c217d954SCole Faust      * @param[in] node The node we want to validate
105*c217d954SCole Faust      *
106*c217d954SCole Faust      * @return An error status
107*c217d954SCole Faust      */
108*c217d954SCole Faust     virtual Status validate_node(INode &node) = 0;
109*c217d954SCole Faust     /** Create a backend memory manager given its affinity
110*c217d954SCole Faust      *
111*c217d954SCole Faust      * @param[in] affinity Memory Manager affinity
112*c217d954SCole Faust      *
113*c217d954SCole Faust      * @return Memory manager
114*c217d954SCole Faust      */
115*c217d954SCole Faust     virtual std::shared_ptr<arm_compute::IMemoryManager> create_memory_manager(MemoryManagerAffinity affinity) = 0;
116*c217d954SCole Faust     /** Create a backend weights manager
117*c217d954SCole Faust      *
118*c217d954SCole Faust      * @return Weights manager
119*c217d954SCole Faust      */
120*c217d954SCole Faust     virtual std::shared_ptr<arm_compute::IWeightsManager> create_weights_manager() = 0;
121*c217d954SCole Faust     /** Synchronize kernels execution on the backend. On GPU, this results in a blocking call waiting for all kernels to be completed. */
122*c217d954SCole Faust     virtual void sync() = 0;
123*c217d954SCole Faust };
124*c217d954SCole Faust } // namespace backends
125*c217d954SCole Faust } // namespace graph
126*c217d954SCole Faust } // namespace arm_compute
127*c217d954SCole Faust #endif //ARM_COMPUTE_GRAPH_IDEVICEBACKEND_H
128