1 // 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 20 namespace armnn 21 { 22 Serialize(const arm_compute::CLCompileContext & clCompileContext)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 SaveSerializedToStream(std::ostream & stream)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 58