// // MmapPool.hpp // MNN // // Created by MNN on 2025/12/02. // Copyright © 2018, Alibaba Group Holding Limited // #ifndef MmapPool_hpp #define MmapPool_hpp #include #include #include #include #include #include "core/NonCopyable.hpp" #include "backend/opencl/core/runtime/OpenCLWrapper.hpp" #include "core/BufferAllocator.hpp" #include "core/MNNFileUtils.h" namespace MNN { namespace OpenCL { struct OpenCLMmapBufferNode{ OpenCLMmapBufferNode(){}; std::string fileName; size_t offset; size_t size; std::shared_ptr buffer; }; struct OpenCLMmapImageNode { OpenCLMmapImageNode(){}; std::string fileName; size_t offset; size_t size; int w; int h; cl_channel_type type; std::shared_ptr image; }; class OpenCLMmapAllocator { private: std::map> mCache; std::string mFileName; std::string mPrefix; std::string mPosfix; int mAllocTimes = 0; bool mRemove; bool mNewMmap = false; public: OpenCLMmapAllocator(const char* dirName, const char* prefix, const char* posfix, bool autoRemove); ~ OpenCLMmapAllocator() { for (auto& iter : mCache) { MNNCloseFile(std::get<0>(iter.second)); if (mRemove) { MNNRemoveFile(iter.first.c_str()); std::string cacheName = mPrefix + "sync." + mPosfix; std::string fileName = MNNFilePathConcat(mFileName, cacheName); MNNRemoveFile(fileName.c_str()); } } } std::string onAlloc(size_t size); void read(const std::string &fileName, size_t offset, size_t size, void* buffer); void write(const std::string &fileName, size_t offset, size_t size, void* buffer); void sync(); void setRemove(bool remove){ mRemove = remove; } }; class MmapPool : public NonCopyable { public: MmapPool(std::shared_ptr origin, cl::Context& context, cl::CommandQueue& command, cl_mem_flags flags, int useCacheMmap, size_t fileSize) : mOrigin(origin), mContext(context), mCommand(command), mFlag(flags), mUseCachedMmap(useCacheMmap), mFileSize(fileSize) {} std::shared_ptr allocBuffer(size_t size, bool separate = false); std::shared_ptr allocImage(size_t w, size_t h, cl_channel_type type, bool separate = false); void recycle(cl::Buffer* buffer, bool release = false); void recycle(cl::Image* image, bool release = false); void clear(); void releaseFreeList(); void sync(); size_t totalSize() { return mTotalSize; } void setRemove(bool remove){ mOrigin->setRemove(remove); } private: std::map> mAllBuffer; std::multimap> mFreeBufferList; std::map> mAllImage; std::list> mFreeImageList; std::map mFileInfo; std::shared_ptr mOrigin; cl::Context& mContext; cl::CommandQueue& mCommand; cl_mem_flags mFlag; size_t mTotalSize = 0; int mUseCachedMmap; bool mHasSync = false; size_t mFileSize = 0; }; } // namespace OpenCL } // namespace MNN #endif /* MmapPool_hpp */