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