aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPablo Marquez Tello <pablo.tello@arm.com>2022-03-01 18:15:11 +0000
committerJim Flynn <jim.flynn@arm.com>2022-03-22 13:44:04 +0000
commit723a7ac4176825813626f51332b54216927702cc (patch)
tree230fc0e58192773ae7ab1e22f3155c979ed8319f
parent33a9159e02b8f38afa18154979b45dbe09d1e7af (diff)
downloadarmnn-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.cpp39
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);
}