/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ /*! * \file src/runtime/contrib/arm_compute_lib/acl_allocator.h * \brief ACL Allocator implementation that requests memory from TVM. */ #ifndef TVM_RUNTIME_CONTRIB_ARM_COMPUTE_LIB_ACL_ALLOCATOR_H_ #define TVM_RUNTIME_CONTRIB_ARM_COMPUTE_LIB_ACL_ALLOCATOR_H_ #include #include #include #include #include #include #include namespace tvm { namespace runtime { namespace contrib { /*! * \brief Override ACL memory allocator and replace with TVM workspace based allocation. */ class ACLAllocator : public arm_compute::IAllocator { public: ACLAllocator() = default; /*! * \brief Allocate bytes to ACL runtime. * * Specific implementation requests memory from TVM using their device api. * * \param size Size to allocate. * \param alignment Alignment that the returned pointer should comply with. * \return A pointer to the allocated memory. */ void* allocate(size_t size, size_t alignment) override; /*! * \brief Free memory from ACL runtime. * * \param ptr Pointer to workspace to free. */ void free(void* ptr) override; /*! * \brief Create self-managed memory region. * * \param size Size of the memory region. * \param alignment Alignment of the memory region. * \return The memory region object. */ std::unique_ptr make_region(size_t size, size_t alignment) override; private: /*! \brief Always allocate data in the context of the current CPU. */ const Device device_{kDLCPU, 0}; /*! \brief Device API which allows requests for memory from TVM. */ runtime::DeviceAPI* device_api_ = runtime::DeviceAPI::Get(device_); }; /*! * \brief Memory region that can request TVM memory for ACL to use. */ class ACLMemoryRegion : public arm_compute::IMemoryRegion { public: ACLMemoryRegion(size_t size, size_t alignment); ACLMemoryRegion(void* ptr, size_t size); ~ACLMemoryRegion() override; /*! \brief Prevent instances of this class from being copied (As this class contains * pointers). */ ACLMemoryRegion(const ACLMemoryRegion&) = delete; /*! \brief Default move constructor. */ ACLMemoryRegion(ACLMemoryRegion&&) = default; /*! \brief Prevent instances of this class from being copied (As this class * contains pointers) */ ACLMemoryRegion& operator=(const ACLMemoryRegion&) = delete; /*! Default move assignment operator. */ ACLMemoryRegion& operator=(ACLMemoryRegion&&) = default; void* buffer() override { return this->ptr_; } const void* buffer() const override { return this->ptr_; } /*! * \brief Extract a sub-region from the memory. * * \warning Ownership is maintained by the parent memory, * while a wrapped raw memory region is returned by this function. * Thus parent memory should not be released before this. * * \param offset Offset to the region. * \param size Size of the region. * \return A wrapped memory sub-region with no ownership of the * underlying memory. */ std::unique_ptr extract_subregion(size_t offset, size_t size) override; private: /*! \brief Points to a region of memory allocated by TVM. */ void* ptr_; /*! \brief A subregion doesn't manage TVM memory so we don't need to free it. */ bool is_subregion_ = false; /*! \brief Always allocate data in the context of the current CPU. */ const Device device_{kDLCPU, 0}; /*! \brief Device API which allows requests for memory from TVM. */ runtime::DeviceAPI* device_api_ = runtime::DeviceAPI::Get(device_); }; } // namespace contrib } // namespace runtime } // namespace tvm #endif // TVM_RUNTIME_CONTRIB_ARM_COMPUTE_LIB_ACL_ALLOCATOR_H_