2 // Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
6 #include "ClContextDeserializer.hpp"
7 #include "ClContextSchema_generated.h"
9 #include <armnn/Exceptions.hpp>
10 #include <armnn/utility/NumericCast.hpp>
12 #include <flatbuffers/flexbuffers.h>
14 #include <fmt/format.h>
24 void ClContextDeserializer::Deserialize(arm_compute::CLCompileContext& clCompileContext,
27 const std::string& filePath)
29 std::ifstream inputFileStream(filePath, std::ios::binary);
30 std::vector<std::uint8_t> binaryContent;
31 while (inputFileStream)
34 inputFileStream.get(input);
37 binaryContent.push_back(static_cast<std::uint8_t>(input));
40 inputFileStream.close();
41 DeserializeFromBinary(clCompileContext, context, device, binaryContent);
44 void ClContextDeserializer::DeserializeFromBinary(arm_compute::CLCompileContext& clCompileContext,
47 const std::vector<uint8_t>& binaryContent)
49 if (binaryContent.data() == nullptr)
51 throw InvalidArgumentException(fmt::format("Invalid (null) binary content {}",
52 CHECK_LOCATION().AsString()));
55 size_t binaryContentSize = binaryContent.size();
56 flatbuffers::Verifier verifier(binaryContent.data(), binaryContentSize);
57 if (verifier.VerifyBuffer<ClContext>() == false)
59 throw ParseException(fmt::format("Buffer doesn't conform to the expected Armnn "
60 "flatbuffers format. size:{0} {1}",
62 CHECK_LOCATION().AsString()));
64 auto clContext = GetClContext(binaryContent.data());
66 for (Program const* program : *clContext->programs())
68 auto programName = program->name()->c_str();
69 auto programBinary = program->binary();
70 std::vector<uint8_t> binary(programBinary->begin(), programBinary->begin() + programBinary->size());
72 cl::Program::Binaries binaries{ binary };
73 std::vector<cl::Device> devices {device};
74 cl::Program theProgram(context, devices, binaries);
76 clCompileContext.add_built_program(programName, theProgram);