xref: /aosp_15_r20/external/armnn/src/profiling/test/ProfilingTestUtils.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2019 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 <ArmNNProfilingServiceInitialiser.hpp>
7*89c4ff92SAndroid Build Coastguard Worker #include "ProfilingOptionsConverter.hpp"
8*89c4ff92SAndroid Build Coastguard Worker #include "ProfilingTestUtils.hpp"
9*89c4ff92SAndroid Build Coastguard Worker 
10*89c4ff92SAndroid Build Coastguard Worker #include <armnn/Descriptors.hpp>
11*89c4ff92SAndroid Build Coastguard Worker #include <armnn/profiling/ArmNNProfiling.hpp>
12*89c4ff92SAndroid Build Coastguard Worker 
13*89c4ff92SAndroid Build Coastguard Worker #include <client/src/ProfilingService.hpp>
14*89c4ff92SAndroid Build Coastguard Worker #include <client/src/ProfilingUtils.hpp>
15*89c4ff92SAndroid Build Coastguard Worker 
16*89c4ff92SAndroid Build Coastguard Worker #include <common/include/Assert.hpp>
17*89c4ff92SAndroid Build Coastguard Worker #include <common/include/LabelsAndEventClasses.hpp>
18*89c4ff92SAndroid Build Coastguard Worker #include <common/include/NumericCast.hpp>
19*89c4ff92SAndroid Build Coastguard Worker #include <common/include/Processes.hpp>
20*89c4ff92SAndroid Build Coastguard Worker #include <common/include/Threads.hpp>
21*89c4ff92SAndroid Build Coastguard Worker 
22*89c4ff92SAndroid Build Coastguard Worker #include <TestUtils.hpp>
23*89c4ff92SAndroid Build Coastguard Worker 
24*89c4ff92SAndroid Build Coastguard Worker #include <doctest/doctest.h>
25*89c4ff92SAndroid Build Coastguard Worker 
GetStreamMetaDataPacketSize()26*89c4ff92SAndroid Build Coastguard Worker uint32_t GetStreamMetaDataPacketSize()
27*89c4ff92SAndroid Build Coastguard Worker {
28*89c4ff92SAndroid Build Coastguard Worker     uint32_t sizeUint32 = sizeof(uint32_t);
29*89c4ff92SAndroid Build Coastguard Worker     uint32_t payloadSize = 0;
30*89c4ff92SAndroid Build Coastguard Worker     payloadSize += arm::pipe::numeric_cast<uint32_t>(arm::pipe::ARMNN_SOFTWARE_INFO.size()) + 1;
31*89c4ff92SAndroid Build Coastguard Worker     payloadSize += arm::pipe::numeric_cast<uint32_t>(arm::pipe::ARMNN_HARDWARE_VERSION.size()) + 1;
32*89c4ff92SAndroid Build Coastguard Worker     payloadSize += arm::pipe::numeric_cast<uint32_t>(arm::pipe::ARMNN_SOFTWARE_VERSION.size()) + 1;
33*89c4ff92SAndroid Build Coastguard Worker     payloadSize += arm::pipe::numeric_cast<uint32_t>(GetProcessName().size()) + 1;
34*89c4ff92SAndroid Build Coastguard Worker 
35*89c4ff92SAndroid Build Coastguard Worker     // Add packetVersionEntries
36*89c4ff92SAndroid Build Coastguard Worker     payloadSize += 13 * 2 * sizeUint32;
37*89c4ff92SAndroid Build Coastguard Worker     // Add packetVersionCountSize
38*89c4ff92SAndroid Build Coastguard Worker     payloadSize += sizeUint32;
39*89c4ff92SAndroid Build Coastguard Worker 
40*89c4ff92SAndroid Build Coastguard Worker     uint32_t headerSize = 2 * sizeUint32;
41*89c4ff92SAndroid Build Coastguard Worker     uint32_t bodySize = 10 * sizeUint32;
42*89c4ff92SAndroid Build Coastguard Worker 
43*89c4ff92SAndroid Build Coastguard Worker     return headerSize + bodySize + payloadSize;
44*89c4ff92SAndroid Build Coastguard Worker }
45*89c4ff92SAndroid Build Coastguard Worker 
GetSuitableBackendRegistered()46*89c4ff92SAndroid Build Coastguard Worker std::vector<BackendId> GetSuitableBackendRegistered()
47*89c4ff92SAndroid Build Coastguard Worker {
48*89c4ff92SAndroid Build Coastguard Worker     std::vector<BackendId> suitableBackends;
49*89c4ff92SAndroid Build Coastguard Worker     if (BackendRegistryInstance().IsBackendRegistered(GetComputeDeviceAsCString(armnn::Compute::CpuRef)))
50*89c4ff92SAndroid Build Coastguard Worker     {
51*89c4ff92SAndroid Build Coastguard Worker         suitableBackends.push_back(armnn::Compute::CpuRef);
52*89c4ff92SAndroid Build Coastguard Worker     }
53*89c4ff92SAndroid Build Coastguard Worker     if (BackendRegistryInstance().IsBackendRegistered(GetComputeDeviceAsCString(armnn::Compute::CpuAcc)))
54*89c4ff92SAndroid Build Coastguard Worker     {
55*89c4ff92SAndroid Build Coastguard Worker         suitableBackends.push_back(armnn::Compute::CpuAcc);
56*89c4ff92SAndroid Build Coastguard Worker     }
57*89c4ff92SAndroid Build Coastguard Worker     if (BackendRegistryInstance().IsBackendRegistered(GetComputeDeviceAsCString(armnn::Compute::GpuAcc)))
58*89c4ff92SAndroid Build Coastguard Worker     {
59*89c4ff92SAndroid Build Coastguard Worker         suitableBackends.push_back(armnn::Compute::GpuAcc);
60*89c4ff92SAndroid Build Coastguard Worker     }
61*89c4ff92SAndroid Build Coastguard Worker     return suitableBackends;
62*89c4ff92SAndroid Build Coastguard Worker }
63*89c4ff92SAndroid Build Coastguard Worker 
OffsetToNextWord(unsigned int numberOfBytes)64*89c4ff92SAndroid Build Coastguard Worker inline unsigned int OffsetToNextWord(unsigned int numberOfBytes)
65*89c4ff92SAndroid Build Coastguard Worker {
66*89c4ff92SAndroid Build Coastguard Worker     unsigned int uint32_t_size = sizeof(uint32_t);
67*89c4ff92SAndroid Build Coastguard Worker 
68*89c4ff92SAndroid Build Coastguard Worker     unsigned int remainder = numberOfBytes % uint32_t_size;
69*89c4ff92SAndroid Build Coastguard Worker     if (remainder == 0)
70*89c4ff92SAndroid Build Coastguard Worker     {
71*89c4ff92SAndroid Build Coastguard Worker         return numberOfBytes;
72*89c4ff92SAndroid Build Coastguard Worker     }
73*89c4ff92SAndroid Build Coastguard Worker 
74*89c4ff92SAndroid Build Coastguard Worker     return numberOfBytes + uint32_t_size - remainder;
75*89c4ff92SAndroid Build Coastguard Worker }
76*89c4ff92SAndroid Build Coastguard Worker 
VerifyTimelineHeaderBinary(const unsigned char * readableData,unsigned int & offset,uint32_t packetDataLength)77*89c4ff92SAndroid Build Coastguard Worker void VerifyTimelineHeaderBinary(const unsigned char* readableData,
78*89c4ff92SAndroid Build Coastguard Worker                                 unsigned int& offset,
79*89c4ff92SAndroid Build Coastguard Worker                                 uint32_t packetDataLength)
80*89c4ff92SAndroid Build Coastguard Worker {
81*89c4ff92SAndroid Build Coastguard Worker     ARM_PIPE_ASSERT(readableData);
82*89c4ff92SAndroid Build Coastguard Worker 
83*89c4ff92SAndroid Build Coastguard Worker     // Utils
84*89c4ff92SAndroid Build Coastguard Worker     unsigned int uint32_t_size = sizeof(uint32_t);
85*89c4ff92SAndroid Build Coastguard Worker 
86*89c4ff92SAndroid Build Coastguard Worker     // Check the TimelineEventClassBinaryPacket header
87*89c4ff92SAndroid Build Coastguard Worker     uint32_t timelineBinaryPacketHeaderWord0 = ReadUint32(readableData, offset);
88*89c4ff92SAndroid Build Coastguard Worker     uint32_t timelineBinaryPacketFamily      = (timelineBinaryPacketHeaderWord0 >> 26) & 0x0000003F;
89*89c4ff92SAndroid Build Coastguard Worker     uint32_t timelineBinaryPacketClass       = (timelineBinaryPacketHeaderWord0 >> 19) & 0x0000007F;
90*89c4ff92SAndroid Build Coastguard Worker     uint32_t timelineBinaryPacketType        = (timelineBinaryPacketHeaderWord0 >> 16) & 0x00000007;
91*89c4ff92SAndroid Build Coastguard Worker     uint32_t timelineBinaryPacketStreamId    = (timelineBinaryPacketHeaderWord0 >>  0) & 0x00000007;
92*89c4ff92SAndroid Build Coastguard Worker     CHECK(timelineBinaryPacketFamily   == 1);
93*89c4ff92SAndroid Build Coastguard Worker     CHECK(timelineBinaryPacketClass    == 0);
94*89c4ff92SAndroid Build Coastguard Worker     CHECK(timelineBinaryPacketType     == 1);
95*89c4ff92SAndroid Build Coastguard Worker     CHECK(timelineBinaryPacketStreamId == 0);
96*89c4ff92SAndroid Build Coastguard Worker     offset += uint32_t_size;
97*89c4ff92SAndroid Build Coastguard Worker     uint32_t timelineBinaryPacketHeaderWord1   = ReadUint32(readableData, offset);
98*89c4ff92SAndroid Build Coastguard Worker     uint32_t timelineBinaryPacketSequenceNumber = (timelineBinaryPacketHeaderWord1 >> 24) & 0x00000001;
99*89c4ff92SAndroid Build Coastguard Worker     uint32_t timelineBinaryPacketDataLength     = (timelineBinaryPacketHeaderWord1 >>  0) & 0x00FFFFFF;
100*89c4ff92SAndroid Build Coastguard Worker     CHECK(timelineBinaryPacketSequenceNumber == 0);
101*89c4ff92SAndroid Build Coastguard Worker     CHECK(timelineBinaryPacketDataLength     == packetDataLength);
102*89c4ff92SAndroid Build Coastguard Worker     offset += uint32_t_size;
103*89c4ff92SAndroid Build Coastguard Worker }
104*89c4ff92SAndroid Build Coastguard Worker 
VerifyTimelineLabelBinaryPacketData(arm::pipe::Optional<ProfilingGuid> guid,const std::string & label,const unsigned char * readableData,unsigned int & offset)105*89c4ff92SAndroid Build Coastguard Worker ProfilingGuid VerifyTimelineLabelBinaryPacketData(arm::pipe::Optional<ProfilingGuid> guid,
106*89c4ff92SAndroid Build Coastguard Worker                                                   const std::string& label,
107*89c4ff92SAndroid Build Coastguard Worker                                                   const unsigned char* readableData,
108*89c4ff92SAndroid Build Coastguard Worker                                                   unsigned int& offset)
109*89c4ff92SAndroid Build Coastguard Worker {
110*89c4ff92SAndroid Build Coastguard Worker     ARM_PIPE_ASSERT(readableData);
111*89c4ff92SAndroid Build Coastguard Worker 
112*89c4ff92SAndroid Build Coastguard Worker     // Utils
113*89c4ff92SAndroid Build Coastguard Worker     unsigned int uint32_t_size = sizeof(uint32_t);
114*89c4ff92SAndroid Build Coastguard Worker     unsigned int uint64_t_size = sizeof(uint64_t);
115*89c4ff92SAndroid Build Coastguard Worker     unsigned int label_size    = arm::pipe::numeric_cast<unsigned int>(label.size());
116*89c4ff92SAndroid Build Coastguard Worker 
117*89c4ff92SAndroid Build Coastguard Worker     // Check the decl id
118*89c4ff92SAndroid Build Coastguard Worker     uint32_t eventClassDeclId = ReadUint32(readableData, offset);
119*89c4ff92SAndroid Build Coastguard Worker     CHECK(eventClassDeclId == 0);
120*89c4ff92SAndroid Build Coastguard Worker 
121*89c4ff92SAndroid Build Coastguard Worker     // Check the profiling GUID
122*89c4ff92SAndroid Build Coastguard Worker     offset += uint32_t_size;
123*89c4ff92SAndroid Build Coastguard Worker     uint64_t readProfilingGuid = ReadUint64(readableData, offset);
124*89c4ff92SAndroid Build Coastguard Worker     if (guid.has_value())
125*89c4ff92SAndroid Build Coastguard Worker     {
126*89c4ff92SAndroid Build Coastguard Worker         CHECK(readProfilingGuid == guid.value());
127*89c4ff92SAndroid Build Coastguard Worker     }
128*89c4ff92SAndroid Build Coastguard Worker     else
129*89c4ff92SAndroid Build Coastguard Worker     {
130*89c4ff92SAndroid Build Coastguard Worker         ArmNNProfilingServiceInitialiser initialiser;
131*89c4ff92SAndroid Build Coastguard Worker         ProfilingService profilingService(arm::pipe::MAX_ARMNN_COUNTER,
132*89c4ff92SAndroid Build Coastguard Worker                                           initialiser,
133*89c4ff92SAndroid Build Coastguard Worker                                           arm::pipe::ARMNN_SOFTWARE_INFO,
134*89c4ff92SAndroid Build Coastguard Worker                                           arm::pipe::ARMNN_SOFTWARE_VERSION,
135*89c4ff92SAndroid Build Coastguard Worker                                           arm::pipe::ARMNN_HARDWARE_VERSION);
136*89c4ff92SAndroid Build Coastguard Worker         CHECK(readProfilingGuid == profilingService.GetStaticId(label));
137*89c4ff92SAndroid Build Coastguard Worker     }
138*89c4ff92SAndroid Build Coastguard Worker 
139*89c4ff92SAndroid Build Coastguard Worker     // Check the SWTrace label
140*89c4ff92SAndroid Build Coastguard Worker     offset += uint64_t_size;
141*89c4ff92SAndroid Build Coastguard Worker     uint32_t swTraceLabelLength = ReadUint32(readableData, offset);
142*89c4ff92SAndroid Build Coastguard Worker     CHECK(swTraceLabelLength == label_size + 1);               // Label length including the null-terminator
143*89c4ff92SAndroid Build Coastguard Worker     offset += uint32_t_size;
144*89c4ff92SAndroid Build Coastguard Worker     CHECK(std::memcmp(readableData + offset,                  // Offset to the label in the buffer
145*89c4ff92SAndroid Build Coastguard Worker                                label.data(),                           // The original label
146*89c4ff92SAndroid Build Coastguard Worker                                swTraceLabelLength - 1) == 0);          // The length of the label
147*89c4ff92SAndroid Build Coastguard Worker 
148*89c4ff92SAndroid Build Coastguard Worker     // SWTrace strings are written in blocks of words, so the offset has to be updated to the next whole word
149*89c4ff92SAndroid Build Coastguard Worker     offset += OffsetToNextWord(swTraceLabelLength);
150*89c4ff92SAndroid Build Coastguard Worker 
151*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid labelGuid(readProfilingGuid);
152*89c4ff92SAndroid Build Coastguard Worker     return labelGuid;
153*89c4ff92SAndroid Build Coastguard Worker }
154*89c4ff92SAndroid Build Coastguard Worker 
VerifyTimelineEventClassBinaryPacketData(ProfilingGuid guid,ProfilingGuid nameGuid,const unsigned char * readableData,unsigned int & offset)155*89c4ff92SAndroid Build Coastguard Worker void VerifyTimelineEventClassBinaryPacketData(ProfilingGuid guid,
156*89c4ff92SAndroid Build Coastguard Worker                                               ProfilingGuid nameGuid,
157*89c4ff92SAndroid Build Coastguard Worker                                               const unsigned char* readableData,
158*89c4ff92SAndroid Build Coastguard Worker                                               unsigned int& offset)
159*89c4ff92SAndroid Build Coastguard Worker {
160*89c4ff92SAndroid Build Coastguard Worker     ARM_PIPE_ASSERT(readableData);
161*89c4ff92SAndroid Build Coastguard Worker 
162*89c4ff92SAndroid Build Coastguard Worker     // Utils
163*89c4ff92SAndroid Build Coastguard Worker     unsigned int uint32_t_size = sizeof(uint32_t);
164*89c4ff92SAndroid Build Coastguard Worker     unsigned int uint64_t_size = sizeof(uint64_t);
165*89c4ff92SAndroid Build Coastguard Worker 
166*89c4ff92SAndroid Build Coastguard Worker     // Check the decl id
167*89c4ff92SAndroid Build Coastguard Worker     uint32_t eventClassDeclId = ReadUint32(readableData, offset);
168*89c4ff92SAndroid Build Coastguard Worker     CHECK(eventClassDeclId == 2);
169*89c4ff92SAndroid Build Coastguard Worker 
170*89c4ff92SAndroid Build Coastguard Worker     // Check the profiling GUID
171*89c4ff92SAndroid Build Coastguard Worker     offset += uint32_t_size;
172*89c4ff92SAndroid Build Coastguard Worker     uint64_t readProfilingGuid = ReadUint64(readableData, offset);
173*89c4ff92SAndroid Build Coastguard Worker     CHECK(readProfilingGuid == guid);
174*89c4ff92SAndroid Build Coastguard Worker 
175*89c4ff92SAndroid Build Coastguard Worker     offset += uint64_t_size;
176*89c4ff92SAndroid Build Coastguard Worker     uint64_t readProfiilngNameGuid = ReadUint64(readableData, offset);
177*89c4ff92SAndroid Build Coastguard Worker     CHECK(readProfiilngNameGuid == nameGuid);
178*89c4ff92SAndroid Build Coastguard Worker 
179*89c4ff92SAndroid Build Coastguard Worker     // Update the offset to allow parsing to be continued after this function returns
180*89c4ff92SAndroid Build Coastguard Worker     offset += uint64_t_size;
181*89c4ff92SAndroid Build Coastguard Worker }
182*89c4ff92SAndroid Build Coastguard Worker 
VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType relationshipType,arm::pipe::Optional<ProfilingGuid> relationshipGuid,arm::pipe::Optional<ProfilingGuid> headGuid,arm::pipe::Optional<ProfilingGuid> tailGuid,arm::pipe::Optional<ProfilingGuid> attributeGuid,const unsigned char * readableData,unsigned int & offset)183*89c4ff92SAndroid Build Coastguard Worker void VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType relationshipType,
184*89c4ff92SAndroid Build Coastguard Worker                                                 arm::pipe::Optional<ProfilingGuid> relationshipGuid,
185*89c4ff92SAndroid Build Coastguard Worker                                                 arm::pipe::Optional<ProfilingGuid> headGuid,
186*89c4ff92SAndroid Build Coastguard Worker                                                 arm::pipe::Optional<ProfilingGuid> tailGuid,
187*89c4ff92SAndroid Build Coastguard Worker                                                 arm::pipe::Optional<ProfilingGuid> attributeGuid,
188*89c4ff92SAndroid Build Coastguard Worker                                                 const unsigned char* readableData,
189*89c4ff92SAndroid Build Coastguard Worker                                                 unsigned int& offset)
190*89c4ff92SAndroid Build Coastguard Worker {
191*89c4ff92SAndroid Build Coastguard Worker     ARM_PIPE_ASSERT(readableData);
192*89c4ff92SAndroid Build Coastguard Worker 
193*89c4ff92SAndroid Build Coastguard Worker     uint32_t relationshipTypeUint = 0;
194*89c4ff92SAndroid Build Coastguard Worker     switch (relationshipType)
195*89c4ff92SAndroid Build Coastguard Worker     {
196*89c4ff92SAndroid Build Coastguard Worker         case ProfilingRelationshipType::RetentionLink:
197*89c4ff92SAndroid Build Coastguard Worker             relationshipTypeUint = 0;
198*89c4ff92SAndroid Build Coastguard Worker             break;
199*89c4ff92SAndroid Build Coastguard Worker         case ProfilingRelationshipType::ExecutionLink:
200*89c4ff92SAndroid Build Coastguard Worker             relationshipTypeUint = 1;
201*89c4ff92SAndroid Build Coastguard Worker             break;
202*89c4ff92SAndroid Build Coastguard Worker         case ProfilingRelationshipType::DataLink:
203*89c4ff92SAndroid Build Coastguard Worker             relationshipTypeUint = 2;
204*89c4ff92SAndroid Build Coastguard Worker             break;
205*89c4ff92SAndroid Build Coastguard Worker         case ProfilingRelationshipType::LabelLink:
206*89c4ff92SAndroid Build Coastguard Worker             relationshipTypeUint = 3;
207*89c4ff92SAndroid Build Coastguard Worker             break;
208*89c4ff92SAndroid Build Coastguard Worker         default:
209*89c4ff92SAndroid Build Coastguard Worker             FAIL("Unknown relationship type");
210*89c4ff92SAndroid Build Coastguard Worker     }
211*89c4ff92SAndroid Build Coastguard Worker 
212*89c4ff92SAndroid Build Coastguard Worker     // Utils
213*89c4ff92SAndroid Build Coastguard Worker     unsigned int uint32_t_size = sizeof(uint32_t);
214*89c4ff92SAndroid Build Coastguard Worker     unsigned int uint64_t_size = sizeof(uint64_t);
215*89c4ff92SAndroid Build Coastguard Worker 
216*89c4ff92SAndroid Build Coastguard Worker     // Check the decl id
217*89c4ff92SAndroid Build Coastguard Worker     uint32_t eventClassDeclId = ReadUint32(readableData, offset);
218*89c4ff92SAndroid Build Coastguard Worker     CHECK(eventClassDeclId == 3);
219*89c4ff92SAndroid Build Coastguard Worker 
220*89c4ff92SAndroid Build Coastguard Worker     // Check the relationship type
221*89c4ff92SAndroid Build Coastguard Worker     offset += uint32_t_size;
222*89c4ff92SAndroid Build Coastguard Worker     uint32_t readRelationshipTypeUint = ReadUint32(readableData, offset);
223*89c4ff92SAndroid Build Coastguard Worker     CHECK(readRelationshipTypeUint == relationshipTypeUint);
224*89c4ff92SAndroid Build Coastguard Worker 
225*89c4ff92SAndroid Build Coastguard Worker     // Check the relationship GUID
226*89c4ff92SAndroid Build Coastguard Worker     offset += uint32_t_size;
227*89c4ff92SAndroid Build Coastguard Worker     uint64_t readRelationshipGuid = ReadUint64(readableData, offset);
228*89c4ff92SAndroid Build Coastguard Worker     if (relationshipGuid.has_value())
229*89c4ff92SAndroid Build Coastguard Worker     {
230*89c4ff92SAndroid Build Coastguard Worker         CHECK(readRelationshipGuid == relationshipGuid.value());
231*89c4ff92SAndroid Build Coastguard Worker     }
232*89c4ff92SAndroid Build Coastguard Worker     else
233*89c4ff92SAndroid Build Coastguard Worker     {
234*89c4ff92SAndroid Build Coastguard Worker         CHECK(readRelationshipGuid != ProfilingGuid(0));
235*89c4ff92SAndroid Build Coastguard Worker     }
236*89c4ff92SAndroid Build Coastguard Worker 
237*89c4ff92SAndroid Build Coastguard Worker     // Check the head GUID of the relationship
238*89c4ff92SAndroid Build Coastguard Worker     offset += uint64_t_size;
239*89c4ff92SAndroid Build Coastguard Worker     uint64_t readHeadRelationshipGuid = ReadUint64(readableData, offset);
240*89c4ff92SAndroid Build Coastguard Worker     if (headGuid.has_value())
241*89c4ff92SAndroid Build Coastguard Worker     {
242*89c4ff92SAndroid Build Coastguard Worker         CHECK(readHeadRelationshipGuid == headGuid.value());
243*89c4ff92SAndroid Build Coastguard Worker     }
244*89c4ff92SAndroid Build Coastguard Worker     else
245*89c4ff92SAndroid Build Coastguard Worker     {
246*89c4ff92SAndroid Build Coastguard Worker         CHECK(readHeadRelationshipGuid != ProfilingGuid(0));
247*89c4ff92SAndroid Build Coastguard Worker     }
248*89c4ff92SAndroid Build Coastguard Worker 
249*89c4ff92SAndroid Build Coastguard Worker     // Check the tail GUID of the relationship
250*89c4ff92SAndroid Build Coastguard Worker     offset += uint64_t_size;
251*89c4ff92SAndroid Build Coastguard Worker     uint64_t readTailRelationshipGuid = ReadUint64(readableData, offset);
252*89c4ff92SAndroid Build Coastguard Worker     if (tailGuid.has_value())
253*89c4ff92SAndroid Build Coastguard Worker     {
254*89c4ff92SAndroid Build Coastguard Worker         CHECK(readTailRelationshipGuid == tailGuid.value());
255*89c4ff92SAndroid Build Coastguard Worker     }
256*89c4ff92SAndroid Build Coastguard Worker     else
257*89c4ff92SAndroid Build Coastguard Worker     {
258*89c4ff92SAndroid Build Coastguard Worker         CHECK(readTailRelationshipGuid != ProfilingGuid(0));
259*89c4ff92SAndroid Build Coastguard Worker     }
260*89c4ff92SAndroid Build Coastguard Worker 
261*89c4ff92SAndroid Build Coastguard Worker     // Check the attribute GUID of the relationship
262*89c4ff92SAndroid Build Coastguard Worker     offset += uint64_t_size;
263*89c4ff92SAndroid Build Coastguard Worker     uint64_t readAttributeRelationshipGuid = ReadUint64(readableData, offset);
264*89c4ff92SAndroid Build Coastguard Worker     if (attributeGuid.has_value())
265*89c4ff92SAndroid Build Coastguard Worker     {
266*89c4ff92SAndroid Build Coastguard Worker         CHECK(readAttributeRelationshipGuid == attributeGuid.value());
267*89c4ff92SAndroid Build Coastguard Worker     }
268*89c4ff92SAndroid Build Coastguard Worker     else
269*89c4ff92SAndroid Build Coastguard Worker     {
270*89c4ff92SAndroid Build Coastguard Worker         CHECK(readAttributeRelationshipGuid == ProfilingGuid(0));
271*89c4ff92SAndroid Build Coastguard Worker     }
272*89c4ff92SAndroid Build Coastguard Worker 
273*89c4ff92SAndroid Build Coastguard Worker     // Update the offset to allow parsing to be continued after this function returns
274*89c4ff92SAndroid Build Coastguard Worker     offset += uint64_t_size;
275*89c4ff92SAndroid Build Coastguard Worker }
276*89c4ff92SAndroid Build Coastguard Worker 
VerifyTimelineEntityBinaryPacketData(arm::pipe::Optional<ProfilingGuid> guid,const unsigned char * readableData,unsigned int & offset)277*89c4ff92SAndroid Build Coastguard Worker ProfilingGuid VerifyTimelineEntityBinaryPacketData(arm::pipe::Optional<ProfilingGuid> guid,
278*89c4ff92SAndroid Build Coastguard Worker                                                    const unsigned char* readableData,
279*89c4ff92SAndroid Build Coastguard Worker                                                    unsigned int& offset)
280*89c4ff92SAndroid Build Coastguard Worker {
281*89c4ff92SAndroid Build Coastguard Worker     ARM_PIPE_ASSERT(readableData);
282*89c4ff92SAndroid Build Coastguard Worker 
283*89c4ff92SAndroid Build Coastguard Worker     // Utils
284*89c4ff92SAndroid Build Coastguard Worker     unsigned int uint32_t_size = sizeof(uint32_t);
285*89c4ff92SAndroid Build Coastguard Worker     unsigned int uint64_t_size = sizeof(uint64_t);
286*89c4ff92SAndroid Build Coastguard Worker 
287*89c4ff92SAndroid Build Coastguard Worker     // Reading TimelineEntityClassBinaryPacket
288*89c4ff92SAndroid Build Coastguard Worker     // Check the decl_id
289*89c4ff92SAndroid Build Coastguard Worker     uint32_t entityDeclId = ReadUint32(readableData, offset);
290*89c4ff92SAndroid Build Coastguard Worker     CHECK(entityDeclId == 1);
291*89c4ff92SAndroid Build Coastguard Worker 
292*89c4ff92SAndroid Build Coastguard Worker     // Check the profiling GUID
293*89c4ff92SAndroid Build Coastguard Worker     offset += uint32_t_size;
294*89c4ff92SAndroid Build Coastguard Worker     uint64_t readProfilingGuid = ReadUint64(readableData, offset);
295*89c4ff92SAndroid Build Coastguard Worker 
296*89c4ff92SAndroid Build Coastguard Worker     if (guid.has_value())
297*89c4ff92SAndroid Build Coastguard Worker     {
298*89c4ff92SAndroid Build Coastguard Worker         CHECK(readProfilingGuid == guid.value());
299*89c4ff92SAndroid Build Coastguard Worker     }
300*89c4ff92SAndroid Build Coastguard Worker     else
301*89c4ff92SAndroid Build Coastguard Worker     {
302*89c4ff92SAndroid Build Coastguard Worker         CHECK(readProfilingGuid != ProfilingGuid(0));
303*89c4ff92SAndroid Build Coastguard Worker     }
304*89c4ff92SAndroid Build Coastguard Worker 
305*89c4ff92SAndroid Build Coastguard Worker     offset += uint64_t_size;
306*89c4ff92SAndroid Build Coastguard Worker 
307*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid entityGuid(readProfilingGuid);
308*89c4ff92SAndroid Build Coastguard Worker     return entityGuid;
309*89c4ff92SAndroid Build Coastguard Worker }
310*89c4ff92SAndroid Build Coastguard Worker 
VerifyTimelineEventBinaryPacket(arm::pipe::Optional<uint64_t> timestamp,arm::pipe::Optional<int> threadId,arm::pipe::Optional<ProfilingGuid> eventGuid,const unsigned char * readableData,unsigned int & offset)311*89c4ff92SAndroid Build Coastguard Worker ProfilingGuid VerifyTimelineEventBinaryPacket(arm::pipe::Optional<uint64_t> timestamp,
312*89c4ff92SAndroid Build Coastguard Worker                                               arm::pipe::Optional<int> threadId,
313*89c4ff92SAndroid Build Coastguard Worker                                               arm::pipe::Optional<ProfilingGuid> eventGuid,
314*89c4ff92SAndroid Build Coastguard Worker                                               const unsigned char* readableData,
315*89c4ff92SAndroid Build Coastguard Worker                                               unsigned int& offset)
316*89c4ff92SAndroid Build Coastguard Worker {
317*89c4ff92SAndroid Build Coastguard Worker     ARM_PIPE_ASSERT(readableData);
318*89c4ff92SAndroid Build Coastguard Worker 
319*89c4ff92SAndroid Build Coastguard Worker     // Utils
320*89c4ff92SAndroid Build Coastguard Worker     unsigned int uint32_t_size = sizeof(uint32_t);
321*89c4ff92SAndroid Build Coastguard Worker     unsigned int uint64_t_size = sizeof(uint64_t);
322*89c4ff92SAndroid Build Coastguard Worker 
323*89c4ff92SAndroid Build Coastguard Worker     // Reading TimelineEventBinaryPacket
324*89c4ff92SAndroid Build Coastguard Worker     // Check the decl_id
325*89c4ff92SAndroid Build Coastguard Worker     uint32_t entityDeclId = ReadUint32(readableData, offset);
326*89c4ff92SAndroid Build Coastguard Worker     CHECK(entityDeclId == 4);
327*89c4ff92SAndroid Build Coastguard Worker 
328*89c4ff92SAndroid Build Coastguard Worker     // Check the timestamp
329*89c4ff92SAndroid Build Coastguard Worker     offset += uint32_t_size;
330*89c4ff92SAndroid Build Coastguard Worker     uint64_t readTimestamp = ReadUint64(readableData, offset);
331*89c4ff92SAndroid Build Coastguard Worker     if (timestamp.has_value())
332*89c4ff92SAndroid Build Coastguard Worker     {
333*89c4ff92SAndroid Build Coastguard Worker         CHECK(readTimestamp == timestamp.value());
334*89c4ff92SAndroid Build Coastguard Worker     }
335*89c4ff92SAndroid Build Coastguard Worker     else
336*89c4ff92SAndroid Build Coastguard Worker     {
337*89c4ff92SAndroid Build Coastguard Worker         CHECK(readTimestamp != 0);
338*89c4ff92SAndroid Build Coastguard Worker     }
339*89c4ff92SAndroid Build Coastguard Worker 
340*89c4ff92SAndroid Build Coastguard Worker     // Check the thread id
341*89c4ff92SAndroid Build Coastguard Worker     offset += uint64_t_size;
342*89c4ff92SAndroid Build Coastguard Worker     std::vector<uint8_t> readThreadId(ThreadIdSize, 0);
343*89c4ff92SAndroid Build Coastguard Worker     ReadBytes(readableData, offset, ThreadIdSize, readThreadId.data());
344*89c4ff92SAndroid Build Coastguard Worker     if (threadId.has_value())
345*89c4ff92SAndroid Build Coastguard Worker     {
346*89c4ff92SAndroid Build Coastguard Worker         CHECK(readThreadId == threadId.value());
347*89c4ff92SAndroid Build Coastguard Worker     }
348*89c4ff92SAndroid Build Coastguard Worker     else
349*89c4ff92SAndroid Build Coastguard Worker     {
350*89c4ff92SAndroid Build Coastguard Worker         CHECK(readThreadId == arm::pipe::GetCurrentThreadId());
351*89c4ff92SAndroid Build Coastguard Worker     }
352*89c4ff92SAndroid Build Coastguard Worker 
353*89c4ff92SAndroid Build Coastguard Worker     // Check the event GUID
354*89c4ff92SAndroid Build Coastguard Worker     offset += ThreadIdSize;
355*89c4ff92SAndroid Build Coastguard Worker     uint64_t readEventGuid = ReadUint64(readableData, offset);
356*89c4ff92SAndroid Build Coastguard Worker     if (eventGuid.has_value())
357*89c4ff92SAndroid Build Coastguard Worker     {
358*89c4ff92SAndroid Build Coastguard Worker         CHECK(readEventGuid == eventGuid.value());
359*89c4ff92SAndroid Build Coastguard Worker     }
360*89c4ff92SAndroid Build Coastguard Worker     else
361*89c4ff92SAndroid Build Coastguard Worker     {
362*89c4ff92SAndroid Build Coastguard Worker         CHECK(readEventGuid != ProfilingGuid(0));
363*89c4ff92SAndroid Build Coastguard Worker     }
364*89c4ff92SAndroid Build Coastguard Worker 
365*89c4ff92SAndroid Build Coastguard Worker     offset += uint64_t_size;
366*89c4ff92SAndroid Build Coastguard Worker 
367*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid eventid(readEventGuid);
368*89c4ff92SAndroid Build Coastguard Worker     return eventid;
369*89c4ff92SAndroid Build Coastguard Worker }
370*89c4ff92SAndroid Build Coastguard Worker 
VerifyPostOptimisationStructureTestImpl(armnn::BackendId backendId)371*89c4ff92SAndroid Build Coastguard Worker void VerifyPostOptimisationStructureTestImpl(armnn::BackendId backendId)
372*89c4ff92SAndroid Build Coastguard Worker {
373*89c4ff92SAndroid Build Coastguard Worker     using namespace armnn;
374*89c4ff92SAndroid Build Coastguard Worker 
375*89c4ff92SAndroid Build Coastguard Worker     // Create runtime in which test will run
376*89c4ff92SAndroid Build Coastguard Worker     armnn::IRuntime::CreationOptions options;
377*89c4ff92SAndroid Build Coastguard Worker     options.m_ProfilingOptions.m_EnableProfiling = true;
378*89c4ff92SAndroid Build Coastguard Worker     options.m_ProfilingOptions.m_TimelineEnabled = true;
379*89c4ff92SAndroid Build Coastguard Worker     armnn::RuntimeImpl runtime(options);
380*89c4ff92SAndroid Build Coastguard Worker     GetProfilingService(&runtime).ResetExternalProfilingOptions(
381*89c4ff92SAndroid Build Coastguard Worker         ConvertExternalProfilingOptions(options.m_ProfilingOptions), false);
382*89c4ff92SAndroid Build Coastguard Worker 
383*89c4ff92SAndroid Build Coastguard Worker     ArmNNProfilingServiceInitialiser initialiser;
384*89c4ff92SAndroid Build Coastguard Worker     ProfilingServiceRuntimeHelper profilingServiceHelper(
385*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::MAX_ARMNN_COUNTER, initialiser, GetProfilingService(&runtime));
386*89c4ff92SAndroid Build Coastguard Worker     profilingServiceHelper.ForceTransitionToState(ProfilingState::NotConnected);
387*89c4ff92SAndroid Build Coastguard Worker     profilingServiceHelper.ForceTransitionToState(ProfilingState::WaitingForAck);
388*89c4ff92SAndroid Build Coastguard Worker     profilingServiceHelper.ForceTransitionToState(ProfilingState::Active);
389*89c4ff92SAndroid Build Coastguard Worker 
390*89c4ff92SAndroid Build Coastguard Worker     // build up the structure of the network
391*89c4ff92SAndroid Build Coastguard Worker     INetworkPtr net(INetwork::Create());
392*89c4ff92SAndroid Build Coastguard Worker 
393*89c4ff92SAndroid Build Coastguard Worker     // Convolution details
394*89c4ff92SAndroid Build Coastguard Worker     TensorInfo inputInfo({ 1, 2, 5, 1 }, DataType::Float32);
395*89c4ff92SAndroid Build Coastguard Worker     TensorInfo weightInfo({ 3, 2, 3, 1 }, DataType::Float32, 0.0f, 0, true);
396*89c4ff92SAndroid Build Coastguard Worker     TensorInfo biasInfo({ 3 }, DataType::Float32, 0.0f, 0, true);
397*89c4ff92SAndroid Build Coastguard Worker     TensorInfo outputInfo({ 1, 3, 7, 1 }, DataType::Float32);
398*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> weightsData{
399*89c4ff92SAndroid Build Coastguard Worker         1.0f, 0.0f, 0.0f,
400*89c4ff92SAndroid Build Coastguard Worker         0.0f, 2.0f, -1.5f,
401*89c4ff92SAndroid Build Coastguard Worker 
402*89c4ff92SAndroid Build Coastguard Worker         0.0f, 0.0f, 0.0f,
403*89c4ff92SAndroid Build Coastguard Worker         0.2f, 0.2f, 0.2f,
404*89c4ff92SAndroid Build Coastguard Worker 
405*89c4ff92SAndroid Build Coastguard Worker         0.5f, 0.0f, 0.5f,
406*89c4ff92SAndroid Build Coastguard Worker         0.0f, -1.0f, 0.0f
407*89c4ff92SAndroid Build Coastguard Worker     };
408*89c4ff92SAndroid Build Coastguard Worker     ConstTensor weights(weightInfo, weightsData);
409*89c4ff92SAndroid Build Coastguard Worker 
410*89c4ff92SAndroid Build Coastguard Worker     armnn::Optional<ConstTensor> optionalBiases;
411*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> biasesData{ 1.0f, 0.0f, 0.0f };
412*89c4ff92SAndroid Build Coastguard Worker     ConstTensor biases(biasInfo, biasesData);
413*89c4ff92SAndroid Build Coastguard Worker     optionalBiases = armnn::Optional<ConstTensor>(biases);
414*89c4ff92SAndroid Build Coastguard Worker 
415*89c4ff92SAndroid Build Coastguard Worker     // Input layer
416*89c4ff92SAndroid Build Coastguard Worker     IConnectableLayer* input = net->AddInputLayer(0, "input");
417*89c4ff92SAndroid Build Coastguard Worker 
418*89c4ff92SAndroid Build Coastguard Worker     // Convolution2d layer
419*89c4ff92SAndroid Build Coastguard Worker     Convolution2dDescriptor conv2dDesc;
420*89c4ff92SAndroid Build Coastguard Worker     conv2dDesc.m_StrideX = 1;
421*89c4ff92SAndroid Build Coastguard Worker     conv2dDesc.m_StrideY = 1;
422*89c4ff92SAndroid Build Coastguard Worker     conv2dDesc.m_PadLeft = 0;
423*89c4ff92SAndroid Build Coastguard Worker     conv2dDesc.m_PadRight = 0;
424*89c4ff92SAndroid Build Coastguard Worker     conv2dDesc.m_PadTop = 2;
425*89c4ff92SAndroid Build Coastguard Worker     conv2dDesc.m_PadBottom = 2;
426*89c4ff92SAndroid Build Coastguard Worker     conv2dDesc.m_BiasEnabled = true;
427*89c4ff92SAndroid Build Coastguard Worker 
428*89c4ff92SAndroid Build Coastguard Worker     IConnectableLayer* conv2d = net->AddConvolution2dLayer(conv2dDesc);
429*89c4ff92SAndroid Build Coastguard Worker 
430*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* weightsLayer = net->AddConstantLayer(weights, "Weights");
431*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* biasLayer = net->AddConstantLayer(biases, "Bias");
432*89c4ff92SAndroid Build Coastguard Worker 
433*89c4ff92SAndroid Build Coastguard Worker     weightsLayer->GetOutputSlot(0).SetTensorInfo(weightInfo);
434*89c4ff92SAndroid Build Coastguard Worker     weightsLayer->GetOutputSlot(0).Connect(conv2d->GetInputSlot(1u));
435*89c4ff92SAndroid Build Coastguard Worker 
436*89c4ff92SAndroid Build Coastguard Worker     biasLayer->GetOutputSlot(0).SetTensorInfo(biasInfo);
437*89c4ff92SAndroid Build Coastguard Worker     biasLayer->GetOutputSlot(0).Connect(conv2d->GetInputSlot(2u));
438*89c4ff92SAndroid Build Coastguard Worker 
439*89c4ff92SAndroid Build Coastguard Worker     // Abs layer
440*89c4ff92SAndroid Build Coastguard Worker     armnn::ElementwiseUnaryDescriptor absDesc;
441*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const abs = net->AddElementwiseUnaryLayer(absDesc, "abs");
442*89c4ff92SAndroid Build Coastguard Worker 
443*89c4ff92SAndroid Build Coastguard Worker     // Output layer
444*89c4ff92SAndroid Build Coastguard Worker     IConnectableLayer* output = net->AddOutputLayer(0, "output");
445*89c4ff92SAndroid Build Coastguard Worker 
446*89c4ff92SAndroid Build Coastguard Worker     input->GetOutputSlot(0).Connect(conv2d->GetInputSlot(0));
447*89c4ff92SAndroid Build Coastguard Worker     conv2d->GetOutputSlot(0).Connect(abs->GetInputSlot(0));
448*89c4ff92SAndroid Build Coastguard Worker     abs->GetOutputSlot(0).Connect(output->GetInputSlot(0));
449*89c4ff92SAndroid Build Coastguard Worker 
450*89c4ff92SAndroid Build Coastguard Worker     input->GetOutputSlot(0).SetTensorInfo(inputInfo);
451*89c4ff92SAndroid Build Coastguard Worker     conv2d->GetOutputSlot(0).SetTensorInfo(outputInfo);
452*89c4ff92SAndroid Build Coastguard Worker     abs->GetOutputSlot(0).SetTensorInfo(outputInfo);
453*89c4ff92SAndroid Build Coastguard Worker 
454*89c4ff92SAndroid Build Coastguard Worker     // optimize the network
455*89c4ff92SAndroid Build Coastguard Worker     std::vector<armnn::BackendId> backends = { backendId };
456*89c4ff92SAndroid Build Coastguard Worker     IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime.GetDeviceSpec());
457*89c4ff92SAndroid Build Coastguard Worker 
458*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid optNetGuid = optNet->GetGuid();
459*89c4ff92SAndroid Build Coastguard Worker 
460*89c4ff92SAndroid Build Coastguard Worker     // Load it into the runtime. It should success.
461*89c4ff92SAndroid Build Coastguard Worker     armnn::NetworkId netId;
462*89c4ff92SAndroid Build Coastguard Worker     CHECK(runtime.LoadNetwork(netId, std::move(optNet)) == Status::Success);
463*89c4ff92SAndroid Build Coastguard Worker 
464*89c4ff92SAndroid Build Coastguard Worker     BufferManager& bufferManager = profilingServiceHelper.GetProfilingBufferManager();
465*89c4ff92SAndroid Build Coastguard Worker     auto readableBuffer = bufferManager.GetReadableBuffer();
466*89c4ff92SAndroid Build Coastguard Worker 
467*89c4ff92SAndroid Build Coastguard Worker     // Profiling is enabled, the post-optimisation structure should be created
468*89c4ff92SAndroid Build Coastguard Worker     CHECK(readableBuffer != nullptr);
469*89c4ff92SAndroid Build Coastguard Worker     unsigned int size = readableBuffer->GetSize();
470*89c4ff92SAndroid Build Coastguard Worker 
471*89c4ff92SAndroid Build Coastguard Worker     const unsigned char* readableData = readableBuffer->GetReadableData();
472*89c4ff92SAndroid Build Coastguard Worker     CHECK(readableData != nullptr);
473*89c4ff92SAndroid Build Coastguard Worker 
474*89c4ff92SAndroid Build Coastguard Worker     unsigned int offset = 0;
475*89c4ff92SAndroid Build Coastguard Worker 
476*89c4ff92SAndroid Build Coastguard Worker     // Verify Header
477*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineHeaderBinary(readableData, offset, size - 8);
478*89c4ff92SAndroid Build Coastguard Worker 
479*89c4ff92SAndroid Build Coastguard Worker     // Post-optimisation network
480*89c4ff92SAndroid Build Coastguard Worker     // Network entity
481*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineEntityBinaryPacketData(optNetGuid, readableData, offset);
482*89c4ff92SAndroid Build Coastguard Worker 
483*89c4ff92SAndroid Build Coastguard Worker     // Entity - Type relationship
484*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
485*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
486*89c4ff92SAndroid Build Coastguard Worker                                                optNetGuid,
487*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::NETWORK_GUID,
488*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::TYPE_GUID,
489*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
490*89c4ff92SAndroid Build Coastguard Worker                                                offset);
491*89c4ff92SAndroid Build Coastguard Worker 
492*89c4ff92SAndroid Build Coastguard Worker     // Network - START OF LIFE
493*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid networkSolEventGuid = VerifyTimelineEventBinaryPacket(arm::pipe::EmptyOptional(),
494*89c4ff92SAndroid Build Coastguard Worker                                                                         arm::pipe::EmptyOptional(),
495*89c4ff92SAndroid Build Coastguard Worker                                                                         arm::pipe::EmptyOptional(),
496*89c4ff92SAndroid Build Coastguard Worker                                                                         readableData,
497*89c4ff92SAndroid Build Coastguard Worker                                                                         offset);
498*89c4ff92SAndroid Build Coastguard Worker 
499*89c4ff92SAndroid Build Coastguard Worker     // Network - START OF LIFE event relationship
500*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
501*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
502*89c4ff92SAndroid Build Coastguard Worker                                                optNetGuid,
503*89c4ff92SAndroid Build Coastguard Worker                                                networkSolEventGuid,
504*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
505*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
506*89c4ff92SAndroid Build Coastguard Worker                                                offset);
507*89c4ff92SAndroid Build Coastguard Worker 
508*89c4ff92SAndroid Build Coastguard Worker     // Process ID Label
509*89c4ff92SAndroid Build Coastguard Worker     int processID = arm::pipe::GetCurrentProcessId();
510*89c4ff92SAndroid Build Coastguard Worker     std::stringstream ss;
511*89c4ff92SAndroid Build Coastguard Worker     ss << processID;
512*89c4ff92SAndroid Build Coastguard Worker     std::string processIdLabel = ss.str();
513*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineLabelBinaryPacketData(
514*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), processIdLabel, readableData, offset);
515*89c4ff92SAndroid Build Coastguard Worker 
516*89c4ff92SAndroid Build Coastguard Worker     // Entity - Process ID relationship
517*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
518*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
519*89c4ff92SAndroid Build Coastguard Worker                                                optNetGuid,
520*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
521*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::PROCESS_ID_GUID,
522*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
523*89c4ff92SAndroid Build Coastguard Worker                                                offset);
524*89c4ff92SAndroid Build Coastguard Worker 
525*89c4ff92SAndroid Build Coastguard Worker     // Input layer
526*89c4ff92SAndroid Build Coastguard Worker     // Input layer entity
527*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineEntityBinaryPacketData(input->GetGuid(), readableData, offset);
528*89c4ff92SAndroid Build Coastguard Worker     // Name Entity
529*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid inputLabelGuid = VerifyTimelineLabelBinaryPacketData(
530*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), "input", readableData, offset);
531*89c4ff92SAndroid Build Coastguard Worker 
532*89c4ff92SAndroid Build Coastguard Worker     // Entity - Name relationship
533*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
534*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
535*89c4ff92SAndroid Build Coastguard Worker                                                input->GetGuid(),
536*89c4ff92SAndroid Build Coastguard Worker                                                inputLabelGuid,
537*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::NAME_GUID,
538*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
539*89c4ff92SAndroid Build Coastguard Worker                                                offset);
540*89c4ff92SAndroid Build Coastguard Worker 
541*89c4ff92SAndroid Build Coastguard Worker     // Entity - Type relationship
542*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
543*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
544*89c4ff92SAndroid Build Coastguard Worker                                                input->GetGuid(),
545*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::LAYER_GUID,
546*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::TYPE_GUID,
547*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
548*89c4ff92SAndroid Build Coastguard Worker                                                offset);
549*89c4ff92SAndroid Build Coastguard Worker 
550*89c4ff92SAndroid Build Coastguard Worker     // Network - Input layer relationship
551*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
552*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
553*89c4ff92SAndroid Build Coastguard Worker                                                optNetGuid,
554*89c4ff92SAndroid Build Coastguard Worker                                                input->GetGuid(),
555*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::CHILD_GUID,
556*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
557*89c4ff92SAndroid Build Coastguard Worker                                                offset);
558*89c4ff92SAndroid Build Coastguard Worker 
559*89c4ff92SAndroid Build Coastguard Worker     // Weights layer
560*89c4ff92SAndroid Build Coastguard Worker     //  We will not check the GUID from the packets since we haven't direct access to the layer
561*89c4ff92SAndroid Build Coastguard Worker     //  The GUID will change depending on the number of tests ran since we do are not explicitly resetting the
562*89c4ff92SAndroid Build Coastguard Worker     //  ProfilingGuid counter at the beginning of this test
563*89c4ff92SAndroid Build Coastguard Worker 
564*89c4ff92SAndroid Build Coastguard Worker 
565*89c4ff92SAndroid Build Coastguard Worker     // Weights layer entity
566*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineEntityBinaryPacketData( arm::pipe::EmptyOptional(), readableData, offset);
567*89c4ff92SAndroid Build Coastguard Worker 
568*89c4ff92SAndroid Build Coastguard Worker     // Name entity
569*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid weightsNameLabelGuid = VerifyTimelineLabelBinaryPacketData(
570*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), "Weights", readableData, offset);
571*89c4ff92SAndroid Build Coastguard Worker 
572*89c4ff92SAndroid Build Coastguard Worker     // Entity - Name relationship
573*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
574*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
575*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
576*89c4ff92SAndroid Build Coastguard Worker                                                weightsNameLabelGuid,
577*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::NAME_GUID,
578*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
579*89c4ff92SAndroid Build Coastguard Worker                                                offset);
580*89c4ff92SAndroid Build Coastguard Worker 
581*89c4ff92SAndroid Build Coastguard Worker     // Entity - Type relationship
582*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
583*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
584*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
585*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::LAYER_GUID,
586*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::TYPE_GUID,
587*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
588*89c4ff92SAndroid Build Coastguard Worker                                                offset);
589*89c4ff92SAndroid Build Coastguard Worker 
590*89c4ff92SAndroid Build Coastguard Worker     // Network - Weights layer relationship
591*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
592*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
593*89c4ff92SAndroid Build Coastguard Worker                                                optNetGuid,
594*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
595*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::CHILD_GUID,
596*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
597*89c4ff92SAndroid Build Coastguard Worker                                                offset);
598*89c4ff92SAndroid Build Coastguard Worker 
599*89c4ff92SAndroid Build Coastguard Worker     // Weights workload
600*89c4ff92SAndroid Build Coastguard Worker     // Weights workload entity
601*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid weightsWorkloadGuid = VerifyTimelineEntityBinaryPacketData(
602*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), readableData, offset);
603*89c4ff92SAndroid Build Coastguard Worker 
604*89c4ff92SAndroid Build Coastguard Worker     // Entity - Type relationship
605*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
606*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
607*89c4ff92SAndroid Build Coastguard Worker                                                weightsWorkloadGuid,
608*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::WORKLOAD_GUID,
609*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::TYPE_GUID,
610*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
611*89c4ff92SAndroid Build Coastguard Worker                                                offset);
612*89c4ff92SAndroid Build Coastguard Worker 
613*89c4ff92SAndroid Build Coastguard Worker     // BackendId entity
614*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid backendIdLabelGuid = VerifyTimelineLabelBinaryPacketData(
615*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), backendId.Get(), readableData, offset);
616*89c4ff92SAndroid Build Coastguard Worker 
617*89c4ff92SAndroid Build Coastguard Worker     // Entity - BackendId relationship
618*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
619*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
620*89c4ff92SAndroid Build Coastguard Worker                                                weightsWorkloadGuid,
621*89c4ff92SAndroid Build Coastguard Worker                                                backendIdLabelGuid,
622*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::BACKENDID_GUID,
623*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
624*89c4ff92SAndroid Build Coastguard Worker                                                offset);
625*89c4ff92SAndroid Build Coastguard Worker 
626*89c4ff92SAndroid Build Coastguard Worker 
627*89c4ff92SAndroid Build Coastguard Worker     // Weights layer - Weights workload relationship
628*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
629*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
630*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
631*89c4ff92SAndroid Build Coastguard Worker                                                weightsWorkloadGuid,
632*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::CHILD_GUID,
633*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
634*89c4ff92SAndroid Build Coastguard Worker                                                offset);
635*89c4ff92SAndroid Build Coastguard Worker 
636*89c4ff92SAndroid Build Coastguard Worker     // Bias layer
637*89c4ff92SAndroid Build Coastguard Worker     //  We will not check the GUID from the packets since we haven't direct access to the layer
638*89c4ff92SAndroid Build Coastguard Worker     //  The GUID will change depending on the number of tests ran since we do are not explicitly resetting the
639*89c4ff92SAndroid Build Coastguard Worker     //  ProfilingGuid counter at the beginning of this test
640*89c4ff92SAndroid Build Coastguard Worker 
641*89c4ff92SAndroid Build Coastguard Worker     // Bias layer entity
642*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineEntityBinaryPacketData(arm::pipe::EmptyOptional(), readableData, offset);
643*89c4ff92SAndroid Build Coastguard Worker 
644*89c4ff92SAndroid Build Coastguard Worker     // Name entity
645*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid biasNameLabelGuid = VerifyTimelineLabelBinaryPacketData(
646*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), "Bias", readableData, offset);
647*89c4ff92SAndroid Build Coastguard Worker 
648*89c4ff92SAndroid Build Coastguard Worker     // Entity - Name relationship
649*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
650*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
651*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
652*89c4ff92SAndroid Build Coastguard Worker                                                biasNameLabelGuid,
653*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::NAME_GUID,
654*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
655*89c4ff92SAndroid Build Coastguard Worker                                                offset);
656*89c4ff92SAndroid Build Coastguard Worker 
657*89c4ff92SAndroid Build Coastguard Worker     // Entity - Type relationship
658*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
659*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
660*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
661*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::LAYER_GUID,
662*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::TYPE_GUID,
663*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
664*89c4ff92SAndroid Build Coastguard Worker                                                offset);
665*89c4ff92SAndroid Build Coastguard Worker 
666*89c4ff92SAndroid Build Coastguard Worker     // Network - Bias layer relationship
667*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
668*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
669*89c4ff92SAndroid Build Coastguard Worker                                                optNetGuid,
670*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
671*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::CHILD_GUID,
672*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
673*89c4ff92SAndroid Build Coastguard Worker                                                offset);
674*89c4ff92SAndroid Build Coastguard Worker 
675*89c4ff92SAndroid Build Coastguard Worker     // Bias workload
676*89c4ff92SAndroid Build Coastguard Worker     // Bias workload entity
677*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid biasWorkloadGuid = VerifyTimelineEntityBinaryPacketData(
678*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), readableData, offset);
679*89c4ff92SAndroid Build Coastguard Worker 
680*89c4ff92SAndroid Build Coastguard Worker     // Entity - Type relationship
681*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
682*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
683*89c4ff92SAndroid Build Coastguard Worker                                                biasWorkloadGuid,
684*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::WORKLOAD_GUID,
685*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::TYPE_GUID,
686*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
687*89c4ff92SAndroid Build Coastguard Worker                                                offset);
688*89c4ff92SAndroid Build Coastguard Worker 
689*89c4ff92SAndroid Build Coastguard Worker     // BackendId entity
690*89c4ff92SAndroid Build Coastguard Worker     backendIdLabelGuid = VerifyTimelineLabelBinaryPacketData(
691*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), backendId.Get(), readableData, offset);
692*89c4ff92SAndroid Build Coastguard Worker 
693*89c4ff92SAndroid Build Coastguard Worker     // Entity - BackendId relationship
694*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
695*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
696*89c4ff92SAndroid Build Coastguard Worker                                                biasWorkloadGuid,
697*89c4ff92SAndroid Build Coastguard Worker                                                backendIdLabelGuid,
698*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::BACKENDID_GUID,
699*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
700*89c4ff92SAndroid Build Coastguard Worker                                                offset);
701*89c4ff92SAndroid Build Coastguard Worker 
702*89c4ff92SAndroid Build Coastguard Worker 
703*89c4ff92SAndroid Build Coastguard Worker     // Bias layer - Bias workload relationship
704*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
705*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
706*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
707*89c4ff92SAndroid Build Coastguard Worker                                                biasWorkloadGuid,
708*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::CHILD_GUID,
709*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
710*89c4ff92SAndroid Build Coastguard Worker                                                offset);
711*89c4ff92SAndroid Build Coastguard Worker 
712*89c4ff92SAndroid Build Coastguard Worker     // Conv2d layer
713*89c4ff92SAndroid Build Coastguard Worker     // Conv2d layer entity
714*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineEntityBinaryPacketData(conv2d->GetGuid(), readableData, offset);
715*89c4ff92SAndroid Build Coastguard Worker 
716*89c4ff92SAndroid Build Coastguard Worker     // Name entity
717*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid conv2dNameLabelGuid = VerifyTimelineLabelBinaryPacketData(
718*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), "<Unnamed>", readableData, offset);
719*89c4ff92SAndroid Build Coastguard Worker 
720*89c4ff92SAndroid Build Coastguard Worker     // Entity - Name relationship
721*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
722*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
723*89c4ff92SAndroid Build Coastguard Worker                                                conv2d->GetGuid(),
724*89c4ff92SAndroid Build Coastguard Worker                                                conv2dNameLabelGuid,
725*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::NAME_GUID,
726*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
727*89c4ff92SAndroid Build Coastguard Worker                                                offset);
728*89c4ff92SAndroid Build Coastguard Worker 
729*89c4ff92SAndroid Build Coastguard Worker     // Entity - Type relationship
730*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
731*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
732*89c4ff92SAndroid Build Coastguard Worker                                                conv2d->GetGuid(),
733*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::LAYER_GUID,
734*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::TYPE_GUID,
735*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
736*89c4ff92SAndroid Build Coastguard Worker                                                offset);
737*89c4ff92SAndroid Build Coastguard Worker 
738*89c4ff92SAndroid Build Coastguard Worker     // Network - Conv2d layer relationship
739*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
740*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
741*89c4ff92SAndroid Build Coastguard Worker                                                optNetGuid,
742*89c4ff92SAndroid Build Coastguard Worker                                                conv2d->GetGuid(),
743*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::CHILD_GUID,
744*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
745*89c4ff92SAndroid Build Coastguard Worker                                                offset);
746*89c4ff92SAndroid Build Coastguard Worker 
747*89c4ff92SAndroid Build Coastguard Worker     // Input layer - Conv2d layer relationship
748*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
749*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
750*89c4ff92SAndroid Build Coastguard Worker                                                input->GetGuid(),
751*89c4ff92SAndroid Build Coastguard Worker                                                conv2d->GetGuid(),
752*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::CONNECTION_GUID,
753*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
754*89c4ff92SAndroid Build Coastguard Worker                                                offset);
755*89c4ff92SAndroid Build Coastguard Worker 
756*89c4ff92SAndroid Build Coastguard Worker     // Weights layer - Conv2d layer relationship
757*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
758*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
759*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
760*89c4ff92SAndroid Build Coastguard Worker                                                conv2d->GetGuid(),
761*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::CONNECTION_GUID,
762*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
763*89c4ff92SAndroid Build Coastguard Worker                                                offset);
764*89c4ff92SAndroid Build Coastguard Worker 
765*89c4ff92SAndroid Build Coastguard Worker     // Bias layer - Conv2d layer relationship
766*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
767*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
768*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
769*89c4ff92SAndroid Build Coastguard Worker                                                conv2d->GetGuid(),
770*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::CONNECTION_GUID,
771*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
772*89c4ff92SAndroid Build Coastguard Worker                                                offset);
773*89c4ff92SAndroid Build Coastguard Worker 
774*89c4ff92SAndroid Build Coastguard Worker     // Conv2d workload
775*89c4ff92SAndroid Build Coastguard Worker     // Conv2d workload entity
776*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid conv2DWorkloadGuid = VerifyTimelineEntityBinaryPacketData(
777*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), readableData, offset);
778*89c4ff92SAndroid Build Coastguard Worker 
779*89c4ff92SAndroid Build Coastguard Worker     // Entity - Type relationship
780*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
781*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
782*89c4ff92SAndroid Build Coastguard Worker                                                conv2DWorkloadGuid,
783*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::WORKLOAD_GUID,
784*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::TYPE_GUID,
785*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
786*89c4ff92SAndroid Build Coastguard Worker                                                offset);
787*89c4ff92SAndroid Build Coastguard Worker 
788*89c4ff92SAndroid Build Coastguard Worker     // BackendId entity
789*89c4ff92SAndroid Build Coastguard Worker     backendIdLabelGuid = VerifyTimelineLabelBinaryPacketData(
790*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), backendId.Get(), readableData, offset);
791*89c4ff92SAndroid Build Coastguard Worker 
792*89c4ff92SAndroid Build Coastguard Worker     // Entity - BackendId relationship
793*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
794*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
795*89c4ff92SAndroid Build Coastguard Worker                                                conv2DWorkloadGuid,
796*89c4ff92SAndroid Build Coastguard Worker                                                backendIdLabelGuid,
797*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::BACKENDID_GUID,
798*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
799*89c4ff92SAndroid Build Coastguard Worker                                                offset);
800*89c4ff92SAndroid Build Coastguard Worker 
801*89c4ff92SAndroid Build Coastguard Worker 
802*89c4ff92SAndroid Build Coastguard Worker     // Conv2d layer - Conv2d workload relationship
803*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
804*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
805*89c4ff92SAndroid Build Coastguard Worker                                                conv2d->GetGuid(),
806*89c4ff92SAndroid Build Coastguard Worker                                                conv2DWorkloadGuid,
807*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::CHILD_GUID,
808*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
809*89c4ff92SAndroid Build Coastguard Worker                                                offset);
810*89c4ff92SAndroid Build Coastguard Worker 
811*89c4ff92SAndroid Build Coastguard Worker     // Abs layer
812*89c4ff92SAndroid Build Coastguard Worker     // Abs layer entity
813*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineEntityBinaryPacketData(abs->GetGuid(), readableData, offset);
814*89c4ff92SAndroid Build Coastguard Worker 
815*89c4ff92SAndroid Build Coastguard Worker     // Name entity
816*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid absLabelGuid = VerifyTimelineLabelBinaryPacketData(
817*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), "abs", readableData, offset);
818*89c4ff92SAndroid Build Coastguard Worker 
819*89c4ff92SAndroid Build Coastguard Worker     // Entity - Name relationship
820*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
821*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
822*89c4ff92SAndroid Build Coastguard Worker                                                abs->GetGuid(),
823*89c4ff92SAndroid Build Coastguard Worker                                                absLabelGuid,
824*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::NAME_GUID,
825*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
826*89c4ff92SAndroid Build Coastguard Worker                                                offset);
827*89c4ff92SAndroid Build Coastguard Worker 
828*89c4ff92SAndroid Build Coastguard Worker     // Entity - Type relationship
829*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
830*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
831*89c4ff92SAndroid Build Coastguard Worker                                                abs->GetGuid(),
832*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::LAYER_GUID,
833*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::TYPE_GUID,
834*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
835*89c4ff92SAndroid Build Coastguard Worker                                                offset);
836*89c4ff92SAndroid Build Coastguard Worker 
837*89c4ff92SAndroid Build Coastguard Worker     // Network - Abs layer relationship
838*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
839*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
840*89c4ff92SAndroid Build Coastguard Worker                                                optNetGuid,
841*89c4ff92SAndroid Build Coastguard Worker                                                abs->GetGuid(),
842*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::CHILD_GUID,
843*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
844*89c4ff92SAndroid Build Coastguard Worker                                                offset);
845*89c4ff92SAndroid Build Coastguard Worker 
846*89c4ff92SAndroid Build Coastguard Worker     // Conv2d layer - Abs layer relationship
847*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
848*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
849*89c4ff92SAndroid Build Coastguard Worker                                                conv2d->GetGuid(),
850*89c4ff92SAndroid Build Coastguard Worker                                                abs->GetGuid(),
851*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::CONNECTION_GUID,
852*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
853*89c4ff92SAndroid Build Coastguard Worker                                                offset);
854*89c4ff92SAndroid Build Coastguard Worker 
855*89c4ff92SAndroid Build Coastguard Worker     // Abs workload
856*89c4ff92SAndroid Build Coastguard Worker     // Abs workload entity
857*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid absWorkloadGuid = VerifyTimelineEntityBinaryPacketData(
858*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), readableData, offset);
859*89c4ff92SAndroid Build Coastguard Worker 
860*89c4ff92SAndroid Build Coastguard Worker     // Entity - Type relationship
861*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
862*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
863*89c4ff92SAndroid Build Coastguard Worker                                                absWorkloadGuid,
864*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::WORKLOAD_GUID,
865*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::TYPE_GUID,
866*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
867*89c4ff92SAndroid Build Coastguard Worker                                                offset);
868*89c4ff92SAndroid Build Coastguard Worker 
869*89c4ff92SAndroid Build Coastguard Worker     // BackendId entity
870*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineLabelBinaryPacketData(arm::pipe::EmptyOptional(), backendId.Get(), readableData, offset);
871*89c4ff92SAndroid Build Coastguard Worker 
872*89c4ff92SAndroid Build Coastguard Worker     // Entity - BackendId relationship
873*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
874*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
875*89c4ff92SAndroid Build Coastguard Worker                                                absWorkloadGuid,
876*89c4ff92SAndroid Build Coastguard Worker                                                backendIdLabelGuid,
877*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::BACKENDID_GUID,
878*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
879*89c4ff92SAndroid Build Coastguard Worker                                                offset);
880*89c4ff92SAndroid Build Coastguard Worker 
881*89c4ff92SAndroid Build Coastguard Worker     // Abs layer - Abs workload relationship
882*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
883*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
884*89c4ff92SAndroid Build Coastguard Worker                                                abs->GetGuid(),
885*89c4ff92SAndroid Build Coastguard Worker                                                absWorkloadGuid,
886*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::CHILD_GUID,
887*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
888*89c4ff92SAndroid Build Coastguard Worker                                                offset);
889*89c4ff92SAndroid Build Coastguard Worker 
890*89c4ff92SAndroid Build Coastguard Worker     // Output layer
891*89c4ff92SAndroid Build Coastguard Worker     // Output layer entity
892*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineEntityBinaryPacketData(output->GetGuid(), readableData, offset);
893*89c4ff92SAndroid Build Coastguard Worker 
894*89c4ff92SAndroid Build Coastguard Worker     // Name entity
895*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid outputLabelGuid = VerifyTimelineLabelBinaryPacketData(
896*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), "output", readableData, offset);
897*89c4ff92SAndroid Build Coastguard Worker 
898*89c4ff92SAndroid Build Coastguard Worker     // Entity - Name relationship
899*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
900*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
901*89c4ff92SAndroid Build Coastguard Worker                                                output->GetGuid(),
902*89c4ff92SAndroid Build Coastguard Worker                                                outputLabelGuid,
903*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::NAME_GUID,
904*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
905*89c4ff92SAndroid Build Coastguard Worker                                                offset);
906*89c4ff92SAndroid Build Coastguard Worker 
907*89c4ff92SAndroid Build Coastguard Worker     // Entity - Type relationship
908*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
909*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
910*89c4ff92SAndroid Build Coastguard Worker                                                output->GetGuid(),
911*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::LAYER_GUID,
912*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::TYPE_GUID,
913*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
914*89c4ff92SAndroid Build Coastguard Worker                                                offset);
915*89c4ff92SAndroid Build Coastguard Worker 
916*89c4ff92SAndroid Build Coastguard Worker     // Network - Output layer relationship
917*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
918*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
919*89c4ff92SAndroid Build Coastguard Worker                                                optNetGuid,
920*89c4ff92SAndroid Build Coastguard Worker                                                output->GetGuid(),
921*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::CHILD_GUID,
922*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
923*89c4ff92SAndroid Build Coastguard Worker                                                offset);
924*89c4ff92SAndroid Build Coastguard Worker 
925*89c4ff92SAndroid Build Coastguard Worker     // Abs layer - Output layer relationship
926*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
927*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
928*89c4ff92SAndroid Build Coastguard Worker                                                abs->GetGuid(),
929*89c4ff92SAndroid Build Coastguard Worker                                                output->GetGuid(),
930*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::CONNECTION_GUID,
931*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
932*89c4ff92SAndroid Build Coastguard Worker                                                offset);
933*89c4ff92SAndroid Build Coastguard Worker 
934*89c4ff92SAndroid Build Coastguard Worker     bufferManager.MarkRead(readableBuffer);
935*89c4ff92SAndroid Build Coastguard Worker 
936*89c4ff92SAndroid Build Coastguard Worker     // Creates structures for input & output.
937*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputData(inputInfo.GetNumElements());
938*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> outputData(outputInfo.GetNumElements());
939*89c4ff92SAndroid Build Coastguard Worker 
940*89c4ff92SAndroid Build Coastguard Worker     TensorInfo inputTensorInfo = runtime.GetInputTensorInfo(netId, 0);
941*89c4ff92SAndroid Build Coastguard Worker     inputTensorInfo.SetConstant(true);
942*89c4ff92SAndroid Build Coastguard Worker     InputTensors inputTensors
943*89c4ff92SAndroid Build Coastguard Worker         {
944*89c4ff92SAndroid Build Coastguard Worker         {0, ConstTensor(inputTensorInfo, inputData.data())}
945*89c4ff92SAndroid Build Coastguard Worker         };
946*89c4ff92SAndroid Build Coastguard Worker     OutputTensors outputTensors
947*89c4ff92SAndroid Build Coastguard Worker         {
948*89c4ff92SAndroid Build Coastguard Worker         {0, Tensor(runtime.GetOutputTensorInfo(netId, 0), outputData.data())}
949*89c4ff92SAndroid Build Coastguard Worker         };
950*89c4ff92SAndroid Build Coastguard Worker 
951*89c4ff92SAndroid Build Coastguard Worker     // Does the inference.
952*89c4ff92SAndroid Build Coastguard Worker     runtime.EnqueueWorkload(netId, inputTensors, outputTensors);
953*89c4ff92SAndroid Build Coastguard Worker 
954*89c4ff92SAndroid Build Coastguard Worker     // Get readable buffer for input workload
955*89c4ff92SAndroid Build Coastguard Worker     auto inputReadableBuffer = bufferManager.GetReadableBuffer();
956*89c4ff92SAndroid Build Coastguard Worker     CHECK(inputReadableBuffer != nullptr);
957*89c4ff92SAndroid Build Coastguard Worker 
958*89c4ff92SAndroid Build Coastguard Worker     // Get readable buffer for output workload
959*89c4ff92SAndroid Build Coastguard Worker     auto outputReadableBuffer = bufferManager.GetReadableBuffer();
960*89c4ff92SAndroid Build Coastguard Worker     CHECK(outputReadableBuffer != nullptr);
961*89c4ff92SAndroid Build Coastguard Worker 
962*89c4ff92SAndroid Build Coastguard Worker     // Get readable buffer for inference timeline
963*89c4ff92SAndroid Build Coastguard Worker     auto inferenceReadableBuffer = bufferManager.GetReadableBuffer();
964*89c4ff92SAndroid Build Coastguard Worker     CHECK(inferenceReadableBuffer != nullptr);
965*89c4ff92SAndroid Build Coastguard Worker 
966*89c4ff92SAndroid Build Coastguard Worker     // Validate input workload data
967*89c4ff92SAndroid Build Coastguard Worker     size = inputReadableBuffer->GetSize();
968*89c4ff92SAndroid Build Coastguard Worker     CHECK(size == 164);
969*89c4ff92SAndroid Build Coastguard Worker 
970*89c4ff92SAndroid Build Coastguard Worker     readableData = inputReadableBuffer->GetReadableData();
971*89c4ff92SAndroid Build Coastguard Worker     CHECK(readableData != nullptr);
972*89c4ff92SAndroid Build Coastguard Worker 
973*89c4ff92SAndroid Build Coastguard Worker     offset = 0;
974*89c4ff92SAndroid Build Coastguard Worker 
975*89c4ff92SAndroid Build Coastguard Worker     // Verify Header
976*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineHeaderBinary(readableData, offset, 156);
977*89c4ff92SAndroid Build Coastguard Worker 
978*89c4ff92SAndroid Build Coastguard Worker     // Input workload
979*89c4ff92SAndroid Build Coastguard Worker     // Input workload entity
980*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid inputWorkloadGuid = VerifyTimelineEntityBinaryPacketData(
981*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), readableData, offset);
982*89c4ff92SAndroid Build Coastguard Worker 
983*89c4ff92SAndroid Build Coastguard Worker     // Entity - Type relationship
984*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
985*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
986*89c4ff92SAndroid Build Coastguard Worker                                                inputWorkloadGuid,
987*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::WORKLOAD_GUID,
988*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::TYPE_GUID,
989*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
990*89c4ff92SAndroid Build Coastguard Worker                                                offset);
991*89c4ff92SAndroid Build Coastguard Worker 
992*89c4ff92SAndroid Build Coastguard Worker     // BackendId entity
993*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineLabelBinaryPacketData(arm::pipe::EmptyOptional(), backendId.Get(), readableData, offset);
994*89c4ff92SAndroid Build Coastguard Worker 
995*89c4ff92SAndroid Build Coastguard Worker     // Entity - BackendId relationship
996*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
997*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
998*89c4ff92SAndroid Build Coastguard Worker                                                inputWorkloadGuid,
999*89c4ff92SAndroid Build Coastguard Worker                                                backendIdLabelGuid,
1000*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::BACKENDID_GUID,
1001*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1002*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1003*89c4ff92SAndroid Build Coastguard Worker 
1004*89c4ff92SAndroid Build Coastguard Worker     // Input layer - Input workload relationship
1005*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1006*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1007*89c4ff92SAndroid Build Coastguard Worker                                                input->GetGuid(),
1008*89c4ff92SAndroid Build Coastguard Worker                                                inputWorkloadGuid,
1009*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::CHILD_GUID,
1010*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1011*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1012*89c4ff92SAndroid Build Coastguard Worker 
1013*89c4ff92SAndroid Build Coastguard Worker     bufferManager.MarkRead(inputReadableBuffer);
1014*89c4ff92SAndroid Build Coastguard Worker 
1015*89c4ff92SAndroid Build Coastguard Worker     // Validate output workload data
1016*89c4ff92SAndroid Build Coastguard Worker     size = outputReadableBuffer->GetSize();
1017*89c4ff92SAndroid Build Coastguard Worker     CHECK(size == 164);
1018*89c4ff92SAndroid Build Coastguard Worker 
1019*89c4ff92SAndroid Build Coastguard Worker     readableData = outputReadableBuffer->GetReadableData();
1020*89c4ff92SAndroid Build Coastguard Worker     CHECK(readableData != nullptr);
1021*89c4ff92SAndroid Build Coastguard Worker 
1022*89c4ff92SAndroid Build Coastguard Worker     offset = 0;
1023*89c4ff92SAndroid Build Coastguard Worker 
1024*89c4ff92SAndroid Build Coastguard Worker     // Verify Header
1025*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineHeaderBinary(readableData, offset, 156);
1026*89c4ff92SAndroid Build Coastguard Worker 
1027*89c4ff92SAndroid Build Coastguard Worker     // Output workload
1028*89c4ff92SAndroid Build Coastguard Worker     // Output workload entity
1029*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid outputWorkloadGuid = VerifyTimelineEntityBinaryPacketData(
1030*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), readableData, offset);
1031*89c4ff92SAndroid Build Coastguard Worker 
1032*89c4ff92SAndroid Build Coastguard Worker     // Entity - Type relationship
1033*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1034*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1035*89c4ff92SAndroid Build Coastguard Worker                                                outputWorkloadGuid,
1036*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::WORKLOAD_GUID,
1037*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::TYPE_GUID,
1038*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1039*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1040*89c4ff92SAndroid Build Coastguard Worker 
1041*89c4ff92SAndroid Build Coastguard Worker     // BackendId entity
1042*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineLabelBinaryPacketData(arm::pipe::EmptyOptional(), backendId.Get(), readableData, offset);
1043*89c4ff92SAndroid Build Coastguard Worker 
1044*89c4ff92SAndroid Build Coastguard Worker     // Entity - BackendId relationship
1045*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1046*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1047*89c4ff92SAndroid Build Coastguard Worker                                                outputWorkloadGuid,
1048*89c4ff92SAndroid Build Coastguard Worker                                                backendIdLabelGuid,
1049*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::BACKENDID_GUID,
1050*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1051*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1052*89c4ff92SAndroid Build Coastguard Worker 
1053*89c4ff92SAndroid Build Coastguard Worker     // Output layer - Output workload relationship
1054*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1055*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1056*89c4ff92SAndroid Build Coastguard Worker                                                output->GetGuid(),
1057*89c4ff92SAndroid Build Coastguard Worker                                                outputWorkloadGuid,
1058*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::CHILD_GUID,
1059*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1060*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1061*89c4ff92SAndroid Build Coastguard Worker 
1062*89c4ff92SAndroid Build Coastguard Worker     bufferManager.MarkRead(outputReadableBuffer);
1063*89c4ff92SAndroid Build Coastguard Worker 
1064*89c4ff92SAndroid Build Coastguard Worker     // Validate inference data
1065*89c4ff92SAndroid Build Coastguard Worker     size = inferenceReadableBuffer->GetSize();
1066*89c4ff92SAndroid Build Coastguard Worker 
1067*89c4ff92SAndroid Build Coastguard Worker     CHECK(size == 1748 + 10 * ThreadIdSize);
1068*89c4ff92SAndroid Build Coastguard Worker 
1069*89c4ff92SAndroid Build Coastguard Worker     readableData = inferenceReadableBuffer->GetReadableData();
1070*89c4ff92SAndroid Build Coastguard Worker     CHECK(readableData != nullptr);
1071*89c4ff92SAndroid Build Coastguard Worker 
1072*89c4ff92SAndroid Build Coastguard Worker     offset = 0;
1073*89c4ff92SAndroid Build Coastguard Worker 
1074*89c4ff92SAndroid Build Coastguard Worker     // Verify Header
1075*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineHeaderBinary(readableData, offset, 1740 + 10 * ThreadIdSize);
1076*89c4ff92SAndroid Build Coastguard Worker 
1077*89c4ff92SAndroid Build Coastguard Worker     // Inference timeline trace
1078*89c4ff92SAndroid Build Coastguard Worker     // Inference entity
1079*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid inferenceGuid = VerifyTimelineEntityBinaryPacketData(
1080*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), readableData, offset);
1081*89c4ff92SAndroid Build Coastguard Worker 
1082*89c4ff92SAndroid Build Coastguard Worker     // Entity - Type relationship
1083*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1084*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1085*89c4ff92SAndroid Build Coastguard Worker                                                inferenceGuid,
1086*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::INFERENCE_GUID,
1087*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::TYPE_GUID,
1088*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1089*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1090*89c4ff92SAndroid Build Coastguard Worker 
1091*89c4ff92SAndroid Build Coastguard Worker     // Network - Inference relationship
1092*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1093*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1094*89c4ff92SAndroid Build Coastguard Worker                                                optNetGuid,
1095*89c4ff92SAndroid Build Coastguard Worker                                                inferenceGuid,
1096*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::EXECUTION_OF_GUID,
1097*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1098*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1099*89c4ff92SAndroid Build Coastguard Worker 
1100*89c4ff92SAndroid Build Coastguard Worker     // Start Inference life
1101*89c4ff92SAndroid Build Coastguard Worker     // Event packet - timeline, threadId, eventGuid
1102*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid inferenceEventGuid = VerifyTimelineEventBinaryPacket(
1103*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
1104*89c4ff92SAndroid Build Coastguard Worker 
1105*89c4ff92SAndroid Build Coastguard Worker     // Inference - event relationship
1106*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1107*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1108*89c4ff92SAndroid Build Coastguard Worker                                                inferenceGuid,
1109*89c4ff92SAndroid Build Coastguard Worker                                                inferenceEventGuid,
1110*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1111*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1112*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1113*89c4ff92SAndroid Build Coastguard Worker 
1114*89c4ff92SAndroid Build Coastguard Worker     // Execution
1115*89c4ff92SAndroid Build Coastguard Worker     // Input workload execution
1116*89c4ff92SAndroid Build Coastguard Worker     // Input workload execution entity
1117*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid inputWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
1118*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), readableData, offset);
1119*89c4ff92SAndroid Build Coastguard Worker 
1120*89c4ff92SAndroid Build Coastguard Worker     // Entity - Type relationship
1121*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1122*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1123*89c4ff92SAndroid Build Coastguard Worker                                                inputWorkloadExecutionGuid,
1124*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
1125*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::TYPE_GUID,
1126*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1127*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1128*89c4ff92SAndroid Build Coastguard Worker 
1129*89c4ff92SAndroid Build Coastguard Worker     // Inference - Workload execution relationship
1130*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1131*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1132*89c4ff92SAndroid Build Coastguard Worker                                                inferenceGuid,
1133*89c4ff92SAndroid Build Coastguard Worker                                                inputWorkloadExecutionGuid,
1134*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::CHILD_GUID,
1135*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1136*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1137*89c4ff92SAndroid Build Coastguard Worker 
1138*89c4ff92SAndroid Build Coastguard Worker     // Workload - Workload execution relationship
1139*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1140*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1141*89c4ff92SAndroid Build Coastguard Worker                                                inputWorkloadGuid,
1142*89c4ff92SAndroid Build Coastguard Worker                                                inputWorkloadExecutionGuid,
1143*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::EXECUTION_OF_GUID,
1144*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1145*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1146*89c4ff92SAndroid Build Coastguard Worker 
1147*89c4ff92SAndroid Build Coastguard Worker     // Start Input workload execution life
1148*89c4ff92SAndroid Build Coastguard Worker     // Event packet - timeline, threadId, eventGuid
1149*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid inputWorkloadExecutionSOLEventId = VerifyTimelineEventBinaryPacket(
1150*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
1151*89c4ff92SAndroid Build Coastguard Worker 
1152*89c4ff92SAndroid Build Coastguard Worker     // Input workload execution - event relationship
1153*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1154*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1155*89c4ff92SAndroid Build Coastguard Worker                                                inputWorkloadExecutionGuid,
1156*89c4ff92SAndroid Build Coastguard Worker                                                inputWorkloadExecutionSOLEventId,
1157*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1158*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1159*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1160*89c4ff92SAndroid Build Coastguard Worker 
1161*89c4ff92SAndroid Build Coastguard Worker     // End of Input workload execution life
1162*89c4ff92SAndroid Build Coastguard Worker     // Event packet - timeline, threadId, eventGuid
1163*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid inputWorkloadExecutionEOLEventId = VerifyTimelineEventBinaryPacket(
1164*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
1165*89c4ff92SAndroid Build Coastguard Worker 
1166*89c4ff92SAndroid Build Coastguard Worker     // Input workload execution - event relationship
1167*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1168*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1169*89c4ff92SAndroid Build Coastguard Worker                                                inputWorkloadExecutionGuid,
1170*89c4ff92SAndroid Build Coastguard Worker                                                inputWorkloadExecutionEOLEventId,
1171*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1172*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1173*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1174*89c4ff92SAndroid Build Coastguard Worker 
1175*89c4ff92SAndroid Build Coastguard Worker    // Weights workload execution
1176*89c4ff92SAndroid Build Coastguard Worker     // Weights workload execution entity
1177*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid weightsWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
1178*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), readableData, offset);
1179*89c4ff92SAndroid Build Coastguard Worker 
1180*89c4ff92SAndroid Build Coastguard Worker     // Entity - Type relationship
1181*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1182*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1183*89c4ff92SAndroid Build Coastguard Worker                                                weightsWorkloadExecutionGuid,
1184*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
1185*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::TYPE_GUID,
1186*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1187*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1188*89c4ff92SAndroid Build Coastguard Worker 
1189*89c4ff92SAndroid Build Coastguard Worker     // Inference - Workload execution relationship
1190*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1191*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1192*89c4ff92SAndroid Build Coastguard Worker                                                inferenceGuid,
1193*89c4ff92SAndroid Build Coastguard Worker                                                weightsWorkloadExecutionGuid,
1194*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::CHILD_GUID,
1195*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1196*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1197*89c4ff92SAndroid Build Coastguard Worker 
1198*89c4ff92SAndroid Build Coastguard Worker     // Workload - Workload execution relationship
1199*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1200*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1201*89c4ff92SAndroid Build Coastguard Worker                                                weightsWorkloadGuid,
1202*89c4ff92SAndroid Build Coastguard Worker                                                weightsWorkloadExecutionGuid,
1203*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::EXECUTION_OF_GUID,
1204*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1205*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1206*89c4ff92SAndroid Build Coastguard Worker 
1207*89c4ff92SAndroid Build Coastguard Worker     // Start Weights workload execution life
1208*89c4ff92SAndroid Build Coastguard Worker     // Event packet - timeline, threadId, eventGuid
1209*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid weightsWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
1210*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
1211*89c4ff92SAndroid Build Coastguard Worker 
1212*89c4ff92SAndroid Build Coastguard Worker     // Weights workload execution - event relationship
1213*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1214*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1215*89c4ff92SAndroid Build Coastguard Worker                                                weightsWorkloadExecutionGuid,
1216*89c4ff92SAndroid Build Coastguard Worker                                                weightsWorkloadExecutionSOLEventGuid,
1217*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1218*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1219*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1220*89c4ff92SAndroid Build Coastguard Worker 
1221*89c4ff92SAndroid Build Coastguard Worker     // End of Weights workload execution life
1222*89c4ff92SAndroid Build Coastguard Worker     // Event packet - timeline, threadId, eventGuid
1223*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid weightsWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
1224*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
1225*89c4ff92SAndroid Build Coastguard Worker 
1226*89c4ff92SAndroid Build Coastguard Worker     // Weights workload execution - event relationship
1227*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1228*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1229*89c4ff92SAndroid Build Coastguard Worker                                                weightsWorkloadExecutionGuid,
1230*89c4ff92SAndroid Build Coastguard Worker                                                weightsWorkloadExecutionEOLEventGuid,
1231*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1232*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1233*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1234*89c4ff92SAndroid Build Coastguard Worker 
1235*89c4ff92SAndroid Build Coastguard Worker    // Bias workload execution
1236*89c4ff92SAndroid Build Coastguard Worker     // Bias workload execution entity
1237*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid biasWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
1238*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), readableData, offset);
1239*89c4ff92SAndroid Build Coastguard Worker 
1240*89c4ff92SAndroid Build Coastguard Worker     // Entity - Type relationship
1241*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1242*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1243*89c4ff92SAndroid Build Coastguard Worker                                                biasWorkloadExecutionGuid,
1244*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
1245*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::TYPE_GUID,
1246*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1247*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1248*89c4ff92SAndroid Build Coastguard Worker 
1249*89c4ff92SAndroid Build Coastguard Worker     // Inference - Workload execution relationship
1250*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1251*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1252*89c4ff92SAndroid Build Coastguard Worker                                                inferenceGuid,
1253*89c4ff92SAndroid Build Coastguard Worker                                                biasWorkloadExecutionGuid,
1254*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::CHILD_GUID,
1255*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1256*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1257*89c4ff92SAndroid Build Coastguard Worker 
1258*89c4ff92SAndroid Build Coastguard Worker     // Workload - Workload execution relationship
1259*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1260*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1261*89c4ff92SAndroid Build Coastguard Worker                                                biasWorkloadGuid,
1262*89c4ff92SAndroid Build Coastguard Worker                                                biasWorkloadExecutionGuid,
1263*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::EXECUTION_OF_GUID,
1264*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1265*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1266*89c4ff92SAndroid Build Coastguard Worker 
1267*89c4ff92SAndroid Build Coastguard Worker     // Start Bias workload execution life
1268*89c4ff92SAndroid Build Coastguard Worker     // Event packet - timeline, threadId, eventGuid
1269*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid biasWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
1270*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
1271*89c4ff92SAndroid Build Coastguard Worker 
1272*89c4ff92SAndroid Build Coastguard Worker     // Bias workload execution - event relationship
1273*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1274*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1275*89c4ff92SAndroid Build Coastguard Worker                                                biasWorkloadExecutionGuid,
1276*89c4ff92SAndroid Build Coastguard Worker                                                biasWorkloadExecutionSOLEventGuid,
1277*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1278*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1279*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1280*89c4ff92SAndroid Build Coastguard Worker 
1281*89c4ff92SAndroid Build Coastguard Worker     // End of Bias workload execution life
1282*89c4ff92SAndroid Build Coastguard Worker     // Event packet - timeline, threadId, eventGuid
1283*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid biasWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
1284*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
1285*89c4ff92SAndroid Build Coastguard Worker 
1286*89c4ff92SAndroid Build Coastguard Worker     // Bias workload execution - event relationship
1287*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1288*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1289*89c4ff92SAndroid Build Coastguard Worker                                                biasWorkloadExecutionGuid,
1290*89c4ff92SAndroid Build Coastguard Worker                                                biasWorkloadExecutionEOLEventGuid,
1291*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1292*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1293*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1294*89c4ff92SAndroid Build Coastguard Worker 
1295*89c4ff92SAndroid Build Coastguard Worker     // Conv2d workload execution
1296*89c4ff92SAndroid Build Coastguard Worker     // Conv2d workload execution entity
1297*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid conv2DWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
1298*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), readableData, offset);
1299*89c4ff92SAndroid Build Coastguard Worker 
1300*89c4ff92SAndroid Build Coastguard Worker     // Entity - Type relationship
1301*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1302*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1303*89c4ff92SAndroid Build Coastguard Worker                                                conv2DWorkloadExecutionGuid,
1304*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
1305*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::TYPE_GUID,
1306*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1307*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1308*89c4ff92SAndroid Build Coastguard Worker 
1309*89c4ff92SAndroid Build Coastguard Worker     // Inference - Workload execution relationship
1310*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1311*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1312*89c4ff92SAndroid Build Coastguard Worker                                                inferenceGuid,
1313*89c4ff92SAndroid Build Coastguard Worker                                                conv2DWorkloadExecutionGuid,
1314*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::CHILD_GUID,
1315*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1316*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1317*89c4ff92SAndroid Build Coastguard Worker 
1318*89c4ff92SAndroid Build Coastguard Worker     // Workload - Workload execution relationship
1319*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1320*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1321*89c4ff92SAndroid Build Coastguard Worker                                                conv2DWorkloadGuid,
1322*89c4ff92SAndroid Build Coastguard Worker                                                conv2DWorkloadExecutionGuid,
1323*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::EXECUTION_OF_GUID,
1324*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1325*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1326*89c4ff92SAndroid Build Coastguard Worker 
1327*89c4ff92SAndroid Build Coastguard Worker     // Start Conv2d workload execution life
1328*89c4ff92SAndroid Build Coastguard Worker     // Event packet - timeline, threadId, eventGuid
1329*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid conv2DWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
1330*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
1331*89c4ff92SAndroid Build Coastguard Worker 
1332*89c4ff92SAndroid Build Coastguard Worker     // Conv2d workload execution - event relationship
1333*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1334*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1335*89c4ff92SAndroid Build Coastguard Worker                                                conv2DWorkloadExecutionGuid,
1336*89c4ff92SAndroid Build Coastguard Worker                                                conv2DWorkloadExecutionSOLEventGuid,
1337*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1338*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1339*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1340*89c4ff92SAndroid Build Coastguard Worker 
1341*89c4ff92SAndroid Build Coastguard Worker     // End of Conv2d workload execution life
1342*89c4ff92SAndroid Build Coastguard Worker     // Event packet - timeline, threadId, eventGuid
1343*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid conv2DWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
1344*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
1345*89c4ff92SAndroid Build Coastguard Worker 
1346*89c4ff92SAndroid Build Coastguard Worker     // Conv2d workload execution - event relationship
1347*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1348*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1349*89c4ff92SAndroid Build Coastguard Worker                                                conv2DWorkloadExecutionGuid,
1350*89c4ff92SAndroid Build Coastguard Worker                                                conv2DWorkloadExecutionEOLEventGuid,
1351*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1352*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1353*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1354*89c4ff92SAndroid Build Coastguard Worker 
1355*89c4ff92SAndroid Build Coastguard Worker     // Abs workload execution
1356*89c4ff92SAndroid Build Coastguard Worker     // Abs workload execution entity
1357*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid absWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
1358*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), readableData, offset);
1359*89c4ff92SAndroid Build Coastguard Worker 
1360*89c4ff92SAndroid Build Coastguard Worker     // Entity - Type relationship
1361*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1362*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1363*89c4ff92SAndroid Build Coastguard Worker                                                absWorkloadExecutionGuid,
1364*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
1365*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::TYPE_GUID,
1366*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1367*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1368*89c4ff92SAndroid Build Coastguard Worker 
1369*89c4ff92SAndroid Build Coastguard Worker     // Inference - Workload execution relationship
1370*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1371*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1372*89c4ff92SAndroid Build Coastguard Worker                                                inferenceGuid,
1373*89c4ff92SAndroid Build Coastguard Worker                                                absWorkloadExecutionGuid,
1374*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::CHILD_GUID,
1375*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1376*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1377*89c4ff92SAndroid Build Coastguard Worker 
1378*89c4ff92SAndroid Build Coastguard Worker     // Workload - Workload execution relationship
1379*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1380*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1381*89c4ff92SAndroid Build Coastguard Worker                                                absWorkloadGuid,
1382*89c4ff92SAndroid Build Coastguard Worker                                                absWorkloadExecutionGuid,
1383*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::EXECUTION_OF_GUID,
1384*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1385*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1386*89c4ff92SAndroid Build Coastguard Worker 
1387*89c4ff92SAndroid Build Coastguard Worker     // Start Abs workload execution life
1388*89c4ff92SAndroid Build Coastguard Worker     // Event packet - timeline, threadId, eventGuid
1389*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid absWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
1390*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
1391*89c4ff92SAndroid Build Coastguard Worker 
1392*89c4ff92SAndroid Build Coastguard Worker     // Abs workload execution - event relationship
1393*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1394*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1395*89c4ff92SAndroid Build Coastguard Worker                                                absWorkloadExecutionGuid,
1396*89c4ff92SAndroid Build Coastguard Worker                                                absWorkloadExecutionSOLEventGuid,
1397*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1398*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1399*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1400*89c4ff92SAndroid Build Coastguard Worker 
1401*89c4ff92SAndroid Build Coastguard Worker     // End of Abs workload execution life
1402*89c4ff92SAndroid Build Coastguard Worker     // Event packet - timeline, threadId, eventGuid
1403*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid absWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
1404*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
1405*89c4ff92SAndroid Build Coastguard Worker 
1406*89c4ff92SAndroid Build Coastguard Worker     // Abs workload execution - event relationship
1407*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1408*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1409*89c4ff92SAndroid Build Coastguard Worker                                                absWorkloadExecutionGuid,
1410*89c4ff92SAndroid Build Coastguard Worker                                                absWorkloadExecutionEOLEventGuid,
1411*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1412*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1413*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1414*89c4ff92SAndroid Build Coastguard Worker 
1415*89c4ff92SAndroid Build Coastguard Worker     // Output workload execution
1416*89c4ff92SAndroid Build Coastguard Worker     // Output workload execution entity
1417*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid outputWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
1418*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), readableData, offset);
1419*89c4ff92SAndroid Build Coastguard Worker 
1420*89c4ff92SAndroid Build Coastguard Worker     // Entity - Type relationship
1421*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1422*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1423*89c4ff92SAndroid Build Coastguard Worker                                                outputWorkloadExecutionGuid,
1424*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
1425*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::TYPE_GUID,
1426*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1427*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1428*89c4ff92SAndroid Build Coastguard Worker 
1429*89c4ff92SAndroid Build Coastguard Worker     // Inference - Workload execution relationship
1430*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1431*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1432*89c4ff92SAndroid Build Coastguard Worker                                                inferenceGuid,
1433*89c4ff92SAndroid Build Coastguard Worker                                                outputWorkloadExecutionGuid,
1434*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::CHILD_GUID,
1435*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1436*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1437*89c4ff92SAndroid Build Coastguard Worker 
1438*89c4ff92SAndroid Build Coastguard Worker     // Workload - Workload execution relationship
1439*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1440*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1441*89c4ff92SAndroid Build Coastguard Worker                                                outputWorkloadGuid,
1442*89c4ff92SAndroid Build Coastguard Worker                                                outputWorkloadExecutionGuid,
1443*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::EXECUTION_OF_GUID,
1444*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1445*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1446*89c4ff92SAndroid Build Coastguard Worker 
1447*89c4ff92SAndroid Build Coastguard Worker     // Start Output workload execution life
1448*89c4ff92SAndroid Build Coastguard Worker     // Event packet - timeline, threadId, eventGuid
1449*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid outputWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
1450*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
1451*89c4ff92SAndroid Build Coastguard Worker 
1452*89c4ff92SAndroid Build Coastguard Worker     // Output workload execution - event relationship
1453*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1454*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1455*89c4ff92SAndroid Build Coastguard Worker                                                outputWorkloadExecutionGuid,
1456*89c4ff92SAndroid Build Coastguard Worker                                                outputWorkloadExecutionSOLEventGuid,
1457*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1458*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1459*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1460*89c4ff92SAndroid Build Coastguard Worker 
1461*89c4ff92SAndroid Build Coastguard Worker     // End of Normalize workload execution life
1462*89c4ff92SAndroid Build Coastguard Worker     // Event packet - timeline, threadId, eventGuid
1463*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid outputWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
1464*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
1465*89c4ff92SAndroid Build Coastguard Worker 
1466*89c4ff92SAndroid Build Coastguard Worker     // Output workload execution - event relationship
1467*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1468*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1469*89c4ff92SAndroid Build Coastguard Worker                                                outputWorkloadExecutionGuid,
1470*89c4ff92SAndroid Build Coastguard Worker                                                outputWorkloadExecutionEOLEventGuid,
1471*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1472*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1473*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1474*89c4ff92SAndroid Build Coastguard Worker 
1475*89c4ff92SAndroid Build Coastguard Worker     // End of Inference life
1476*89c4ff92SAndroid Build Coastguard Worker     // Event packet - timeline, threadId, eventGuid
1477*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuid inferenceEOLEventGuid = VerifyTimelineEventBinaryPacket(
1478*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
1479*89c4ff92SAndroid Build Coastguard Worker 
1480*89c4ff92SAndroid Build Coastguard Worker     // Inference - event relationship
1481*89c4ff92SAndroid Build Coastguard Worker     VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1482*89c4ff92SAndroid Build Coastguard Worker                                                arm::pipe::EmptyOptional(),
1483*89c4ff92SAndroid Build Coastguard Worker                                                inferenceGuid,
1484*89c4ff92SAndroid Build Coastguard Worker                                                inferenceEOLEventGuid,
1485*89c4ff92SAndroid Build Coastguard Worker                                                LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1486*89c4ff92SAndroid Build Coastguard Worker                                                readableData,
1487*89c4ff92SAndroid Build Coastguard Worker                                                offset);
1488*89c4ff92SAndroid Build Coastguard Worker 
1489*89c4ff92SAndroid Build Coastguard Worker     bufferManager.MarkRead(inferenceReadableBuffer);
1490*89c4ff92SAndroid Build Coastguard Worker }
1491*89c4ff92SAndroid Build Coastguard Worker 
CompareOutput(std::vector<std::string> output,std::vector<std::string> expectedOutput)1492*89c4ff92SAndroid Build Coastguard Worker bool CompareOutput(std::vector<std::string> output, std::vector<std::string> expectedOutput)
1493*89c4ff92SAndroid Build Coastguard Worker {
1494*89c4ff92SAndroid Build Coastguard Worker     if (output.size() != expectedOutput.size())
1495*89c4ff92SAndroid Build Coastguard Worker     {
1496*89c4ff92SAndroid Build Coastguard Worker         std::cerr << "output has [" << output.size() << "] lines, expected was ["
1497*89c4ff92SAndroid Build Coastguard Worker                   << expectedOutput.size() << "] lines" << std::endl;
1498*89c4ff92SAndroid Build Coastguard Worker         std::cerr << std::endl << "actual" << std::endl << std::endl;
1499*89c4ff92SAndroid Build Coastguard Worker         for (auto line : output)
1500*89c4ff92SAndroid Build Coastguard Worker         {
1501*89c4ff92SAndroid Build Coastguard Worker             std::cerr << line << std::endl;
1502*89c4ff92SAndroid Build Coastguard Worker         }
1503*89c4ff92SAndroid Build Coastguard Worker         std::cerr << std::endl << "expected" << std::endl << std::endl;
1504*89c4ff92SAndroid Build Coastguard Worker         for (auto line : expectedOutput)
1505*89c4ff92SAndroid Build Coastguard Worker         {
1506*89c4ff92SAndroid Build Coastguard Worker             std::cerr << line << std::endl;
1507*89c4ff92SAndroid Build Coastguard Worker         }
1508*89c4ff92SAndroid Build Coastguard Worker         return false;
1509*89c4ff92SAndroid Build Coastguard Worker     }
1510*89c4ff92SAndroid Build Coastguard Worker     bool bRet = true;
1511*89c4ff92SAndroid Build Coastguard Worker     for (unsigned long i = 0; i < output.size(); ++i)
1512*89c4ff92SAndroid Build Coastguard Worker     {
1513*89c4ff92SAndroid Build Coastguard Worker         if (output[i] != expectedOutput[i])
1514*89c4ff92SAndroid Build Coastguard Worker         {
1515*89c4ff92SAndroid Build Coastguard Worker             bRet = false;
1516*89c4ff92SAndroid Build Coastguard Worker             std::cerr << i << ": actual [" << output[i] << "] expected [" << expectedOutput[i] << "]" << std::endl;
1517*89c4ff92SAndroid Build Coastguard Worker         }
1518*89c4ff92SAndroid Build Coastguard Worker     }
1519*89c4ff92SAndroid Build Coastguard Worker     return bRet;
1520*89c4ff92SAndroid Build Coastguard Worker }
1521