diff options
author | Matthew Sloyan <matthew.sloyan@arm.com> | 2021-01-07 13:28:47 +0000 |
---|---|---|
committer | Matthew Sloyan <matthew.sloyan@arm.com> | 2021-01-11 17:03:54 +0000 |
commit | 80fbcd5f4d7b362360963af1df0121aa6b561576 (patch) | |
tree | 64c8d2588e55aad2813f6b07e40f87ac3b8e8ce1 /src/backends/cl/ClContextSerializer.cpp | |
parent | a20b3129aa1c450ccf867c7b63844e8391753730 (diff) | |
download | armnn-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.cpp | 57 |
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 |