xref: /aosp_15_r20/external/armnn/src/backends/cl/ClContextSerializer.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
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 Worker void 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 Worker bool 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