diff options
author | Pablo Marquez Tello <pablo.tello@arm.com> | 2022-03-01 18:15:11 +0000 |
---|---|---|
committer | Jim Flynn <jim.flynn@arm.com> | 2022-03-22 13:44:04 +0000 |
commit | 723a7ac4176825813626f51332b54216927702cc (patch) | |
tree | 230fc0e58192773ae7ab1e22f3155c979ed8319f | |
parent | 33a9159e02b8f38afa18154979b45dbe09d1e7af (diff) | |
download | armnn-723a7ac4176825813626f51332b54216927702cc.tar.gz |
Use mmap to load the clcache file
* Improves performance in ExecuteNetwork when using --cached-network-filepath by using
a combination of mmap and memcpy instead of std::ifstream and reading individual bytes
* Partially solves MLCE-668
Change-Id: Ic772316b399484753f80593c02252bb1a5619157
Signed-off-by: Pablo Marquez Tello <pablo.tello@arm.com>
-rw-r--r-- | src/backends/cl/ClContextDeserializer.cpp | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/src/backends/cl/ClContextDeserializer.cpp b/src/backends/cl/ClContextDeserializer.cpp index 35a8afafad..4467433b87 100644 --- a/src/backends/cl/ClContextDeserializer.cpp +++ b/src/backends/cl/ClContextDeserializer.cpp @@ -8,6 +8,7 @@ #include <armnn/Exceptions.hpp> #include <armnn/utility/NumericCast.hpp> +#include <armnn/Logging.hpp> #include <flatbuffers/flexbuffers.h> @@ -18,6 +19,17 @@ #include <iostream> #include <vector> + +#if defined(__linux__) +#define SERIALIZER_USE_MMAP 1 +#if SERIALIZER_USE_MMAP +#include <sys/stat.h> +#include <sys/mman.h> +#include <fcntl.h> +#include <unistd.h> +#endif +#endif + namespace armnn { @@ -26,8 +38,9 @@ void ClContextDeserializer::Deserialize(arm_compute::CLCompileContext& clCompile cl::Device& device, const std::string& filePath) { - std::ifstream inputFileStream(filePath, std::ios::binary); std::vector<std::uint8_t> binaryContent; +#if !SERIALIZER_USE_MMAP + std::ifstream inputFileStream(filePath, std::ios::binary); while (inputFileStream) { char input; @@ -38,6 +51,30 @@ void ClContextDeserializer::Deserialize(arm_compute::CLCompileContext& clCompile } } inputFileStream.close(); +#else + struct stat statbuf; + int fp = open(filePath.c_str(),O_RDONLY); + if (!fp) + { + ARMNN_LOG(error) << (std::string("Cannot open file ") + filePath); + return; + } + fstat(fp,&statbuf); + const unsigned long dataSize = static_cast<unsigned long>(statbuf.st_size); + binaryContent.resize(static_cast<long unsigned int>(dataSize)); + void* ptrmem = mmap(NULL, dataSize,PROT_READ,MAP_PRIVATE,fp,0); + if(ptrmem!=MAP_FAILED) + { + memcpy (binaryContent.data(), ptrmem, dataSize); + } + close(fp); + if(ptrmem == MAP_FAILED) + { + ARMNN_LOG(error) << (std::string("Cannot map file ") + filePath); + return; + } +#endif + DeserializeFromBinary(clCompileContext, context, device, binaryContent); } |