From c3cf754e99f315e2c52e1abb5f1a8d250ec777f9 Mon Sep 17 00:00:00 2001 From: Riverspring996 <2212442@mail.nankai.edu.cn> Date: Thu, 26 Mar 2026 21:16:24 +0800 Subject: [PATCH] Accelerate OpenCLMmapAllocator::read() by replacing lseek+read syscalls with mmap-based memcpy --- source/backend/opencl/core/MmapPool.cpp | 18 ++++++++++-------- source/backend/opencl/core/MmapPool.hpp | 10 ++++++++-- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/source/backend/opencl/core/MmapPool.cpp b/source/backend/opencl/core/MmapPool.cpp index d44d36758a..3ef3b40b6f 100644 --- a/source/backend/opencl/core/MmapPool.cpp +++ b/source/backend/opencl/core/MmapPool.cpp @@ -41,7 +41,11 @@ std::string OpenCLMmapAllocator::onAlloc(size_t size) { } mNewMmap = true; } - mCache.insert(std::make_pair(fileName, std::make_tuple(file, size))); + void* mmapAddr = MNNMmapFile(file, size, false); + if (mmapAddr == nullptr) { + MNN_ERROR("MmapFile failed for %s\n", fileName.c_str()); + } + mCache.insert(std::make_pair(fileName, std::make_tuple(file, size, mmapAddr))); mAllocTimes++; return fileName; } @@ -52,15 +56,13 @@ bool OpenCLMmapAllocator::read(std::string fileName, size_t offset, size_t size, MNN_ERROR("Invalid mmap for OpenCLMmapAllocator\n"); return false; } - file_t file = std::get<0>(iter->second); - auto ret = MNNSetFilePointer(file, offset); - if (ret != NO_ERROR) { - return false; - } - auto readSize = MNNReadFile(file, buffer, size); - if (readSize != size) { + void* mmapAddr = std::get<2>(iter->second); + if (mmapAddr == nullptr) { + MNN_ERROR("Mmap addr is null for %s\n", fileName.c_str()); return false; } + memcpy(buffer, (char*)mmapAddr + offset, size); + return true; } bool OpenCLMmapAllocator::write(std::string fileName, size_t offset, size_t size, void* buffer){ auto iter = mCache.find(fileName); diff --git a/source/backend/opencl/core/MmapPool.hpp b/source/backend/opencl/core/MmapPool.hpp index 84c79f18fb..71fd44002c 100644 --- a/source/backend/opencl/core/MmapPool.hpp +++ b/source/backend/opencl/core/MmapPool.hpp @@ -42,7 +42,7 @@ struct OpenCLMmapImageNode { class OpenCLMmapAllocator { private: - std::map> mCache; + std::map> mCache; std::string mFileName; std::string mPrefix; std::string mPosfix; @@ -54,7 +54,13 @@ class OpenCLMmapAllocator { OpenCLMmapAllocator(const char* dirName, const char* prefix, const char* posfix, bool autoRemove); ~ OpenCLMmapAllocator() { for (auto& iter : mCache) { - MNNCloseFile(std::get<0>(iter.second)); + void* addr = std::get<2>(iter.second); + size_t size = std::get<1>(iter.second); + file_t file = std::get<0>(iter.second); + if (addr != nullptr) { + MNNUnmapFile(addr, size); + } + MNNCloseFile(file); if (mRemove) { MNNRemoveFile(iter.first.c_str()); }