aboutsummaryrefslogtreecommitdiff
path: root/src/backends/cl/ClContextSerializer.cpp
diff options
context:
space:
mode:
authorMatthew Sloyan <matthew.sloyan@arm.com>2021-01-07 13:28:47 +0000
committerMatthew Sloyan <matthew.sloyan@arm.com>2021-01-11 17:03:54 +0000
commit80fbcd5f4d7b362360963af1df0121aa6b561576 (patch)
tree64c8d2588e55aad2813f6b07e40f87ac3b8e8ce1 /src/backends/cl/ClContextSerializer.cpp
parenta20b3129aa1c450ccf867c7b63844e8391753730 (diff)
downloadarmnn-80fbcd5f4d7b362360963af1df0121aa6b561576.tar.gz
IVGCVSW-5483 'Implement Loading and Saving to File'
* Implemented Serialization and Deserialization of CLContext. * Fixed flatbuffers android-nn-driver dependency. !android-nn-driver:4772 Signed-off-by: Matthew Sloyan <matthew.sloyan@arm.com> Signed-off-by: Sadik Armagan <sadik.armagan@arm.com> Change-Id: If806f050535ffaa70922ba0f1ffe7bb10f902329
Diffstat (limited to 'src/backends/cl/ClContextSerializer.cpp')
-rw-r--r--src/backends/cl/ClContextSerializer.cpp57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/backends/cl/ClContextSerializer.cpp b/src/backends/cl/ClContextSerializer.cpp
new file mode 100644
index 0000000000..db89203a25
--- /dev/null
+++ b/src/backends/cl/ClContextSerializer.cpp
@@ -0,0 +1,57 @@
+//
+// Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include "ClContextSerializer.hpp"
+#include "ClContextSchema_generated.h"
+
+#include <armnn/Exceptions.hpp>
+#include <armnn/Logging.hpp>
+#include <armnn/utility/NumericCast.hpp>
+
+#include <fmt/format.h>
+
+#include <cstdlib>
+#include <fstream>
+#include <iostream>
+#include <vector>
+
+namespace armnn
+{
+
+void ClContextSerializer::Serialize(const arm_compute::CLCompileContext& clCompileContext)
+{
+ // Get map of built programs from clCompileContext
+ std::map<std::string, cl::Program> builtProgramsMap = clCompileContext.get_built_programs();
+ if (builtProgramsMap.empty())
+ {
+ ARMNN_LOG(warning) << "There are no built programs to be serialised.";
+ return;
+ }
+
+ // Create Flatbuffer CL Programs
+ std::vector<flatbuffers::Offset<armnn::Program>> clPrograms;
+ for(const auto& program : builtProgramsMap)
+ {
+ std::vector<std::vector<uint8_t>> binaries = program.second.getInfo<CL_PROGRAM_BINARIES>();
+ clPrograms.push_back(CreateProgram(m_FlatBufferBuilder,
+ m_FlatBufferBuilder.CreateString(program.first),
+ m_FlatBufferBuilder.CreateVector(binaries[0])));
+ }
+
+ // Create Flatbuffer CLContext
+ auto clContext = CreateClContext(m_FlatBufferBuilder, m_FlatBufferBuilder.CreateVector(clPrograms));
+
+ m_FlatBufferBuilder.Finish(clContext);
+}
+
+bool ClContextSerializer::SaveSerializedToStream(std::ostream& stream)
+{
+ // Write to a stream
+ auto bytesToWrite = armnn::numeric_cast<std::streamsize>(m_FlatBufferBuilder.GetSize());
+ stream.write(reinterpret_cast<const char*>(m_FlatBufferBuilder.GetBufferPointer()), bytesToWrite);
+ return !stream.bad();
+}
+
+} // namespace armnn