xref: /aosp_15_r20/external/armnn/include/armnn/backends/ITensorHandle.hpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2017 Arm Ltd. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker #pragma once
6*89c4ff92SAndroid Build Coastguard Worker 
7*89c4ff92SAndroid Build Coastguard Worker #include <armnn/MemorySources.hpp>
8*89c4ff92SAndroid Build Coastguard Worker #include <armnn/utility/IgnoreUnused.hpp>
9*89c4ff92SAndroid Build Coastguard Worker 
10*89c4ff92SAndroid Build Coastguard Worker namespace armnn
11*89c4ff92SAndroid Build Coastguard Worker {
12*89c4ff92SAndroid Build Coastguard Worker 
13*89c4ff92SAndroid Build Coastguard Worker class TensorShape;
14*89c4ff92SAndroid Build Coastguard Worker 
15*89c4ff92SAndroid Build Coastguard Worker class ITensorHandle
16*89c4ff92SAndroid Build Coastguard Worker {
17*89c4ff92SAndroid Build Coastguard Worker public:
~ITensorHandle()18*89c4ff92SAndroid Build Coastguard Worker     virtual ~ITensorHandle(){}
19*89c4ff92SAndroid Build Coastguard Worker 
20*89c4ff92SAndroid Build Coastguard Worker     /// Indicate to the memory manager that this resource is active.
21*89c4ff92SAndroid Build Coastguard Worker     /// This is used to compute overlapping lifetimes of resources.
22*89c4ff92SAndroid Build Coastguard Worker     virtual void Manage() = 0;
23*89c4ff92SAndroid Build Coastguard Worker 
24*89c4ff92SAndroid Build Coastguard Worker     /// Indicate to the memory manager that this resource is no longer active.
25*89c4ff92SAndroid Build Coastguard Worker     /// This is used to compute overlapping lifetimes of resources.
26*89c4ff92SAndroid Build Coastguard Worker     virtual void Allocate() = 0;
27*89c4ff92SAndroid Build Coastguard Worker 
28*89c4ff92SAndroid Build Coastguard Worker     /// Get the parent tensor if this is a subtensor.
29*89c4ff92SAndroid Build Coastguard Worker     /// \return a pointer to the parent tensor. Otherwise nullptr if not a subtensor.
30*89c4ff92SAndroid Build Coastguard Worker     virtual ITensorHandle* GetParent() const = 0;
31*89c4ff92SAndroid Build Coastguard Worker 
32*89c4ff92SAndroid Build Coastguard Worker     /// Map the tensor data for access.
33*89c4ff92SAndroid Build Coastguard Worker     /// \param blocking hint to block the calling thread until all other accesses are complete. (backend dependent)
34*89c4ff92SAndroid Build Coastguard Worker     /// \return pointer to the first element of the mapped data.
35*89c4ff92SAndroid Build Coastguard Worker     virtual const void* Map(bool blocking=true) const = 0;
36*89c4ff92SAndroid Build Coastguard Worker 
37*89c4ff92SAndroid Build Coastguard Worker     /// Unmap the tensor data
38*89c4ff92SAndroid Build Coastguard Worker     virtual void Unmap() const = 0;
39*89c4ff92SAndroid Build Coastguard Worker 
40*89c4ff92SAndroid Build Coastguard Worker     /// Map the tensor data for access. Must be paired with call to Unmap().
41*89c4ff92SAndroid Build Coastguard Worker     /// \param blocking hint to block the calling thread until all other accesses are complete. (backend dependent)
42*89c4ff92SAndroid Build Coastguard Worker     /// \return pointer to the first element of the mapped data.
Map(bool blocking=true)43*89c4ff92SAndroid Build Coastguard Worker     void* Map(bool blocking=true)
44*89c4ff92SAndroid Build Coastguard Worker     {
45*89c4ff92SAndroid Build Coastguard Worker         return const_cast<void*>(static_cast<const ITensorHandle*>(this)->Map(blocking));
46*89c4ff92SAndroid Build Coastguard Worker     }
47*89c4ff92SAndroid Build Coastguard Worker 
48*89c4ff92SAndroid Build Coastguard Worker     /// Unmap the tensor data that was previously mapped with call to Map().
Unmap()49*89c4ff92SAndroid Build Coastguard Worker     void Unmap()
50*89c4ff92SAndroid Build Coastguard Worker     {
51*89c4ff92SAndroid Build Coastguard Worker         return static_cast<const ITensorHandle*>(this)->Unmap();
52*89c4ff92SAndroid Build Coastguard Worker     }
53*89c4ff92SAndroid Build Coastguard Worker 
54*89c4ff92SAndroid Build Coastguard Worker     /// Get the strides for each dimension ordered from largest to smallest where
55*89c4ff92SAndroid Build Coastguard Worker     /// the smallest value is the same as the size of a single element in the tensor.
56*89c4ff92SAndroid Build Coastguard Worker     /// \return a TensorShape filled with the strides for each dimension
57*89c4ff92SAndroid Build Coastguard Worker     virtual TensorShape GetStrides() const = 0;
58*89c4ff92SAndroid Build Coastguard Worker 
59*89c4ff92SAndroid Build Coastguard Worker     /// Get the number of elements for each dimension ordered from slowest iterating dimension
60*89c4ff92SAndroid Build Coastguard Worker     /// to fastest iterating dimension.
61*89c4ff92SAndroid Build Coastguard Worker     /// \return a TensorShape filled with the number of elements for each dimension.
62*89c4ff92SAndroid Build Coastguard Worker     virtual TensorShape GetShape() const = 0;
63*89c4ff92SAndroid Build Coastguard Worker 
64*89c4ff92SAndroid Build Coastguard Worker     /// Testing support to be able to verify and set tensor data content
65*89c4ff92SAndroid Build Coastguard Worker     virtual void CopyOutTo(void* memory) const = 0;
66*89c4ff92SAndroid Build Coastguard Worker     virtual void CopyInFrom(const void* memory) = 0;
67*89c4ff92SAndroid Build Coastguard Worker 
68*89c4ff92SAndroid Build Coastguard Worker     /// Get flags describing supported import sources.
GetImportFlags() const69*89c4ff92SAndroid Build Coastguard Worker     virtual unsigned int GetImportFlags() const { return 0; }
70*89c4ff92SAndroid Build Coastguard Worker 
71*89c4ff92SAndroid Build Coastguard Worker     /// Import externally allocated memory
72*89c4ff92SAndroid Build Coastguard Worker     /// \param memory base address of the memory being imported.
73*89c4ff92SAndroid Build Coastguard Worker     /// \param source source of the allocation for the memory being imported.
74*89c4ff92SAndroid Build Coastguard Worker     /// \return true on success or false on failure
Import(void * memory,MemorySource source)75*89c4ff92SAndroid Build Coastguard Worker     virtual bool Import(void* memory, MemorySource source)
76*89c4ff92SAndroid Build Coastguard Worker     {
77*89c4ff92SAndroid Build Coastguard Worker         IgnoreUnused(memory, source);
78*89c4ff92SAndroid Build Coastguard Worker         return false;
79*89c4ff92SAndroid Build Coastguard Worker     };
80*89c4ff92SAndroid Build Coastguard Worker 
81*89c4ff92SAndroid Build Coastguard Worker     /// Implementations must determine if this memory block can be imported.
82*89c4ff92SAndroid Build Coastguard Worker     /// This might be based on alignment or memory source type.
83*89c4ff92SAndroid Build Coastguard Worker     /// \return true if this memory can be imported.
84*89c4ff92SAndroid Build Coastguard Worker     /// \return false by default, cannot be imported.
CanBeImported(void * memory,MemorySource source)85*89c4ff92SAndroid Build Coastguard Worker     virtual bool CanBeImported(void* memory, MemorySource source)
86*89c4ff92SAndroid Build Coastguard Worker     {
87*89c4ff92SAndroid Build Coastguard Worker         IgnoreUnused(memory, source);
88*89c4ff92SAndroid Build Coastguard Worker         return false;
89*89c4ff92SAndroid Build Coastguard Worker     };
90*89c4ff92SAndroid Build Coastguard Worker 
91*89c4ff92SAndroid Build Coastguard Worker     /// Unimport externally allocated memory
Unimport()92*89c4ff92SAndroid Build Coastguard Worker     virtual void Unimport()
93*89c4ff92SAndroid Build Coastguard Worker     {};
94*89c4ff92SAndroid Build Coastguard Worker };
95*89c4ff92SAndroid Build Coastguard Worker 
96*89c4ff92SAndroid Build Coastguard Worker }
97