blob: 0159f61140b06a926b265aa1b845565c42b42c93 [file] [log] [blame]
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +00001//
Jim Flynn6398a982020-05-27 17:05:21 +01002// Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +00003// SPDX-License-Identifier: MIT
4//
5
Jim Flynn34430252022-03-04 15:03:58 +00006#include <ArmNNProfilingServiceInitialiser.hpp>
Jim Flynn4c9ed1d2022-01-23 23:57:20 +00007#include "ProfilingOptionsConverter.hpp"
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +00008#include "ProfilingTestUtils.hpp"
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +00009
10#include <armnn/Descriptors.hpp>
Jim Flynn34430252022-03-04 15:03:58 +000011#include <armnn/profiling/ArmNNProfiling.hpp>
Matthew Sloyan371b70e2020-09-11 10:14:57 +010012
Jim Flynn3e9bc192022-03-23 23:01:26 +000013#include <client/src/ProfilingService.hpp>
14#include <client/src/ProfilingUtils.hpp>
Sadik Armaganea41b572020-03-19 18:16:46 +000015
Jim Flynn6730fe92022-03-10 22:57:47 +000016#include <common/include/Assert.hpp>
Nikhil Raj77fe76b2021-06-09 14:55:32 +010017#include <common/include/LabelsAndEventClasses.hpp>
Jim Flynn75c14f42022-03-10 22:05:42 +000018#include <common/include/NumericCast.hpp>
Jim Flynn77b284e2022-03-13 20:53:35 +000019#include <common/include/Processes.hpp>
Jim Flynn9c85b412022-03-16 00:27:43 +000020#include <common/include/Threads.hpp>
Nikhil Raj77fe76b2021-06-09 14:55:32 +010021
Sadik Armagana097d2a2021-11-24 15:47:28 +000022#include <TestUtils.hpp>
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000023
Sadik Armagan1625efc2021-06-10 18:24:34 +010024#include <doctest/doctest.h>
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000025
Finn Williamsa0de0562020-04-22 12:27:37 +010026uint32_t GetStreamMetaDataPacketSize()
27{
28 uint32_t sizeUint32 = sizeof(uint32_t);
29 uint32_t payloadSize = 0;
Jim Flynn9c85b412022-03-16 00:27:43 +000030 payloadSize += arm::pipe::numeric_cast<uint32_t>(arm::pipe::ARMNN_SOFTWARE_INFO.size()) + 1;
31 payloadSize += arm::pipe::numeric_cast<uint32_t>(arm::pipe::ARMNN_HARDWARE_VERSION.size()) + 1;
32 payloadSize += arm::pipe::numeric_cast<uint32_t>(arm::pipe::ARMNN_SOFTWARE_VERSION.size()) + 1;
Jim Flynn75c14f42022-03-10 22:05:42 +000033 payloadSize += arm::pipe::numeric_cast<uint32_t>(GetProcessName().size()) + 1;
Finn Williamsa0de0562020-04-22 12:27:37 +010034
35 // Add packetVersionEntries
Jim Flynn83d08a92020-07-09 13:48:16 +010036 payloadSize += 13 * 2 * sizeUint32;
Finn Williamsa0de0562020-04-22 12:27:37 +010037 // Add packetVersionCountSize
38 payloadSize += sizeUint32;
39
40 uint32_t headerSize = 2 * sizeUint32;
41 uint32_t bodySize = 10 * sizeUint32;
42
43 return headerSize + bodySize + payloadSize;
44}
45
Jan Eilersf78c7672020-07-01 18:09:39 +010046std::vector<BackendId> GetSuitableBackendRegistered()
47{
48 std::vector<BackendId> suitableBackends;
49 if (BackendRegistryInstance().IsBackendRegistered(GetComputeDeviceAsCString(armnn::Compute::CpuRef)))
50 {
51 suitableBackends.push_back(armnn::Compute::CpuRef);
52 }
53 if (BackendRegistryInstance().IsBackendRegistered(GetComputeDeviceAsCString(armnn::Compute::CpuAcc)))
54 {
55 suitableBackends.push_back(armnn::Compute::CpuAcc);
56 }
57 if (BackendRegistryInstance().IsBackendRegistered(GetComputeDeviceAsCString(armnn::Compute::GpuAcc)))
58 {
59 suitableBackends.push_back(armnn::Compute::GpuAcc);
60 }
61 return suitableBackends;
62}
63
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000064inline unsigned int OffsetToNextWord(unsigned int numberOfBytes)
65{
66 unsigned int uint32_t_size = sizeof(uint32_t);
67
68 unsigned int remainder = numberOfBytes % uint32_t_size;
69 if (remainder == 0)
70 {
71 return numberOfBytes;
72 }
73
74 return numberOfBytes + uint32_t_size - remainder;
75}
76
Keith Davis97da5e22020-03-05 16:25:28 +000077void VerifyTimelineHeaderBinary(const unsigned char* readableData,
78 unsigned int& offset,
79 uint32_t packetDataLength)
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000080{
Jim Flynn6730fe92022-03-10 22:57:47 +000081 ARM_PIPE_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000082
83 // Utils
84 unsigned int uint32_t_size = sizeof(uint32_t);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000085
Keith Davis97da5e22020-03-05 16:25:28 +000086 // Check the TimelineEventClassBinaryPacket header
Finn Williams0a336dc2020-05-11 15:39:58 +010087 uint32_t timelineBinaryPacketHeaderWord0 = ReadUint32(readableData, offset);
88 uint32_t timelineBinaryPacketFamily = (timelineBinaryPacketHeaderWord0 >> 26) & 0x0000003F;
89 uint32_t timelineBinaryPacketClass = (timelineBinaryPacketHeaderWord0 >> 19) & 0x0000007F;
90 uint32_t timelineBinaryPacketType = (timelineBinaryPacketHeaderWord0 >> 16) & 0x00000007;
91 uint32_t timelineBinaryPacketStreamId = (timelineBinaryPacketHeaderWord0 >> 0) & 0x00000007;
Sadik Armagan1625efc2021-06-10 18:24:34 +010092 CHECK(timelineBinaryPacketFamily == 1);
93 CHECK(timelineBinaryPacketClass == 0);
94 CHECK(timelineBinaryPacketType == 1);
95 CHECK(timelineBinaryPacketStreamId == 0);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000096 offset += uint32_t_size;
Finn Williams0a336dc2020-05-11 15:39:58 +010097 uint32_t timelineBinaryPacketHeaderWord1 = ReadUint32(readableData, offset);
98 uint32_t timelineBinaryPacketSequenceNumber = (timelineBinaryPacketHeaderWord1 >> 24) & 0x00000001;
99 uint32_t timelineBinaryPacketDataLength = (timelineBinaryPacketHeaderWord1 >> 0) & 0x00FFFFFF;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100100 CHECK(timelineBinaryPacketSequenceNumber == 0);
101 CHECK(timelineBinaryPacketDataLength == packetDataLength);
Keith Davis97da5e22020-03-05 16:25:28 +0000102 offset += uint32_t_size;
103}
104
Jim Flynndecd08b2022-03-13 22:35:46 +0000105ProfilingGuid VerifyTimelineLabelBinaryPacketData(arm::pipe::Optional<ProfilingGuid> guid,
Jim Flynn6398a982020-05-27 17:05:21 +0100106 const std::string& label,
107 const unsigned char* readableData,
108 unsigned int& offset)
Keith Davis97da5e22020-03-05 16:25:28 +0000109{
Jim Flynn6730fe92022-03-10 22:57:47 +0000110 ARM_PIPE_ASSERT(readableData);
Keith Davis97da5e22020-03-05 16:25:28 +0000111
112 // Utils
113 unsigned int uint32_t_size = sizeof(uint32_t);
114 unsigned int uint64_t_size = sizeof(uint64_t);
Jim Flynn75c14f42022-03-10 22:05:42 +0000115 unsigned int label_size = arm::pipe::numeric_cast<unsigned int>(label.size());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000116
117 // Check the decl id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000118 uint32_t eventClassDeclId = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100119 CHECK(eventClassDeclId == 0);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000120
121 // Check the profiling GUID
122 offset += uint32_t_size;
123 uint64_t readProfilingGuid = ReadUint64(readableData, offset);
124 if (guid.has_value())
125 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100126 CHECK(readProfilingGuid == guid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000127 }
128 else
129 {
Jim Flynn34430252022-03-04 15:03:58 +0000130 ArmNNProfilingServiceInitialiser initialiser;
Jim Flynn9c85b412022-03-16 00:27:43 +0000131 ProfilingService profilingService(arm::pipe::MAX_ARMNN_COUNTER,
132 initialiser,
133 arm::pipe::ARMNN_SOFTWARE_INFO,
134 arm::pipe::ARMNN_SOFTWARE_VERSION,
135 arm::pipe::ARMNN_HARDWARE_VERSION);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100136 CHECK(readProfilingGuid == profilingService.GetStaticId(label));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000137 }
138
139 // Check the SWTrace label
140 offset += uint64_t_size;
141 uint32_t swTraceLabelLength = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100142 CHECK(swTraceLabelLength == label_size + 1); // Label length including the null-terminator
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000143 offset += uint32_t_size;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100144 CHECK(std::memcmp(readableData + offset, // Offset to the label in the buffer
Keith Davis97da5e22020-03-05 16:25:28 +0000145 label.data(), // The original label
146 swTraceLabelLength - 1) == 0); // The length of the label
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000147
148 // SWTrace strings are written in blocks of words, so the offset has to be updated to the next whole word
149 offset += OffsetToNextWord(swTraceLabelLength);
Jim Flynn6398a982020-05-27 17:05:21 +0100150
151 ProfilingGuid labelGuid(readProfilingGuid);
152 return labelGuid;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000153}
154
Keith Davis97da5e22020-03-05 16:25:28 +0000155void VerifyTimelineEventClassBinaryPacketData(ProfilingGuid guid,
Jim Flynn1892d212020-05-26 21:10:49 +0100156 ProfilingGuid nameGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000157 const unsigned char* readableData,
158 unsigned int& offset)
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000159{
Jim Flynn6730fe92022-03-10 22:57:47 +0000160 ARM_PIPE_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000161
162 // Utils
163 unsigned int uint32_t_size = sizeof(uint32_t);
164 unsigned int uint64_t_size = sizeof(uint64_t);
165
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000166 // Check the decl id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000167 uint32_t eventClassDeclId = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100168 CHECK(eventClassDeclId == 2);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000169
170 // Check the profiling GUID
171 offset += uint32_t_size;
172 uint64_t readProfilingGuid = ReadUint64(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100173 CHECK(readProfilingGuid == guid);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000174
Jim Flynn1892d212020-05-26 21:10:49 +0100175 offset += uint64_t_size;
176 uint64_t readProfiilngNameGuid = ReadUint64(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100177 CHECK(readProfiilngNameGuid == nameGuid);
Jim Flynn1892d212020-05-26 21:10:49 +0100178
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000179 // Update the offset to allow parsing to be continued after this function returns
180 offset += uint64_t_size;
181}
182
Keith Davis97da5e22020-03-05 16:25:28 +0000183void VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType relationshipType,
Jim Flynndecd08b2022-03-13 22:35:46 +0000184 arm::pipe::Optional<ProfilingGuid> relationshipGuid,
185 arm::pipe::Optional<ProfilingGuid> headGuid,
186 arm::pipe::Optional<ProfilingGuid> tailGuid,
187 arm::pipe::Optional<ProfilingGuid> attributeGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100188 const unsigned char* readableData,
189 unsigned int& offset)
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000190{
Jim Flynn6730fe92022-03-10 22:57:47 +0000191 ARM_PIPE_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000192
193 uint32_t relationshipTypeUint = 0;
194 switch (relationshipType)
195 {
196 case ProfilingRelationshipType::RetentionLink:
197 relationshipTypeUint = 0;
198 break;
199 case ProfilingRelationshipType::ExecutionLink:
200 relationshipTypeUint = 1;
201 break;
202 case ProfilingRelationshipType::DataLink:
203 relationshipTypeUint = 2;
204 break;
205 case ProfilingRelationshipType::LabelLink:
206 relationshipTypeUint = 3;
207 break;
208 default:
Sadik Armagan1625efc2021-06-10 18:24:34 +0100209 FAIL("Unknown relationship type");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000210 }
211
212 // Utils
213 unsigned int uint32_t_size = sizeof(uint32_t);
214 unsigned int uint64_t_size = sizeof(uint64_t);
215
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000216 // Check the decl id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000217 uint32_t eventClassDeclId = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100218 CHECK(eventClassDeclId == 3);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000219
220 // Check the relationship type
221 offset += uint32_t_size;
222 uint32_t readRelationshipTypeUint = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100223 CHECK(readRelationshipTypeUint == relationshipTypeUint);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000224
225 // Check the relationship GUID
226 offset += uint32_t_size;
227 uint64_t readRelationshipGuid = ReadUint64(readableData, offset);
228 if (relationshipGuid.has_value())
229 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100230 CHECK(readRelationshipGuid == relationshipGuid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000231 }
232 else
233 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100234 CHECK(readRelationshipGuid != ProfilingGuid(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000235 }
236
Jim Flynn6398a982020-05-27 17:05:21 +0100237 // Check the head GUID of the relationship
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000238 offset += uint64_t_size;
239 uint64_t readHeadRelationshipGuid = ReadUint64(readableData, offset);
240 if (headGuid.has_value())
241 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100242 CHECK(readHeadRelationshipGuid == headGuid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000243 }
244 else
245 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100246 CHECK(readHeadRelationshipGuid != ProfilingGuid(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000247 }
248
Jim Flynn6398a982020-05-27 17:05:21 +0100249 // Check the tail GUID of the relationship
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000250 offset += uint64_t_size;
251 uint64_t readTailRelationshipGuid = ReadUint64(readableData, offset);
252 if (tailGuid.has_value())
253 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100254 CHECK(readTailRelationshipGuid == tailGuid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000255 }
256 else
257 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100258 CHECK(readTailRelationshipGuid != ProfilingGuid(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000259 }
260
Jim Flynn6398a982020-05-27 17:05:21 +0100261 // Check the attribute GUID of the relationship
Finn Williams0a336dc2020-05-11 15:39:58 +0100262 offset += uint64_t_size;
263 uint64_t readAttributeRelationshipGuid = ReadUint64(readableData, offset);
264 if (attributeGuid.has_value())
265 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100266 CHECK(readAttributeRelationshipGuid == attributeGuid.value());
Finn Williams0a336dc2020-05-11 15:39:58 +0100267 }
268 else
269 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100270 CHECK(readAttributeRelationshipGuid == ProfilingGuid(0));
Finn Williams0a336dc2020-05-11 15:39:58 +0100271 }
272
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000273 // Update the offset to allow parsing to be continued after this function returns
274 offset += uint64_t_size;
275}
276
Jim Flynndecd08b2022-03-13 22:35:46 +0000277ProfilingGuid VerifyTimelineEntityBinaryPacketData(arm::pipe::Optional<ProfilingGuid> guid,
Jim Flynn6398a982020-05-27 17:05:21 +0100278 const unsigned char* readableData,
279 unsigned int& offset)
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000280{
Jim Flynn6730fe92022-03-10 22:57:47 +0000281 ARM_PIPE_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000282
283 // Utils
284 unsigned int uint32_t_size = sizeof(uint32_t);
285 unsigned int uint64_t_size = sizeof(uint64_t);
286
287 // Reading TimelineEntityClassBinaryPacket
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000288 // Check the decl_id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000289 uint32_t entityDeclId = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100290 CHECK(entityDeclId == 1);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000291
292 // Check the profiling GUID
293 offset += uint32_t_size;
294 uint64_t readProfilingGuid = ReadUint64(readableData, offset);
295
296 if (guid.has_value())
297 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100298 CHECK(readProfilingGuid == guid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000299 }
300 else
301 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100302 CHECK(readProfilingGuid != ProfilingGuid(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000303 }
304
305 offset += uint64_t_size;
Jim Flynn6398a982020-05-27 17:05:21 +0100306
307 ProfilingGuid entityGuid(readProfilingGuid);
308 return entityGuid;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000309}
310
Jim Flynndecd08b2022-03-13 22:35:46 +0000311ProfilingGuid VerifyTimelineEventBinaryPacket(arm::pipe::Optional<uint64_t> timestamp,
312 arm::pipe::Optional<int> threadId,
313 arm::pipe::Optional<ProfilingGuid> eventGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100314 const unsigned char* readableData,
315 unsigned int& offset)
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000316{
Jim Flynn6730fe92022-03-10 22:57:47 +0000317 ARM_PIPE_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000318
319 // Utils
320 unsigned int uint32_t_size = sizeof(uint32_t);
321 unsigned int uint64_t_size = sizeof(uint64_t);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000322
323 // Reading TimelineEventBinaryPacket
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000324 // Check the decl_id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000325 uint32_t entityDeclId = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100326 CHECK(entityDeclId == 4);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000327
328 // Check the timestamp
329 offset += uint32_t_size;
330 uint64_t readTimestamp = ReadUint64(readableData, offset);
331 if (timestamp.has_value())
332 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100333 CHECK(readTimestamp == timestamp.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000334 }
335 else
336 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100337 CHECK(readTimestamp != 0);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000338 }
339
340 // Check the thread id
341 offset += uint64_t_size;
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100342 std::vector<uint8_t> readThreadId(ThreadIdSize, 0);
343 ReadBytes(readableData, offset, ThreadIdSize, readThreadId.data());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000344 if (threadId.has_value())
345 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100346 CHECK(readThreadId == threadId.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000347 }
348 else
349 {
Jim Flynn9c85b412022-03-16 00:27:43 +0000350 CHECK(readThreadId == arm::pipe::GetCurrentThreadId());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000351 }
352
353 // Check the event GUID
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100354 offset += ThreadIdSize;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000355 uint64_t readEventGuid = ReadUint64(readableData, offset);
356 if (eventGuid.has_value())
357 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100358 CHECK(readEventGuid == eventGuid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000359 }
360 else
361 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100362 CHECK(readEventGuid != ProfilingGuid(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000363 }
364
365 offset += uint64_t_size;
Jim Flynn6398a982020-05-27 17:05:21 +0100366
367 ProfilingGuid eventid(readEventGuid);
368 return eventid;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000369}
370
371void VerifyPostOptimisationStructureTestImpl(armnn::BackendId backendId)
372{
373 using namespace armnn;
374
375 // Create runtime in which test will run
376 armnn::IRuntime::CreationOptions options;
377 options.m_ProfilingOptions.m_EnableProfiling = true;
Keith Davis33ed2212020-03-30 10:43:41 +0100378 options.m_ProfilingOptions.m_TimelineEnabled = true;
Kevin Mayd92a6e42021-02-04 10:27:41 +0000379 armnn::RuntimeImpl runtime(options);
Jim Flynn4c9ed1d2022-01-23 23:57:20 +0000380 GetProfilingService(&runtime).ResetExternalProfilingOptions(
381 ConvertExternalProfilingOptions(options.m_ProfilingOptions), false);
Keith Davis33ed2212020-03-30 10:43:41 +0100382
Jim Flynn34430252022-03-04 15:03:58 +0000383 ArmNNProfilingServiceInitialiser initialiser;
384 ProfilingServiceRuntimeHelper profilingServiceHelper(
385 arm::pipe::MAX_ARMNN_COUNTER, initialiser, GetProfilingService(&runtime));
Keith Davis33ed2212020-03-30 10:43:41 +0100386 profilingServiceHelper.ForceTransitionToState(ProfilingState::NotConnected);
387 profilingServiceHelper.ForceTransitionToState(ProfilingState::WaitingForAck);
388 profilingServiceHelper.ForceTransitionToState(ProfilingState::Active);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000389
390 // build up the structure of the network
391 INetworkPtr net(INetwork::Create());
392
393 // Convolution details
394 TensorInfo inputInfo({ 1, 2, 5, 1 }, DataType::Float32);
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100395 TensorInfo weightInfo({ 3, 2, 3, 1 }, DataType::Float32, 0.0f, 0, true);
396 TensorInfo biasInfo({ 3 }, DataType::Float32, 0.0f, 0, true);
Keith Davis97da5e22020-03-05 16:25:28 +0000397 TensorInfo outputInfo({ 1, 3, 7, 1 }, DataType::Float32);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000398 std::vector<float> weightsData{
Keith Davis97da5e22020-03-05 16:25:28 +0000399 1.0f, 0.0f, 0.0f,
400 0.0f, 2.0f, -1.5f,
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000401
Keith Davis97da5e22020-03-05 16:25:28 +0000402 0.0f, 0.0f, 0.0f,
403 0.2f, 0.2f, 0.2f,
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000404
Keith Davis97da5e22020-03-05 16:25:28 +0000405 0.5f, 0.0f, 0.5f,
406 0.0f, -1.0f, 0.0f
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000407 };
408 ConstTensor weights(weightInfo, weightsData);
409
Jim Flynndecd08b2022-03-13 22:35:46 +0000410 armnn::Optional<ConstTensor> optionalBiases;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000411 std::vector<float> biasesData{ 1.0f, 0.0f, 0.0f };
412 ConstTensor biases(biasInfo, biasesData);
Jim Flynndecd08b2022-03-13 22:35:46 +0000413 optionalBiases = armnn::Optional<ConstTensor>(biases);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000414
415 // Input layer
416 IConnectableLayer* input = net->AddInputLayer(0, "input");
417
418 // Convolution2d layer
419 Convolution2dDescriptor conv2dDesc;
Keith Davis97da5e22020-03-05 16:25:28 +0000420 conv2dDesc.m_StrideX = 1;
421 conv2dDesc.m_StrideY = 1;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000422 conv2dDesc.m_PadLeft = 0;
423 conv2dDesc.m_PadRight = 0;
424 conv2dDesc.m_PadTop = 2;
425 conv2dDesc.m_PadBottom = 2;
426 conv2dDesc.m_BiasEnabled = true;
427 IConnectableLayer* conv2d = net->AddConvolution2dLayer(conv2dDesc, weights, optionalBiases);
428
Mike Kelly07810fc2020-11-12 10:58:48 +0000429 // Abs layer
430 armnn::ElementwiseUnaryDescriptor absDesc;
431 armnn::IConnectableLayer* const abs = net->AddElementwiseUnaryLayer(absDesc, "abs");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000432
433 // Output layer
434 IConnectableLayer* output = net->AddOutputLayer(0, "output");
435
436 input->GetOutputSlot(0).Connect(conv2d->GetInputSlot(0));
Mike Kelly07810fc2020-11-12 10:58:48 +0000437 conv2d->GetOutputSlot(0).Connect(abs->GetInputSlot(0));
438 abs->GetOutputSlot(0).Connect(output->GetInputSlot(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000439
440 input->GetOutputSlot(0).SetTensorInfo(inputInfo);
441 conv2d->GetOutputSlot(0).SetTensorInfo(outputInfo);
Mike Kelly07810fc2020-11-12 10:58:48 +0000442 abs->GetOutputSlot(0).SetTensorInfo(outputInfo);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000443
444 // optimize the network
445 std::vector<armnn::BackendId> backends = { backendId };
Sadik Armagan3184c902020-03-18 10:57:30 +0000446 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime.GetDeviceSpec());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000447
448 ProfilingGuid optNetGuid = optNet->GetGuid();
449
450 // Load it into the runtime. It should success.
451 armnn::NetworkId netId;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100452 CHECK(runtime.LoadNetwork(netId, std::move(optNet)) == Status::Success);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000453
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000454 BufferManager& bufferManager = profilingServiceHelper.GetProfilingBufferManager();
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000455 auto readableBuffer = bufferManager.GetReadableBuffer();
456
Jim Flynnf7713212020-07-14 09:50:59 +0100457 // Profiling is enabled, the post-optimisation structure should be created
Sadik Armagan1625efc2021-06-10 18:24:34 +0100458 CHECK(readableBuffer != nullptr);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000459 unsigned int size = readableBuffer->GetSize();
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000460
461 const unsigned char* readableData = readableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100462 CHECK(readableData != nullptr);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000463
464 unsigned int offset = 0;
465
Keith Davis97da5e22020-03-05 16:25:28 +0000466 // Verify Header
Jim Flynnf7713212020-07-14 09:50:59 +0100467 VerifyTimelineHeaderBinary(readableData, offset, size - 8);
Keith Davis97da5e22020-03-05 16:25:28 +0000468
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000469 // Post-optimisation network
470 // Network entity
Keith Davis97da5e22020-03-05 16:25:28 +0000471 VerifyTimelineEntityBinaryPacketData(optNetGuid, readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000472
473 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000474 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000475 arm::pipe::EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000476 optNetGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100477 LabelsAndEventClasses::NETWORK_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000478 LabelsAndEventClasses::TYPE_GUID,
479 readableData,
480 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000481
Jim Flynnf7713212020-07-14 09:50:59 +0100482 // Network - START OF LIFE
Jim Flynndecd08b2022-03-13 22:35:46 +0000483 ProfilingGuid networkSolEventGuid = VerifyTimelineEventBinaryPacket(arm::pipe::EmptyOptional(),
484 arm::pipe::EmptyOptional(),
485 arm::pipe::EmptyOptional(),
Jim Flynnf7713212020-07-14 09:50:59 +0100486 readableData,
487 offset);
Jim Flynnf7713212020-07-14 09:50:59 +0100488
489 // Network - START OF LIFE event relationship
490 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000491 arm::pipe::EmptyOptional(),
Jim Flynnf7713212020-07-14 09:50:59 +0100492 optNetGuid,
493 networkSolEventGuid,
494 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
495 readableData,
496 offset);
Jim Flynnf7713212020-07-14 09:50:59 +0100497
498 // Process ID Label
Jim Flynn9c85b412022-03-16 00:27:43 +0000499 int processID = arm::pipe::GetCurrentProcessId();
Jim Flynnf7713212020-07-14 09:50:59 +0100500 std::stringstream ss;
501 ss << processID;
502 std::string processIdLabel = ss.str();
Jim Flynndecd08b2022-03-13 22:35:46 +0000503 VerifyTimelineLabelBinaryPacketData(
504 arm::pipe::EmptyOptional(), processIdLabel, readableData, offset);
Jim Flynnf7713212020-07-14 09:50:59 +0100505
506 // Entity - Process ID relationship
507 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000508 arm::pipe::EmptyOptional(),
Jim Flynnf7713212020-07-14 09:50:59 +0100509 optNetGuid,
Jim Flynndecd08b2022-03-13 22:35:46 +0000510 arm::pipe::EmptyOptional(),
Jim Flynnf7713212020-07-14 09:50:59 +0100511 LabelsAndEventClasses::PROCESS_ID_GUID,
512 readableData,
513 offset);
Jim Flynnf7713212020-07-14 09:50:59 +0100514
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000515 // Input layer
516 // Input layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000517 VerifyTimelineEntityBinaryPacketData(input->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000518
519 // Name Entity
Jim Flynndecd08b2022-03-13 22:35:46 +0000520 ProfilingGuid inputLabelGuid = VerifyTimelineLabelBinaryPacketData(
521 arm::pipe::EmptyOptional(), "input", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000522
523 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000524 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000525 arm::pipe::EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000526 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100527 inputLabelGuid,
Finn Williams0a336dc2020-05-11 15:39:58 +0100528 LabelsAndEventClasses::NAME_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000529 readableData,
530 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000531
532 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000533 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000534 arm::pipe::EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000535 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100536 LabelsAndEventClasses::LAYER_GUID,
Finn Williams0a336dc2020-05-11 15:39:58 +0100537 LabelsAndEventClasses::TYPE_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000538 readableData,
539 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000540
541 // Network - Input layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000542 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000543 arm::pipe::EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000544 optNetGuid,
545 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100546 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000547 readableData,
548 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000549
550 // Conv2d layer
551 // Conv2d layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000552 VerifyTimelineEntityBinaryPacketData(conv2d->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000553
554 // Name entity
Jim Flynn6398a982020-05-27 17:05:21 +0100555 ProfilingGuid conv2dNameLabelGuid = VerifyTimelineLabelBinaryPacketData(
Jim Flynndecd08b2022-03-13 22:35:46 +0000556 arm::pipe::EmptyOptional(), "<Unnamed>", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000557
558 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000559 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000560 arm::pipe::EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000561 conv2d->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100562 conv2dNameLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000563 LabelsAndEventClasses::NAME_GUID,
564 readableData,
565 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000566
567 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000568 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000569 arm::pipe::EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000570 conv2d->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100571 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000572 LabelsAndEventClasses::TYPE_GUID,
573 readableData,
574 offset);
Finn Williams0a336dc2020-05-11 15:39:58 +0100575
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000576 // Network - Conv2d layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000577 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000578 arm::pipe::EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000579 optNetGuid,
580 conv2d->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100581 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000582 readableData,
583 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000584
585 // Input layer - Conv2d layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000586 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000587 arm::pipe::EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000588 input->GetGuid(),
589 conv2d->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000590 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000591 readableData,
592 offset);
Finn Williams0a336dc2020-05-11 15:39:58 +0100593
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000594 // Conv2d workload
595 // Conv2d workload entity
Jim Flynndecd08b2022-03-13 22:35:46 +0000596 ProfilingGuid conv2DWorkloadGuid = VerifyTimelineEntityBinaryPacketData(
597 arm::pipe::EmptyOptional(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000598
599 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000600 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000601 arm::pipe::EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100602 conv2DWorkloadGuid,
603 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000604 LabelsAndEventClasses::TYPE_GUID,
605 readableData,
606 offset);
Finn Williams0a336dc2020-05-11 15:39:58 +0100607
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000608 // BackendId entity
Jim Flynn6398a982020-05-27 17:05:21 +0100609 ProfilingGuid backendIdLabelGuid = VerifyTimelineLabelBinaryPacketData(
Jim Flynndecd08b2022-03-13 22:35:46 +0000610 arm::pipe::EmptyOptional(), backendId.Get(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000611
612 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000613 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000614 arm::pipe::EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100615 conv2DWorkloadGuid,
616 backendIdLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000617 LabelsAndEventClasses::BACKENDID_GUID,
618 readableData,
619 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000620
Finn Williams0a336dc2020-05-11 15:39:58 +0100621
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000622 // Conv2d layer - Conv2d workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000623 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000624 arm::pipe::EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000625 conv2d->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100626 conv2DWorkloadGuid,
627 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000628 readableData,
629 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000630
Mike Kelly07810fc2020-11-12 10:58:48 +0000631 // Abs layer
632 // Abs layer entity
633 VerifyTimelineEntityBinaryPacketData(abs->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000634
635 // Name entity
Mike Kelly07810fc2020-11-12 10:58:48 +0000636 ProfilingGuid absLabelGuid = VerifyTimelineLabelBinaryPacketData(
Jim Flynndecd08b2022-03-13 22:35:46 +0000637 arm::pipe::EmptyOptional(), "abs", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000638
639 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000640 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000641 arm::pipe::EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000642 abs->GetGuid(),
643 absLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000644 LabelsAndEventClasses::NAME_GUID,
645 readableData,
646 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000647
648 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000649 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000650 arm::pipe::EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000651 abs->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100652 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000653 LabelsAndEventClasses::TYPE_GUID,
654 readableData,
655 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000656
Mike Kelly07810fc2020-11-12 10:58:48 +0000657 // Network - Abs layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000658 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000659 arm::pipe::EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000660 optNetGuid,
Mike Kelly07810fc2020-11-12 10:58:48 +0000661 abs->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100662 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000663 readableData,
664 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000665
Mike Kelly07810fc2020-11-12 10:58:48 +0000666 // Conv2d layer - Abs layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000667 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000668 arm::pipe::EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000669 conv2d->GetGuid(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000670 abs->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000671 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000672 readableData,
673 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000674
Mike Kelly07810fc2020-11-12 10:58:48 +0000675 // Abs workload
676 // Abs workload entity
Jim Flynndecd08b2022-03-13 22:35:46 +0000677 ProfilingGuid absWorkloadGuid = VerifyTimelineEntityBinaryPacketData(
678 arm::pipe::EmptyOptional(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000679
680 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000681 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000682 arm::pipe::EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000683 absWorkloadGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100684 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000685 LabelsAndEventClasses::TYPE_GUID,
686 readableData,
687 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000688
689 // BackendId entity
Jim Flynndecd08b2022-03-13 22:35:46 +0000690 VerifyTimelineLabelBinaryPacketData(arm::pipe::EmptyOptional(), backendId.Get(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000691
692 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000693 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000694 arm::pipe::EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000695 absWorkloadGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100696 backendIdLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000697 LabelsAndEventClasses::BACKENDID_GUID,
698 readableData,
699 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000700
Mike Kelly07810fc2020-11-12 10:58:48 +0000701 // Abs layer - Abs workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000702 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000703 arm::pipe::EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000704 abs->GetGuid(),
705 absWorkloadGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100706 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000707 readableData,
708 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000709
710 // Output layer
711 // Output layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000712 VerifyTimelineEntityBinaryPacketData(output->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000713
714 // Name entity
Jim Flynn6398a982020-05-27 17:05:21 +0100715 ProfilingGuid outputLabelGuid = VerifyTimelineLabelBinaryPacketData(
Jim Flynndecd08b2022-03-13 22:35:46 +0000716 arm::pipe::EmptyOptional(), "output", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000717
718 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000719 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000720 arm::pipe::EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000721 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100722 outputLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000723 LabelsAndEventClasses::NAME_GUID,
724 readableData,
725 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000726
727 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000728 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000729 arm::pipe::EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000730 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100731 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000732 LabelsAndEventClasses::TYPE_GUID,
733 readableData,
734 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000735
736 // Network - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000737 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000738 arm::pipe::EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000739 optNetGuid,
740 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100741 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000742 readableData,
743 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000744
Mike Kelly07810fc2020-11-12 10:58:48 +0000745 // Abs layer - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000746 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000747 arm::pipe::EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000748 abs->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000749 output->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000750 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000751 readableData,
752 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000753
754 bufferManager.MarkRead(readableBuffer);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000755
756 // Creates structures for input & output.
757 std::vector<float> inputData(inputInfo.GetNumElements());
758 std::vector<float> outputData(outputInfo.GetNumElements());
759
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100760 TensorInfo inputTensorInfo = runtime.GetInputTensorInfo(netId, 0);
761 inputTensorInfo.SetConstant(true);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000762 InputTensors inputTensors
Keith Davis97da5e22020-03-05 16:25:28 +0000763 {
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100764 {0, ConstTensor(inputTensorInfo, inputData.data())}
Keith Davis97da5e22020-03-05 16:25:28 +0000765 };
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000766 OutputTensors outputTensors
Keith Davis97da5e22020-03-05 16:25:28 +0000767 {
Sadik Armagan3184c902020-03-18 10:57:30 +0000768 {0, Tensor(runtime.GetOutputTensorInfo(netId, 0), outputData.data())}
Keith Davis97da5e22020-03-05 16:25:28 +0000769 };
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000770
771 // Does the inference.
Sadik Armagan3184c902020-03-18 10:57:30 +0000772 runtime.EnqueueWorkload(netId, inputTensors, outputTensors);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000773
Finn Williamsb6a402f2020-03-24 13:46:22 +0000774 // Get readable buffer for input workload
775 auto inputReadableBuffer = bufferManager.GetReadableBuffer();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100776 CHECK(inputReadableBuffer != nullptr);
David Monahan6198fe02019-12-02 08:35:43 +0000777
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000778 // Get readable buffer for output workload
779 auto outputReadableBuffer = bufferManager.GetReadableBuffer();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100780 CHECK(outputReadableBuffer != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000781
Finn Williamsb6a402f2020-03-24 13:46:22 +0000782 // Get readable buffer for inference timeline
783 auto inferenceReadableBuffer = bufferManager.GetReadableBuffer();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100784 CHECK(inferenceReadableBuffer != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000785
786 // Validate input workload data
787 size = inputReadableBuffer->GetSize();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100788 CHECK(size == 164);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000789
790 readableData = inputReadableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100791 CHECK(readableData != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000792
793 offset = 0;
794
Keith Davis97da5e22020-03-05 16:25:28 +0000795 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100796 VerifyTimelineHeaderBinary(readableData, offset, 156);
Keith Davis97da5e22020-03-05 16:25:28 +0000797
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000798 // Input workload
799 // Input workload entity
Jim Flynndecd08b2022-03-13 22:35:46 +0000800 ProfilingGuid inputWorkloadGuid = VerifyTimelineEntityBinaryPacketData(
801 arm::pipe::EmptyOptional(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000802
803 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000804 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000805 arm::pipe::EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100806 inputWorkloadGuid,
807 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000808 LabelsAndEventClasses::TYPE_GUID,
809 readableData,
810 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000811
812 // BackendId entity
Jim Flynndecd08b2022-03-13 22:35:46 +0000813 VerifyTimelineLabelBinaryPacketData(arm::pipe::EmptyOptional(), backendId.Get(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000814
815 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000816 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000817 arm::pipe::EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100818 inputWorkloadGuid,
819 backendIdLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000820 LabelsAndEventClasses::BACKENDID_GUID,
821 readableData,
822 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000823
824 // Input layer - Input workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000825 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000826 arm::pipe::EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000827 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100828 inputWorkloadGuid,
829 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000830 readableData,
831 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000832
833 bufferManager.MarkRead(inputReadableBuffer);
834
835 // Validate output workload data
836 size = outputReadableBuffer->GetSize();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100837 CHECK(size == 164);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000838
839 readableData = outputReadableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100840 CHECK(readableData != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000841
842 offset = 0;
843
Keith Davis97da5e22020-03-05 16:25:28 +0000844 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100845 VerifyTimelineHeaderBinary(readableData, offset, 156);
Keith Davis97da5e22020-03-05 16:25:28 +0000846
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000847 // Output workload
848 // Output workload entity
Jim Flynndecd08b2022-03-13 22:35:46 +0000849 ProfilingGuid outputWorkloadGuid = VerifyTimelineEntityBinaryPacketData(
850 arm::pipe::EmptyOptional(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000851
852 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000853 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000854 arm::pipe::EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100855 outputWorkloadGuid,
856 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000857 LabelsAndEventClasses::TYPE_GUID,
858 readableData,
859 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000860
861 // BackendId entity
Jim Flynndecd08b2022-03-13 22:35:46 +0000862 VerifyTimelineLabelBinaryPacketData(arm::pipe::EmptyOptional(), backendId.Get(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000863
864 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000865 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000866 arm::pipe::EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100867 outputWorkloadGuid,
868 backendIdLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000869 LabelsAndEventClasses::BACKENDID_GUID,
870 readableData,
871 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000872
873 // Output layer - Output workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000874 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000875 arm::pipe::EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000876 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100877 outputWorkloadGuid,
878 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000879 readableData,
880 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000881
882 bufferManager.MarkRead(outputReadableBuffer);
David Monahan6198fe02019-12-02 08:35:43 +0000883
884 // Validate inference data
885 size = inferenceReadableBuffer->GetSize();
Jan Eilersa10e2a22020-03-26 12:04:54 +0000886
Sadik Armagan1625efc2021-06-10 18:24:34 +0100887 CHECK(size == 1228 + 10 * ThreadIdSize);
David Monahan6198fe02019-12-02 08:35:43 +0000888
889 readableData = inferenceReadableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100890 CHECK(readableData != nullptr);
David Monahan6198fe02019-12-02 08:35:43 +0000891
892 offset = 0;
893
Keith Davis97da5e22020-03-05 16:25:28 +0000894 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100895 VerifyTimelineHeaderBinary(readableData, offset, 1220 + 10 * ThreadIdSize);
Keith Davis97da5e22020-03-05 16:25:28 +0000896
David Monahan6198fe02019-12-02 08:35:43 +0000897 // Inference timeline trace
898 // Inference entity
Jim Flynndecd08b2022-03-13 22:35:46 +0000899 ProfilingGuid inferenceGuid = VerifyTimelineEntityBinaryPacketData(
900 arm::pipe::EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000901
902 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000903 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000904 arm::pipe::EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100905 inferenceGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000906 LabelsAndEventClasses::INFERENCE_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000907 LabelsAndEventClasses::TYPE_GUID,
908 readableData,
909 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000910
911 // Network - Inference relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000912 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000913 arm::pipe::EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000914 optNetGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100915 inferenceGuid,
916 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000917 readableData,
918 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000919
920 // Start Inference life
921 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100922 ProfilingGuid inferenceEventGuid = VerifyTimelineEventBinaryPacket(
Jim Flynndecd08b2022-03-13 22:35:46 +0000923 arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000924
925 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000926 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000927 arm::pipe::EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100928 inferenceGuid,
929 inferenceEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000930 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
931 readableData,
932 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000933
934 // Execution
935 // Input workload execution
936 // Input workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +0100937 ProfilingGuid inputWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
Jim Flynndecd08b2022-03-13 22:35:46 +0000938 arm::pipe::EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000939
940 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000941 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000942 arm::pipe::EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100943 inputWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000944 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000945 LabelsAndEventClasses::TYPE_GUID,
946 readableData,
947 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000948
949 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000950 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000951 arm::pipe::EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100952 inferenceGuid,
953 inputWorkloadExecutionGuid,
954 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000955 readableData,
956 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000957
958 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000959 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000960 arm::pipe::EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100961 inputWorkloadGuid,
962 inputWorkloadExecutionGuid,
963 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000964 readableData,
965 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000966
967 // Start Input workload execution life
968 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100969 ProfilingGuid inputWorkloadExecutionSOLEventId = VerifyTimelineEventBinaryPacket(
Jim Flynndecd08b2022-03-13 22:35:46 +0000970 arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000971
972 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000973 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000974 arm::pipe::EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100975 inputWorkloadExecutionGuid,
976 inputWorkloadExecutionSOLEventId,
Keith Davis97da5e22020-03-05 16:25:28 +0000977 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
978 readableData,
979 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000980
981 // End of Input workload execution life
982 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100983 ProfilingGuid inputWorkloadExecutionEOLEventId = VerifyTimelineEventBinaryPacket(
Jim Flynndecd08b2022-03-13 22:35:46 +0000984 arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000985
986 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000987 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +0000988 arm::pipe::EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100989 inputWorkloadExecutionGuid,
990 inputWorkloadExecutionEOLEventId,
Keith Davis97da5e22020-03-05 16:25:28 +0000991 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
992 readableData,
993 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000994
995 // Conv2d workload execution
996 // Conv2d workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +0100997 ProfilingGuid conv2DWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
Jim Flynndecd08b2022-03-13 22:35:46 +0000998 arm::pipe::EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000999
1000 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001001 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
Jim Flynndecd08b2022-03-13 22:35:46 +00001002 arm::pipe::EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001003 conv2DWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001004 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001005 LabelsAndEventClasses::TYPE_GUID,
1006 readableData,
1007 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001008
1009 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001010 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +00001011 arm::pipe::EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001012 inferenceGuid,
1013 conv2DWorkloadExecutionGuid,
1014 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001015 readableData,
1016 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001017
1018 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001019 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +00001020 arm::pipe::EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001021 conv2DWorkloadGuid,
1022 conv2DWorkloadExecutionGuid,
1023 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001024 readableData,
1025 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001026
1027 // Start Conv2d workload execution life
1028 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001029 ProfilingGuid conv2DWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
Jim Flynndecd08b2022-03-13 22:35:46 +00001030 arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001031
1032 // Conv2d workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001033 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +00001034 arm::pipe::EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001035 conv2DWorkloadExecutionGuid,
1036 conv2DWorkloadExecutionSOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001037 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1038 readableData,
1039 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001040
1041 // End of Conv2d workload execution life
1042 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001043 ProfilingGuid conv2DWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
Jim Flynndecd08b2022-03-13 22:35:46 +00001044 arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001045
1046 // Conv2d workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001047 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +00001048 arm::pipe::EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001049 conv2DWorkloadExecutionGuid,
1050 conv2DWorkloadExecutionEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001051 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1052 readableData,
1053 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001054
Mike Kelly07810fc2020-11-12 10:58:48 +00001055 // Abs workload execution
1056 // Abs workload execution entity
1057 ProfilingGuid absWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
Jim Flynndecd08b2022-03-13 22:35:46 +00001058 arm::pipe::EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001059
1060 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001061 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
Jim Flynndecd08b2022-03-13 22:35:46 +00001062 arm::pipe::EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +00001063 absWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001064 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001065 LabelsAndEventClasses::TYPE_GUID,
1066 readableData,
1067 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001068
1069 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001070 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +00001071 arm::pipe::EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001072 inferenceGuid,
Mike Kelly07810fc2020-11-12 10:58:48 +00001073 absWorkloadExecutionGuid,
Jim Flynn6398a982020-05-27 17:05:21 +01001074 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001075 readableData,
1076 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001077
1078 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001079 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +00001080 arm::pipe::EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +00001081 absWorkloadGuid,
1082 absWorkloadExecutionGuid,
Jim Flynn6398a982020-05-27 17:05:21 +01001083 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001084 readableData,
1085 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001086
Mike Kelly07810fc2020-11-12 10:58:48 +00001087 // Start Abs workload execution life
David Monahan6198fe02019-12-02 08:35:43 +00001088 // Event packet - timeline, threadId, eventGuid
Mike Kelly07810fc2020-11-12 10:58:48 +00001089 ProfilingGuid absWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
Jim Flynndecd08b2022-03-13 22:35:46 +00001090 arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001091
Mike Kelly07810fc2020-11-12 10:58:48 +00001092 // Abs workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001093 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +00001094 arm::pipe::EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +00001095 absWorkloadExecutionGuid,
1096 absWorkloadExecutionSOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001097 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1098 readableData,
1099 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001100
Mike Kelly07810fc2020-11-12 10:58:48 +00001101 // End of Abs workload execution life
David Monahan6198fe02019-12-02 08:35:43 +00001102 // Event packet - timeline, threadId, eventGuid
Mike Kelly07810fc2020-11-12 10:58:48 +00001103 ProfilingGuid absWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
Jim Flynndecd08b2022-03-13 22:35:46 +00001104 arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001105
Mike Kelly07810fc2020-11-12 10:58:48 +00001106 // Abs workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001107 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +00001108 arm::pipe::EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +00001109 absWorkloadExecutionGuid,
1110 absWorkloadExecutionEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001111 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1112 readableData,
1113 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001114
1115 // Output workload execution
1116 // Output workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +01001117 ProfilingGuid outputWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
Jim Flynndecd08b2022-03-13 22:35:46 +00001118 arm::pipe::EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001119
1120 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001121 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
Jim Flynndecd08b2022-03-13 22:35:46 +00001122 arm::pipe::EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001123 outputWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001124 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001125 LabelsAndEventClasses::TYPE_GUID,
1126 readableData,
1127 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001128
1129 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001130 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +00001131 arm::pipe::EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001132 inferenceGuid,
1133 outputWorkloadExecutionGuid,
1134 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001135 readableData,
1136 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001137
1138 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001139 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +00001140 arm::pipe::EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001141 outputWorkloadGuid,
1142 outputWorkloadExecutionGuid,
1143 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001144 readableData,
1145 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001146
1147 // Start Output workload execution life
1148 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001149 ProfilingGuid outputWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
Jim Flynndecd08b2022-03-13 22:35:46 +00001150 arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001151
1152 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001153 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +00001154 arm::pipe::EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001155 outputWorkloadExecutionGuid,
1156 outputWorkloadExecutionSOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001157 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1158 readableData,
1159 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001160
1161 // End of Normalize workload execution life
1162 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001163 ProfilingGuid outputWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
Jim Flynndecd08b2022-03-13 22:35:46 +00001164 arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001165
1166 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001167 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +00001168 arm::pipe::EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001169 outputWorkloadExecutionGuid,
1170 outputWorkloadExecutionEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001171 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1172 readableData,
1173 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001174
1175 // End of Inference life
1176 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001177 ProfilingGuid inferenceEOLEventGuid = VerifyTimelineEventBinaryPacket(
Jim Flynndecd08b2022-03-13 22:35:46 +00001178 arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001179
1180 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001181 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
Jim Flynndecd08b2022-03-13 22:35:46 +00001182 arm::pipe::EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001183 inferenceGuid,
1184 inferenceEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001185 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1186 readableData,
1187 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001188
1189 bufferManager.MarkRead(inferenceReadableBuffer);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +00001190}
Jim Flynn6398a982020-05-27 17:05:21 +01001191
Jim Flynn6398a982020-05-27 17:05:21 +01001192bool CompareOutput(std::vector<std::string> output, std::vector<std::string> expectedOutput)
1193{
1194 if (output.size() != expectedOutput.size())
1195 {
1196 std::cerr << "output has [" << output.size() << "] lines, expected was ["
1197 << expectedOutput.size() << "] lines" << std::endl;
1198 std::cerr << std::endl << "actual" << std::endl << std::endl;
1199 for (auto line : output)
1200 {
1201 std::cerr << line << std::endl;
1202 }
1203 std::cerr << std::endl << "expected" << std::endl << std::endl;
1204 for (auto line : expectedOutput)
1205 {
1206 std::cerr << line << std::endl;
1207 }
1208 return false;
1209 }
1210 bool bRet = true;
1211 for (unsigned long i = 0; i < output.size(); ++i)
1212 {
1213 if (output[i] != expectedOutput[i])
1214 {
1215 bRet = false;
1216 std::cerr << i << ": actual [" << output[i] << "] expected [" << expectedOutput[i] << "]" << std::endl;
1217 }
1218 }
1219 return bRet;
1220}