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