blob: db89203a252ff980d51715b9662509c98d8c5d4f [file] [log] [blame]
Matthew Sloyan80fbcd52021-01-07 13:28:47 +00001//
2// Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "ClContextSerializer.hpp"
7#include "ClContextSchema_generated.h"
8
9#include <armnn/Exceptions.hpp>
10#include <armnn/Logging.hpp>
11#include <armnn/utility/NumericCast.hpp>
12
13#include <fmt/format.h>
14
15#include <cstdlib>
16#include <fstream>
17#include <iostream>
18#include <vector>
19
20namespace armnn
21{
22
23void ClContextSerializer::Serialize(const arm_compute::CLCompileContext& clCompileContext)
24{
25 // Get map of built programs from clCompileContext
26 std::map<std::string, cl::Program> builtProgramsMap = clCompileContext.get_built_programs();
27 if (builtProgramsMap.empty())
28 {
29 ARMNN_LOG(warning) << "There are no built programs to be serialised.";
30 return;
31 }
32
33 // Create Flatbuffer CL Programs
34 std::vector<flatbuffers::Offset<armnn::Program>> clPrograms;
35 for(const auto& program : builtProgramsMap)
36 {
37 std::vector<std::vector<uint8_t>> binaries = program.second.getInfo<CL_PROGRAM_BINARIES>();
38 clPrograms.push_back(CreateProgram(m_FlatBufferBuilder,
39 m_FlatBufferBuilder.CreateString(program.first),
40 m_FlatBufferBuilder.CreateVector(binaries[0])));
41 }
42
43 // Create Flatbuffer CLContext
44 auto clContext = CreateClContext(m_FlatBufferBuilder, m_FlatBufferBuilder.CreateVector(clPrograms));
45
46 m_FlatBufferBuilder.Finish(clContext);
47}
48
49bool ClContextSerializer::SaveSerializedToStream(std::ostream& stream)
50{
51 // Write to a stream
52 auto bytesToWrite = armnn::numeric_cast<std::streamsize>(m_FlatBufferBuilder.GetSize());
53 stream.write(reinterpret_cast<const char*>(m_FlatBufferBuilder.GetBufferPointer()), bytesToWrite);
54 return !stream.bad();
55}
56
57} // namespace armnn