xref: /aosp_15_r20/external/armnn/src/backends/cl/ClBackend.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/backends/IBackendInternal.hpp>
8*89c4ff92SAndroid Build Coastguard Worker 
9*89c4ff92SAndroid Build Coastguard Worker #include <arm_compute/core/Types.h>
10*89c4ff92SAndroid Build Coastguard Worker #include <arm_compute/runtime/CL/CLBufferAllocator.h>
11*89c4ff92SAndroid Build Coastguard Worker 
12*89c4ff92SAndroid Build Coastguard Worker #include <aclCommon/BaseMemoryManager.hpp>
13*89c4ff92SAndroid Build Coastguard Worker #include <arm_compute/runtime/CL/CLMemoryRegion.h>
14*89c4ff92SAndroid Build Coastguard Worker 
15*89c4ff92SAndroid Build Coastguard Worker #include <arm_compute/core/CL/CLKernelLibrary.h>
16*89c4ff92SAndroid Build Coastguard Worker #include <CL/cl_ext.h>
17*89c4ff92SAndroid Build Coastguard Worker 
18*89c4ff92SAndroid Build Coastguard Worker // System includes for mapping and unmapping memory
19*89c4ff92SAndroid Build Coastguard Worker #include <sys/mman.h>
20*89c4ff92SAndroid Build Coastguard Worker 
21*89c4ff92SAndroid Build Coastguard Worker namespace armnn
22*89c4ff92SAndroid Build Coastguard Worker {
23*89c4ff92SAndroid Build Coastguard Worker 
24*89c4ff92SAndroid Build Coastguard Worker // add new capabilities here..
25*89c4ff92SAndroid Build Coastguard Worker const BackendCapabilities gpuAccCapabilities("GpuAcc",
26*89c4ff92SAndroid Build Coastguard Worker                                              {
27*89c4ff92SAndroid Build Coastguard Worker                                                      {"NonConstWeights", false},
28*89c4ff92SAndroid Build Coastguard Worker                                                      {"AsyncExecution", false},
29*89c4ff92SAndroid Build Coastguard Worker                                                      {"ProtectedContentAllocation", true},
30*89c4ff92SAndroid Build Coastguard Worker                                                      {"ConstantTensorsAsInputs", true},
31*89c4ff92SAndroid Build Coastguard Worker                                                      {"PreImportIOTensors", false},
32*89c4ff92SAndroid Build Coastguard Worker                                                      {"ExternallyManagedMemory", true},
33*89c4ff92SAndroid Build Coastguard Worker                                                      {"MultiAxisPacking", false},
34*89c4ff92SAndroid Build Coastguard Worker                                                      {"SingleAxisPacking", true}
35*89c4ff92SAndroid Build Coastguard Worker                                              });
36*89c4ff92SAndroid Build Coastguard Worker 
37*89c4ff92SAndroid Build Coastguard Worker class ClBackend : public IBackendInternal
38*89c4ff92SAndroid Build Coastguard Worker {
39*89c4ff92SAndroid Build Coastguard Worker public:
ClBackend()40*89c4ff92SAndroid Build Coastguard Worker     ClBackend() : m_CustomAllocator(nullptr) {};
ClBackend(std::shared_ptr<ICustomAllocator> allocator)41*89c4ff92SAndroid Build Coastguard Worker     ClBackend(std::shared_ptr<ICustomAllocator> allocator)
42*89c4ff92SAndroid Build Coastguard Worker     {
43*89c4ff92SAndroid Build Coastguard Worker         std::string err;
44*89c4ff92SAndroid Build Coastguard Worker         UseCustomMemoryAllocator(allocator, err);
45*89c4ff92SAndroid Build Coastguard Worker     }
46*89c4ff92SAndroid Build Coastguard Worker     ~ClBackend() = default;
47*89c4ff92SAndroid Build Coastguard Worker 
48*89c4ff92SAndroid Build Coastguard Worker     static const BackendId& GetIdStatic();
GetId() const49*89c4ff92SAndroid Build Coastguard Worker     const BackendId& GetId() const override { return GetIdStatic(); }
50*89c4ff92SAndroid Build Coastguard Worker 
51*89c4ff92SAndroid Build Coastguard Worker     IBackendInternal::IMemoryManagerUniquePtr CreateMemoryManager() const override;
52*89c4ff92SAndroid Build Coastguard Worker 
53*89c4ff92SAndroid Build Coastguard Worker     IBackendInternal::IWorkloadFactoryPtr CreateWorkloadFactory(
54*89c4ff92SAndroid Build Coastguard Worker         const IBackendInternal::IMemoryManagerSharedPtr& memoryManager = nullptr) const override;
55*89c4ff92SAndroid Build Coastguard Worker 
56*89c4ff92SAndroid Build Coastguard Worker     IBackendInternal::IWorkloadFactoryPtr CreateWorkloadFactory(
57*89c4ff92SAndroid Build Coastguard Worker         TensorHandleFactoryRegistry& registry) const override;
58*89c4ff92SAndroid Build Coastguard Worker 
59*89c4ff92SAndroid Build Coastguard Worker     IWorkloadFactoryPtr CreateWorkloadFactory(const IMemoryManagerSharedPtr& memoryManager,
60*89c4ff92SAndroid Build Coastguard Worker                                               const ModelOptions& modelOptions) const override;
61*89c4ff92SAndroid Build Coastguard Worker 
62*89c4ff92SAndroid Build Coastguard Worker     IWorkloadFactoryPtr CreateWorkloadFactory(class TensorHandleFactoryRegistry& tensorHandleFactoryRegistry,
63*89c4ff92SAndroid Build Coastguard Worker                                               const ModelOptions& modelOptions) const override;
64*89c4ff92SAndroid Build Coastguard Worker 
65*89c4ff92SAndroid Build Coastguard Worker     IWorkloadFactoryPtr CreateWorkloadFactory(class TensorHandleFactoryRegistry& tensorHandleFactoryRegistry,
66*89c4ff92SAndroid Build Coastguard Worker                                               const ModelOptions& modelOptions,
67*89c4ff92SAndroid Build Coastguard Worker                                               MemorySourceFlags inputFlags,
68*89c4ff92SAndroid Build Coastguard Worker                                               MemorySourceFlags outputFlags) const override;
69*89c4ff92SAndroid Build Coastguard Worker 
70*89c4ff92SAndroid Build Coastguard Worker     std::vector<ITensorHandleFactory::FactoryId> GetHandleFactoryPreferences() const override;
71*89c4ff92SAndroid Build Coastguard Worker 
72*89c4ff92SAndroid Build Coastguard Worker     void RegisterTensorHandleFactories(TensorHandleFactoryRegistry& registry) override;
73*89c4ff92SAndroid Build Coastguard Worker 
74*89c4ff92SAndroid Build Coastguard Worker     void RegisterTensorHandleFactories(TensorHandleFactoryRegistry& registry,
75*89c4ff92SAndroid Build Coastguard Worker                                        MemorySourceFlags inputFlags,
76*89c4ff92SAndroid Build Coastguard Worker                                        MemorySourceFlags outputFlags) override;
77*89c4ff92SAndroid Build Coastguard Worker 
78*89c4ff92SAndroid Build Coastguard Worker     IBackendInternal::IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const override;
79*89c4ff92SAndroid Build Coastguard Worker     IBackendInternal::IBackendProfilingContextPtr CreateBackendProfilingContext(
80*89c4ff92SAndroid Build Coastguard Worker         const IRuntime::CreationOptions&, IBackendProfilingPtr& backendProfiling) override;
81*89c4ff92SAndroid Build Coastguard Worker 
82*89c4ff92SAndroid Build Coastguard Worker     IBackendInternal::ILayerSupportSharedPtr GetLayerSupport() const override;
83*89c4ff92SAndroid Build Coastguard Worker     IBackendInternal::ILayerSupportSharedPtr GetLayerSupport(const ModelOptions& modelOptions) const override;
84*89c4ff92SAndroid Build Coastguard Worker 
85*89c4ff92SAndroid Build Coastguard Worker     OptimizationViews OptimizeSubgraphView(const SubgraphView& subgraph,
86*89c4ff92SAndroid Build Coastguard Worker                                            const ModelOptions& modelOptions) const override;
87*89c4ff92SAndroid Build Coastguard Worker 
88*89c4ff92SAndroid Build Coastguard Worker     IBackendInternal::IBackendSpecificModelContextPtr CreateBackendSpecificModelContext(
89*89c4ff92SAndroid Build Coastguard Worker         const ModelOptions& modelOptions) const override;
90*89c4ff92SAndroid Build Coastguard Worker 
91*89c4ff92SAndroid Build Coastguard Worker     std::unique_ptr<ICustomAllocator> GetDefaultAllocator() const override;
92*89c4ff92SAndroid Build Coastguard Worker 
GetCapabilities() const93*89c4ff92SAndroid Build Coastguard Worker     BackendCapabilities GetCapabilities() const override
94*89c4ff92SAndroid Build Coastguard Worker     {
95*89c4ff92SAndroid Build Coastguard Worker         return gpuAccCapabilities;
96*89c4ff92SAndroid Build Coastguard Worker     };
97*89c4ff92SAndroid Build Coastguard Worker 
UseCustomMemoryAllocator(std::shared_ptr<ICustomAllocator> allocator,armnn::Optional<std::string &> errMsg)98*89c4ff92SAndroid Build Coastguard Worker     virtual bool UseCustomMemoryAllocator(std::shared_ptr<ICustomAllocator> allocator,
99*89c4ff92SAndroid Build Coastguard Worker                                           armnn::Optional<std::string&> errMsg) override
100*89c4ff92SAndroid Build Coastguard Worker     {
101*89c4ff92SAndroid Build Coastguard Worker         IgnoreUnused(errMsg);
102*89c4ff92SAndroid Build Coastguard Worker         ARMNN_LOG(info) << "Using Custom Allocator for ClBackend";
103*89c4ff92SAndroid Build Coastguard Worker 
104*89c4ff92SAndroid Build Coastguard Worker         // Set flag to signal the backend to use a custom memory allocator
105*89c4ff92SAndroid Build Coastguard Worker         m_CustomAllocator = std::make_shared<ClBackendCustomAllocatorWrapper>(std::move(allocator));
106*89c4ff92SAndroid Build Coastguard Worker         m_UsingCustomAllocator = true;
107*89c4ff92SAndroid Build Coastguard Worker         return m_UsingCustomAllocator;
108*89c4ff92SAndroid Build Coastguard Worker     }
109*89c4ff92SAndroid Build Coastguard Worker 
GetNumberOfCacheFiles() const110*89c4ff92SAndroid Build Coastguard Worker     virtual unsigned int GetNumberOfCacheFiles() const override { return 1; }
111*89c4ff92SAndroid Build Coastguard Worker 
112*89c4ff92SAndroid Build Coastguard Worker     // Cl requires a arm_compute::IAllocator we wrap the Arm NN ICustomAllocator to achieve this
113*89c4ff92SAndroid Build Coastguard Worker     class ClBackendCustomAllocatorWrapper : public arm_compute::IAllocator
114*89c4ff92SAndroid Build Coastguard Worker     {
115*89c4ff92SAndroid Build Coastguard Worker     public:
ClBackendCustomAllocatorWrapper(std::shared_ptr<ICustomAllocator> alloc)116*89c4ff92SAndroid Build Coastguard Worker         ClBackendCustomAllocatorWrapper(std::shared_ptr<ICustomAllocator> alloc) : m_CustomAllocator(alloc)
117*89c4ff92SAndroid Build Coastguard Worker         {}
118*89c4ff92SAndroid Build Coastguard Worker         // Inherited methods overridden:
allocate(size_t size,size_t alignment)119*89c4ff92SAndroid Build Coastguard Worker         void* allocate(size_t size, size_t alignment) override
120*89c4ff92SAndroid Build Coastguard Worker         {
121*89c4ff92SAndroid Build Coastguard Worker             auto alloc = m_CustomAllocator->allocate(size, alignment);
122*89c4ff92SAndroid Build Coastguard Worker             return MapAllocatedMemory(alloc, size, m_CustomAllocator->GetMemorySourceType());
123*89c4ff92SAndroid Build Coastguard Worker         }
free(void * ptr)124*89c4ff92SAndroid Build Coastguard Worker         void free(void* ptr) override
125*89c4ff92SAndroid Build Coastguard Worker         {
126*89c4ff92SAndroid Build Coastguard Worker             auto hostMemPtr = m_AllocatedBufferMappings[ptr];
127*89c4ff92SAndroid Build Coastguard Worker             clReleaseMemObject(static_cast<cl_mem>(ptr));
128*89c4ff92SAndroid Build Coastguard Worker             m_CustomAllocator->free(hostMemPtr);
129*89c4ff92SAndroid Build Coastguard Worker         }
make_region(size_t size,size_t alignment)130*89c4ff92SAndroid Build Coastguard Worker         std::unique_ptr<arm_compute::IMemoryRegion> make_region(size_t size, size_t alignment) override
131*89c4ff92SAndroid Build Coastguard Worker         {
132*89c4ff92SAndroid Build Coastguard Worker             auto hostMemPtr = m_CustomAllocator->allocate(size, alignment);
133*89c4ff92SAndroid Build Coastguard Worker             cl_mem buffer = MapAllocatedMemory(hostMemPtr, size, m_CustomAllocator->GetMemorySourceType());
134*89c4ff92SAndroid Build Coastguard Worker 
135*89c4ff92SAndroid Build Coastguard Worker             return std::make_unique<ClBackendCustomAllocatorMemoryRegion>(cl::Buffer(buffer),
136*89c4ff92SAndroid Build Coastguard Worker                                                                           hostMemPtr,
137*89c4ff92SAndroid Build Coastguard Worker                                                                           m_CustomAllocator->GetMemorySourceType());
138*89c4ff92SAndroid Build Coastguard Worker         }
139*89c4ff92SAndroid Build Coastguard Worker     private:
MapAllocatedMemory(void * memory,size_t size,MemorySource source)140*89c4ff92SAndroid Build Coastguard Worker         cl_mem MapAllocatedMemory(void* memory, size_t size, MemorySource source)
141*89c4ff92SAndroid Build Coastguard Worker         {
142*89c4ff92SAndroid Build Coastguard Worker             // Round the size of the buffer to a multiple of the CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE
143*89c4ff92SAndroid Build Coastguard Worker             auto cachelineAlignment =
144*89c4ff92SAndroid Build Coastguard Worker                     arm_compute::CLKernelLibrary::get().get_device().getInfo<CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE>();
145*89c4ff92SAndroid Build Coastguard Worker             auto roundedSize = cachelineAlignment + size - (size % cachelineAlignment);
146*89c4ff92SAndroid Build Coastguard Worker 
147*89c4ff92SAndroid Build Coastguard Worker             if (source == MemorySource::Malloc)
148*89c4ff92SAndroid Build Coastguard Worker             {
149*89c4ff92SAndroid Build Coastguard Worker                 const cl_import_properties_arm importProperties[] =
150*89c4ff92SAndroid Build Coastguard Worker                         {
151*89c4ff92SAndroid Build Coastguard Worker                             CL_IMPORT_TYPE_ARM,
152*89c4ff92SAndroid Build Coastguard Worker                             CL_IMPORT_TYPE_HOST_ARM,
153*89c4ff92SAndroid Build Coastguard Worker                             0
154*89c4ff92SAndroid Build Coastguard Worker                         };
155*89c4ff92SAndroid Build Coastguard Worker                 cl_int error = CL_SUCCESS;
156*89c4ff92SAndroid Build Coastguard Worker                 cl_mem buffer = clImportMemoryARM(arm_compute::CLKernelLibrary::get().context().get(),
157*89c4ff92SAndroid Build Coastguard Worker                                                   CL_MEM_READ_WRITE,
158*89c4ff92SAndroid Build Coastguard Worker                                                   importProperties,
159*89c4ff92SAndroid Build Coastguard Worker                                                   memory,
160*89c4ff92SAndroid Build Coastguard Worker                                                   roundedSize,
161*89c4ff92SAndroid Build Coastguard Worker                                                   &error);
162*89c4ff92SAndroid Build Coastguard Worker                 if (error == CL_SUCCESS)
163*89c4ff92SAndroid Build Coastguard Worker                 {
164*89c4ff92SAndroid Build Coastguard Worker                     m_AllocatedBufferMappings.insert(std::make_pair(static_cast<void *>(buffer), memory));
165*89c4ff92SAndroid Build Coastguard Worker                     return buffer;
166*89c4ff92SAndroid Build Coastguard Worker                 }
167*89c4ff92SAndroid Build Coastguard Worker                 throw armnn::Exception(
168*89c4ff92SAndroid Build Coastguard Worker                     "Mapping allocated memory from CustomMemoryAllocator failed, errcode: " + std::to_string(error));
169*89c4ff92SAndroid Build Coastguard Worker             }
170*89c4ff92SAndroid Build Coastguard Worker             else if (source == MemorySource::DmaBuf)
171*89c4ff92SAndroid Build Coastguard Worker             {
172*89c4ff92SAndroid Build Coastguard Worker                 const cl_import_properties_arm importProperties[] =
173*89c4ff92SAndroid Build Coastguard Worker                         {
174*89c4ff92SAndroid Build Coastguard Worker                             CL_IMPORT_TYPE_ARM,
175*89c4ff92SAndroid Build Coastguard Worker                             CL_IMPORT_TYPE_DMA_BUF_ARM,
176*89c4ff92SAndroid Build Coastguard Worker                             CL_IMPORT_DMA_BUF_DATA_CONSISTENCY_WITH_HOST_ARM,
177*89c4ff92SAndroid Build Coastguard Worker                             CL_TRUE,
178*89c4ff92SAndroid Build Coastguard Worker                             0
179*89c4ff92SAndroid Build Coastguard Worker                         };
180*89c4ff92SAndroid Build Coastguard Worker                 cl_int error = CL_SUCCESS;
181*89c4ff92SAndroid Build Coastguard Worker                 cl_mem buffer = clImportMemoryARM(arm_compute::CLKernelLibrary::get().context().get(),
182*89c4ff92SAndroid Build Coastguard Worker                                                   CL_MEM_READ_WRITE,
183*89c4ff92SAndroid Build Coastguard Worker                                                   importProperties,
184*89c4ff92SAndroid Build Coastguard Worker                                                   memory,
185*89c4ff92SAndroid Build Coastguard Worker                                                   roundedSize,
186*89c4ff92SAndroid Build Coastguard Worker                                                   &error);
187*89c4ff92SAndroid Build Coastguard Worker                 if (error == CL_SUCCESS)
188*89c4ff92SAndroid Build Coastguard Worker                 {
189*89c4ff92SAndroid Build Coastguard Worker                     m_AllocatedBufferMappings.insert(std::make_pair(static_cast<void *>(buffer), memory));
190*89c4ff92SAndroid Build Coastguard Worker                     return buffer;
191*89c4ff92SAndroid Build Coastguard Worker                 }
192*89c4ff92SAndroid Build Coastguard Worker                 throw armnn::Exception(
193*89c4ff92SAndroid Build Coastguard Worker                         "Mapping allocated memory from CustomMemoryAllocator failed, errcode: "
194*89c4ff92SAndroid Build Coastguard Worker                          + std::to_string(error));
195*89c4ff92SAndroid Build Coastguard Worker             }
196*89c4ff92SAndroid Build Coastguard Worker             else if (source == MemorySource::DmaBufProtected)
197*89c4ff92SAndroid Build Coastguard Worker             {
198*89c4ff92SAndroid Build Coastguard Worker                 const cl_import_properties_arm importProperties[] =
199*89c4ff92SAndroid Build Coastguard Worker                         {
200*89c4ff92SAndroid Build Coastguard Worker                                 CL_IMPORT_TYPE_ARM,
201*89c4ff92SAndroid Build Coastguard Worker                                 CL_IMPORT_TYPE_DMA_BUF_ARM,
202*89c4ff92SAndroid Build Coastguard Worker                                 CL_IMPORT_TYPE_PROTECTED_ARM,
203*89c4ff92SAndroid Build Coastguard Worker                                 CL_TRUE,
204*89c4ff92SAndroid Build Coastguard Worker                                 0
205*89c4ff92SAndroid Build Coastguard Worker                         };
206*89c4ff92SAndroid Build Coastguard Worker                 cl_int error = CL_SUCCESS;
207*89c4ff92SAndroid Build Coastguard Worker                 cl_mem buffer = clImportMemoryARM(arm_compute::CLKernelLibrary::get().context().get(),
208*89c4ff92SAndroid Build Coastguard Worker                                                   CL_MEM_READ_WRITE,
209*89c4ff92SAndroid Build Coastguard Worker                                                   importProperties,
210*89c4ff92SAndroid Build Coastguard Worker                                                   memory,
211*89c4ff92SAndroid Build Coastguard Worker                                                   roundedSize,
212*89c4ff92SAndroid Build Coastguard Worker                                                   &error);
213*89c4ff92SAndroid Build Coastguard Worker                 if (error == CL_SUCCESS)
214*89c4ff92SAndroid Build Coastguard Worker                 {
215*89c4ff92SAndroid Build Coastguard Worker                     m_AllocatedBufferMappings.insert(std::make_pair(static_cast<void *>(buffer), memory));
216*89c4ff92SAndroid Build Coastguard Worker                     return buffer;
217*89c4ff92SAndroid Build Coastguard Worker                 }
218*89c4ff92SAndroid Build Coastguard Worker                 throw armnn::Exception(
219*89c4ff92SAndroid Build Coastguard Worker                         "Mapping allocated memory from CustomMemoryAllocator failed, errcode: "
220*89c4ff92SAndroid Build Coastguard Worker                          + std::to_string(error));
221*89c4ff92SAndroid Build Coastguard Worker             }
222*89c4ff92SAndroid Build Coastguard Worker             throw armnn::Exception(
223*89c4ff92SAndroid Build Coastguard Worker                     "Attempting to allocate memory with unsupported MemorySource type in CustomAllocator");
224*89c4ff92SAndroid Build Coastguard Worker         }
225*89c4ff92SAndroid Build Coastguard Worker         std::shared_ptr<ICustomAllocator> m_CustomAllocator;
226*89c4ff92SAndroid Build Coastguard Worker         std::map<void*, void*> m_AllocatedBufferMappings;
227*89c4ff92SAndroid Build Coastguard Worker     };
228*89c4ff92SAndroid Build Coastguard Worker 
229*89c4ff92SAndroid Build Coastguard Worker     class ClBackendCustomAllocatorMemoryRegion : public arm_compute::ICLMemoryRegion
230*89c4ff92SAndroid Build Coastguard Worker     {
231*89c4ff92SAndroid Build Coastguard Worker     public:
232*89c4ff92SAndroid Build Coastguard Worker         // We need to have a new version of ICLMemoryRegion which holds a hostMemPtr to allow for cpu copy access
ClBackendCustomAllocatorMemoryRegion(const cl::Buffer & buffer,void * hostMemPtr,armnn::MemorySource source)233*89c4ff92SAndroid Build Coastguard Worker         ClBackendCustomAllocatorMemoryRegion(const cl::Buffer &buffer, void* hostMemPtr, armnn::MemorySource source)
234*89c4ff92SAndroid Build Coastguard Worker             : ICLMemoryRegion(buffer.getInfo<CL_MEM_SIZE>())
235*89c4ff92SAndroid Build Coastguard Worker         {
236*89c4ff92SAndroid Build Coastguard Worker             _mem = buffer;
237*89c4ff92SAndroid Build Coastguard Worker             m_HostMemPtr = hostMemPtr;
238*89c4ff92SAndroid Build Coastguard Worker             m_MemorySource = source;
239*89c4ff92SAndroid Build Coastguard Worker         }
240*89c4ff92SAndroid Build Coastguard Worker 
241*89c4ff92SAndroid Build Coastguard Worker         // Inherited methods overridden :
ptr()242*89c4ff92SAndroid Build Coastguard Worker         void* ptr() override
243*89c4ff92SAndroid Build Coastguard Worker         {
244*89c4ff92SAndroid Build Coastguard Worker             return nullptr;
245*89c4ff92SAndroid Build Coastguard Worker         }
246*89c4ff92SAndroid Build Coastguard Worker 
map(cl::CommandQueue & q,bool blocking)247*89c4ff92SAndroid Build Coastguard Worker         void* map(cl::CommandQueue &q, bool blocking) override
248*89c4ff92SAndroid Build Coastguard Worker         {
249*89c4ff92SAndroid Build Coastguard Worker             armnn::IgnoreUnused(q, blocking);
250*89c4ff92SAndroid Build Coastguard Worker             if (m_HostMemPtr == nullptr)
251*89c4ff92SAndroid Build Coastguard Worker             {
252*89c4ff92SAndroid Build Coastguard Worker                 throw armnn::Exception("ClBackend: Attempting to map memory with an invalid host ptr");
253*89c4ff92SAndroid Build Coastguard Worker             }
254*89c4ff92SAndroid Build Coastguard Worker             if (_mapping != nullptr)
255*89c4ff92SAndroid Build Coastguard Worker             {
256*89c4ff92SAndroid Build Coastguard Worker                 throw armnn::Exception("ClBackend: Attempting to map memory which has not yet been unmapped");
257*89c4ff92SAndroid Build Coastguard Worker             }
258*89c4ff92SAndroid Build Coastguard Worker             switch (m_MemorySource)
259*89c4ff92SAndroid Build Coastguard Worker             {
260*89c4ff92SAndroid Build Coastguard Worker                 case armnn::MemorySource::Malloc:
261*89c4ff92SAndroid Build Coastguard Worker                     _mapping = m_HostMemPtr;
262*89c4ff92SAndroid Build Coastguard Worker                     return _mapping;
263*89c4ff92SAndroid Build Coastguard Worker                     break;
264*89c4ff92SAndroid Build Coastguard Worker                 case armnn::MemorySource::DmaBuf:
265*89c4ff92SAndroid Build Coastguard Worker                 case armnn::MemorySource::DmaBufProtected:
266*89c4ff92SAndroid Build Coastguard Worker                     // If the source is a Dmabuf then the memory ptr should be pointing to an integer value for the fd
267*89c4ff92SAndroid Build Coastguard Worker                     _mapping = mmap(NULL, _size, PROT_WRITE, MAP_SHARED, *(reinterpret_cast<int*>(m_HostMemPtr)), 0);
268*89c4ff92SAndroid Build Coastguard Worker                     return _mapping;
269*89c4ff92SAndroid Build Coastguard Worker                     break;
270*89c4ff92SAndroid Build Coastguard Worker                 default:
271*89c4ff92SAndroid Build Coastguard Worker                     throw armnn::Exception("ClBackend: Attempting to map imported memory without a valid source");
272*89c4ff92SAndroid Build Coastguard Worker                     break;
273*89c4ff92SAndroid Build Coastguard Worker             }
274*89c4ff92SAndroid Build Coastguard Worker         }
275*89c4ff92SAndroid Build Coastguard Worker 
unmap(cl::CommandQueue & q)276*89c4ff92SAndroid Build Coastguard Worker         void unmap(cl::CommandQueue &q) override
277*89c4ff92SAndroid Build Coastguard Worker         {
278*89c4ff92SAndroid Build Coastguard Worker             armnn::IgnoreUnused(q);
279*89c4ff92SAndroid Build Coastguard Worker             switch (m_MemorySource)
280*89c4ff92SAndroid Build Coastguard Worker             {
281*89c4ff92SAndroid Build Coastguard Worker                 case armnn::MemorySource::Malloc:
282*89c4ff92SAndroid Build Coastguard Worker                     _mapping = nullptr;
283*89c4ff92SAndroid Build Coastguard Worker                     break;
284*89c4ff92SAndroid Build Coastguard Worker                 case armnn::MemorySource::DmaBuf:
285*89c4ff92SAndroid Build Coastguard Worker                 case armnn::MemorySource::DmaBufProtected:
286*89c4ff92SAndroid Build Coastguard Worker                     munmap(_mapping, _size);
287*89c4ff92SAndroid Build Coastguard Worker                     _mapping = nullptr;
288*89c4ff92SAndroid Build Coastguard Worker                     break;
289*89c4ff92SAndroid Build Coastguard Worker                 default:
290*89c4ff92SAndroid Build Coastguard Worker                     throw armnn::Exception("ClBackend: Attempting to unmap imported memory without a valid source");
291*89c4ff92SAndroid Build Coastguard Worker                     break;
292*89c4ff92SAndroid Build Coastguard Worker             }
293*89c4ff92SAndroid Build Coastguard Worker         }
294*89c4ff92SAndroid Build Coastguard Worker     private:
295*89c4ff92SAndroid Build Coastguard Worker         void* m_HostMemPtr = nullptr;
296*89c4ff92SAndroid Build Coastguard Worker         armnn::MemorySource m_MemorySource;
297*89c4ff92SAndroid Build Coastguard Worker     };
298*89c4ff92SAndroid Build Coastguard Worker 
299*89c4ff92SAndroid Build Coastguard Worker     std::shared_ptr<ClBackendCustomAllocatorWrapper> m_CustomAllocator;
300*89c4ff92SAndroid Build Coastguard Worker     bool m_UsingCustomAllocator = false;
301*89c4ff92SAndroid Build Coastguard Worker };
302*89c4ff92SAndroid Build Coastguard Worker 
303*89c4ff92SAndroid Build Coastguard Worker } // namespace armnn
304