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