blob: a6ec66da2fc6a85f6bb7c1472affd1ba19345273 [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"
9#include "ProfilingUtils.hpp"
10
11#include <armnn/Descriptors.hpp>
Jim Flynn34430252022-03-04 15:03:58 +000012#include <armnn/profiling/ArmNNProfiling.hpp>
Matthew Sloyan371b70e2020-09-11 10:14:57 +010013
Jim Flynnf7713212020-07-14 09:50:59 +010014#include <Processes.hpp>
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000015#include <ProfilingService.hpp>
Rob Hughes9542f902021-07-14 09:48:54 +010016#include <armnnUtils/Threads.hpp>
Sadik Armaganea41b572020-03-19 18:16:46 +000017
Jim Flynn6730fe92022-03-10 22:57:47 +000018#include <common/include/Assert.hpp>
Nikhil Raj77fe76b2021-06-09 14:55:32 +010019#include <common/include/LabelsAndEventClasses.hpp>
Jim Flynn75c14f42022-03-10 22:05:42 +000020#include <common/include/NumericCast.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 Flynn75c14f42022-03-10 22:05:42 +000030 payloadSize += arm::pipe::numeric_cast<uint32_t>(GetSoftwareInfo().size()) + 1;
31 payloadSize += arm::pipe::numeric_cast<uint32_t>(GetHardwareVersion().size()) + 1;
32 payloadSize += arm::pipe::numeric_cast<uint32_t>(GetSoftwareVersion().size()) + 1;
33 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 Flynn6398a982020-05-27 17:05:21 +0100105ProfilingGuid VerifyTimelineLabelBinaryPacketData(Optional<ProfilingGuid> guid,
106 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;
131 ProfilingService profilingService(arm::pipe::MAX_ARMNN_COUNTER, initialiser);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100132 CHECK(readProfilingGuid == profilingService.GetStaticId(label));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000133 }
134
135 // Check the SWTrace label
136 offset += uint64_t_size;
137 uint32_t swTraceLabelLength = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100138 CHECK(swTraceLabelLength == label_size + 1); // Label length including the null-terminator
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000139 offset += uint32_t_size;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100140 CHECK(std::memcmp(readableData + offset, // Offset to the label in the buffer
Keith Davis97da5e22020-03-05 16:25:28 +0000141 label.data(), // The original label
142 swTraceLabelLength - 1) == 0); // The length of the label
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000143
144 // SWTrace strings are written in blocks of words, so the offset has to be updated to the next whole word
145 offset += OffsetToNextWord(swTraceLabelLength);
Jim Flynn6398a982020-05-27 17:05:21 +0100146
147 ProfilingGuid labelGuid(readProfilingGuid);
148 return labelGuid;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000149}
150
Keith Davis97da5e22020-03-05 16:25:28 +0000151void VerifyTimelineEventClassBinaryPacketData(ProfilingGuid guid,
Jim Flynn1892d212020-05-26 21:10:49 +0100152 ProfilingGuid nameGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000153 const unsigned char* readableData,
154 unsigned int& offset)
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000155{
Jim Flynn6730fe92022-03-10 22:57:47 +0000156 ARM_PIPE_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000157
158 // Utils
159 unsigned int uint32_t_size = sizeof(uint32_t);
160 unsigned int uint64_t_size = sizeof(uint64_t);
161
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000162 // Check the decl id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000163 uint32_t eventClassDeclId = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100164 CHECK(eventClassDeclId == 2);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000165
166 // Check the profiling GUID
167 offset += uint32_t_size;
168 uint64_t readProfilingGuid = ReadUint64(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100169 CHECK(readProfilingGuid == guid);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000170
Jim Flynn1892d212020-05-26 21:10:49 +0100171 offset += uint64_t_size;
172 uint64_t readProfiilngNameGuid = ReadUint64(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100173 CHECK(readProfiilngNameGuid == nameGuid);
Jim Flynn1892d212020-05-26 21:10:49 +0100174
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000175 // Update the offset to allow parsing to be continued after this function returns
176 offset += uint64_t_size;
177}
178
Keith Davis97da5e22020-03-05 16:25:28 +0000179void VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType relationshipType,
Jim Flynn6398a982020-05-27 17:05:21 +0100180 Optional<ProfilingGuid> relationshipGuid,
181 Optional<ProfilingGuid> headGuid,
182 Optional<ProfilingGuid> tailGuid,
183 Optional<ProfilingGuid> attributeGuid,
184 const unsigned char* readableData,
185 unsigned int& offset)
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000186{
Jim Flynn6730fe92022-03-10 22:57:47 +0000187 ARM_PIPE_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000188
189 uint32_t relationshipTypeUint = 0;
190 switch (relationshipType)
191 {
192 case ProfilingRelationshipType::RetentionLink:
193 relationshipTypeUint = 0;
194 break;
195 case ProfilingRelationshipType::ExecutionLink:
196 relationshipTypeUint = 1;
197 break;
198 case ProfilingRelationshipType::DataLink:
199 relationshipTypeUint = 2;
200 break;
201 case ProfilingRelationshipType::LabelLink:
202 relationshipTypeUint = 3;
203 break;
204 default:
Sadik Armagan1625efc2021-06-10 18:24:34 +0100205 FAIL("Unknown relationship type");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000206 }
207
208 // Utils
209 unsigned int uint32_t_size = sizeof(uint32_t);
210 unsigned int uint64_t_size = sizeof(uint64_t);
211
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000212 // Check the decl id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000213 uint32_t eventClassDeclId = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100214 CHECK(eventClassDeclId == 3);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000215
216 // Check the relationship type
217 offset += uint32_t_size;
218 uint32_t readRelationshipTypeUint = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100219 CHECK(readRelationshipTypeUint == relationshipTypeUint);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000220
221 // Check the relationship GUID
222 offset += uint32_t_size;
223 uint64_t readRelationshipGuid = ReadUint64(readableData, offset);
224 if (relationshipGuid.has_value())
225 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100226 CHECK(readRelationshipGuid == relationshipGuid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000227 }
228 else
229 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100230 CHECK(readRelationshipGuid != ProfilingGuid(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000231 }
232
Jim Flynn6398a982020-05-27 17:05:21 +0100233 // Check the head GUID of the relationship
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000234 offset += uint64_t_size;
235 uint64_t readHeadRelationshipGuid = ReadUint64(readableData, offset);
236 if (headGuid.has_value())
237 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100238 CHECK(readHeadRelationshipGuid == headGuid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000239 }
240 else
241 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100242 CHECK(readHeadRelationshipGuid != ProfilingGuid(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000243 }
244
Jim Flynn6398a982020-05-27 17:05:21 +0100245 // Check the tail GUID of the relationship
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000246 offset += uint64_t_size;
247 uint64_t readTailRelationshipGuid = ReadUint64(readableData, offset);
248 if (tailGuid.has_value())
249 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100250 CHECK(readTailRelationshipGuid == tailGuid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000251 }
252 else
253 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100254 CHECK(readTailRelationshipGuid != ProfilingGuid(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000255 }
256
Jim Flynn6398a982020-05-27 17:05:21 +0100257 // Check the attribute GUID of the relationship
Finn Williams0a336dc2020-05-11 15:39:58 +0100258 offset += uint64_t_size;
259 uint64_t readAttributeRelationshipGuid = ReadUint64(readableData, offset);
260 if (attributeGuid.has_value())
261 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100262 CHECK(readAttributeRelationshipGuid == attributeGuid.value());
Finn Williams0a336dc2020-05-11 15:39:58 +0100263 }
264 else
265 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100266 CHECK(readAttributeRelationshipGuid == ProfilingGuid(0));
Finn Williams0a336dc2020-05-11 15:39:58 +0100267 }
268
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000269 // Update the offset to allow parsing to be continued after this function returns
270 offset += uint64_t_size;
271}
272
Jim Flynn6398a982020-05-27 17:05:21 +0100273ProfilingGuid VerifyTimelineEntityBinaryPacketData(Optional<ProfilingGuid> guid,
274 const unsigned char* readableData,
275 unsigned int& offset)
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000276{
Jim Flynn6730fe92022-03-10 22:57:47 +0000277 ARM_PIPE_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000278
279 // Utils
280 unsigned int uint32_t_size = sizeof(uint32_t);
281 unsigned int uint64_t_size = sizeof(uint64_t);
282
283 // Reading TimelineEntityClassBinaryPacket
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000284 // Check the decl_id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000285 uint32_t entityDeclId = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100286 CHECK(entityDeclId == 1);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000287
288 // Check the profiling GUID
289 offset += uint32_t_size;
290 uint64_t readProfilingGuid = ReadUint64(readableData, offset);
291
292 if (guid.has_value())
293 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100294 CHECK(readProfilingGuid == guid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000295 }
296 else
297 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100298 CHECK(readProfilingGuid != ProfilingGuid(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000299 }
300
301 offset += uint64_t_size;
Jim Flynn6398a982020-05-27 17:05:21 +0100302
303 ProfilingGuid entityGuid(readProfilingGuid);
304 return entityGuid;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000305}
306
Jim Flynn6398a982020-05-27 17:05:21 +0100307ProfilingGuid VerifyTimelineEventBinaryPacket(Optional<uint64_t> timestamp,
Jim Flynn1fdeb992020-07-09 07:28:37 +0100308 Optional<int> threadId,
Jim Flynn6398a982020-05-27 17:05:21 +0100309 Optional<ProfilingGuid> eventGuid,
310 const unsigned char* readableData,
311 unsigned int& offset)
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000312{
Jim Flynn6730fe92022-03-10 22:57:47 +0000313 ARM_PIPE_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000314
315 // Utils
316 unsigned int uint32_t_size = sizeof(uint32_t);
317 unsigned int uint64_t_size = sizeof(uint64_t);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000318
319 // Reading TimelineEventBinaryPacket
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000320 // Check the decl_id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000321 uint32_t entityDeclId = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100322 CHECK(entityDeclId == 4);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000323
324 // Check the timestamp
325 offset += uint32_t_size;
326 uint64_t readTimestamp = ReadUint64(readableData, offset);
327 if (timestamp.has_value())
328 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100329 CHECK(readTimestamp == timestamp.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000330 }
331 else
332 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100333 CHECK(readTimestamp != 0);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000334 }
335
336 // Check the thread id
337 offset += uint64_t_size;
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100338 std::vector<uint8_t> readThreadId(ThreadIdSize, 0);
339 ReadBytes(readableData, offset, ThreadIdSize, readThreadId.data());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000340 if (threadId.has_value())
341 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100342 CHECK(readThreadId == threadId.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000343 }
344 else
345 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100346 CHECK(readThreadId == armnnUtils::Threads::GetCurrentThreadId());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000347 }
348
349 // Check the event GUID
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100350 offset += ThreadIdSize;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000351 uint64_t readEventGuid = ReadUint64(readableData, offset);
352 if (eventGuid.has_value())
353 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100354 CHECK(readEventGuid == eventGuid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000355 }
356 else
357 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100358 CHECK(readEventGuid != ProfilingGuid(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000359 }
360
361 offset += uint64_t_size;
Jim Flynn6398a982020-05-27 17:05:21 +0100362
363 ProfilingGuid eventid(readEventGuid);
364 return eventid;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000365}
366
367void VerifyPostOptimisationStructureTestImpl(armnn::BackendId backendId)
368{
369 using namespace armnn;
370
371 // Create runtime in which test will run
372 armnn::IRuntime::CreationOptions options;
373 options.m_ProfilingOptions.m_EnableProfiling = true;
Keith Davis33ed2212020-03-30 10:43:41 +0100374 options.m_ProfilingOptions.m_TimelineEnabled = true;
Kevin Mayd92a6e42021-02-04 10:27:41 +0000375 armnn::RuntimeImpl runtime(options);
Jim Flynn4c9ed1d2022-01-23 23:57:20 +0000376 GetProfilingService(&runtime).ResetExternalProfilingOptions(
377 ConvertExternalProfilingOptions(options.m_ProfilingOptions), false);
Keith Davis33ed2212020-03-30 10:43:41 +0100378
Jim Flynn34430252022-03-04 15:03:58 +0000379 ArmNNProfilingServiceInitialiser initialiser;
380 ProfilingServiceRuntimeHelper profilingServiceHelper(
381 arm::pipe::MAX_ARMNN_COUNTER, initialiser, GetProfilingService(&runtime));
Keith Davis33ed2212020-03-30 10:43:41 +0100382 profilingServiceHelper.ForceTransitionToState(ProfilingState::NotConnected);
383 profilingServiceHelper.ForceTransitionToState(ProfilingState::WaitingForAck);
384 profilingServiceHelper.ForceTransitionToState(ProfilingState::Active);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000385
386 // build up the structure of the network
387 INetworkPtr net(INetwork::Create());
388
389 // Convolution details
390 TensorInfo inputInfo({ 1, 2, 5, 1 }, DataType::Float32);
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100391 TensorInfo weightInfo({ 3, 2, 3, 1 }, DataType::Float32, 0.0f, 0, true);
392 TensorInfo biasInfo({ 3 }, DataType::Float32, 0.0f, 0, true);
Keith Davis97da5e22020-03-05 16:25:28 +0000393 TensorInfo outputInfo({ 1, 3, 7, 1 }, DataType::Float32);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000394 std::vector<float> weightsData{
Keith Davis97da5e22020-03-05 16:25:28 +0000395 1.0f, 0.0f, 0.0f,
396 0.0f, 2.0f, -1.5f,
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000397
Keith Davis97da5e22020-03-05 16:25:28 +0000398 0.0f, 0.0f, 0.0f,
399 0.2f, 0.2f, 0.2f,
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000400
Keith Davis97da5e22020-03-05 16:25:28 +0000401 0.5f, 0.0f, 0.5f,
402 0.0f, -1.0f, 0.0f
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000403 };
404 ConstTensor weights(weightInfo, weightsData);
405
406 Optional<ConstTensor> optionalBiases;
407 std::vector<float> biasesData{ 1.0f, 0.0f, 0.0f };
408 ConstTensor biases(biasInfo, biasesData);
409 optionalBiases = Optional<ConstTensor>(biases);
410
411 // Input layer
412 IConnectableLayer* input = net->AddInputLayer(0, "input");
413
414 // Convolution2d layer
415 Convolution2dDescriptor conv2dDesc;
Keith Davis97da5e22020-03-05 16:25:28 +0000416 conv2dDesc.m_StrideX = 1;
417 conv2dDesc.m_StrideY = 1;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000418 conv2dDesc.m_PadLeft = 0;
419 conv2dDesc.m_PadRight = 0;
420 conv2dDesc.m_PadTop = 2;
421 conv2dDesc.m_PadBottom = 2;
422 conv2dDesc.m_BiasEnabled = true;
423 IConnectableLayer* conv2d = net->AddConvolution2dLayer(conv2dDesc, weights, optionalBiases);
424
Mike Kelly07810fc2020-11-12 10:58:48 +0000425 // Abs layer
426 armnn::ElementwiseUnaryDescriptor absDesc;
427 armnn::IConnectableLayer* const abs = net->AddElementwiseUnaryLayer(absDesc, "abs");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000428
429 // Output layer
430 IConnectableLayer* output = net->AddOutputLayer(0, "output");
431
432 input->GetOutputSlot(0).Connect(conv2d->GetInputSlot(0));
Mike Kelly07810fc2020-11-12 10:58:48 +0000433 conv2d->GetOutputSlot(0).Connect(abs->GetInputSlot(0));
434 abs->GetOutputSlot(0).Connect(output->GetInputSlot(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000435
436 input->GetOutputSlot(0).SetTensorInfo(inputInfo);
437 conv2d->GetOutputSlot(0).SetTensorInfo(outputInfo);
Mike Kelly07810fc2020-11-12 10:58:48 +0000438 abs->GetOutputSlot(0).SetTensorInfo(outputInfo);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000439
440 // optimize the network
441 std::vector<armnn::BackendId> backends = { backendId };
Sadik Armagan3184c902020-03-18 10:57:30 +0000442 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime.GetDeviceSpec());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000443
444 ProfilingGuid optNetGuid = optNet->GetGuid();
445
446 // Load it into the runtime. It should success.
447 armnn::NetworkId netId;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100448 CHECK(runtime.LoadNetwork(netId, std::move(optNet)) == Status::Success);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000449
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000450 BufferManager& bufferManager = profilingServiceHelper.GetProfilingBufferManager();
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000451 auto readableBuffer = bufferManager.GetReadableBuffer();
452
Jim Flynnf7713212020-07-14 09:50:59 +0100453 // Profiling is enabled, the post-optimisation structure should be created
Sadik Armagan1625efc2021-06-10 18:24:34 +0100454 CHECK(readableBuffer != nullptr);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000455 unsigned int size = readableBuffer->GetSize();
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000456
457 const unsigned char* readableData = readableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100458 CHECK(readableData != nullptr);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000459
460 unsigned int offset = 0;
461
Keith Davis97da5e22020-03-05 16:25:28 +0000462 // Verify Header
Jim Flynnf7713212020-07-14 09:50:59 +0100463 VerifyTimelineHeaderBinary(readableData, offset, size - 8);
Keith Davis97da5e22020-03-05 16:25:28 +0000464
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000465 // Post-optimisation network
466 // Network entity
Keith Davis97da5e22020-03-05 16:25:28 +0000467 VerifyTimelineEntityBinaryPacketData(optNetGuid, readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000468
469 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000470 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
471 EmptyOptional(),
472 optNetGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100473 LabelsAndEventClasses::NETWORK_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000474 LabelsAndEventClasses::TYPE_GUID,
475 readableData,
476 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000477
Jim Flynnf7713212020-07-14 09:50:59 +0100478 // Network - START OF LIFE
479 ProfilingGuid networkSolEventGuid = VerifyTimelineEventBinaryPacket(EmptyOptional(),
480 EmptyOptional(),
481 EmptyOptional(),
482 readableData,
483 offset);
Jim Flynnf7713212020-07-14 09:50:59 +0100484
485 // Network - START OF LIFE event relationship
486 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
487 EmptyOptional(),
488 optNetGuid,
489 networkSolEventGuid,
490 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
491 readableData,
492 offset);
Jim Flynnf7713212020-07-14 09:50:59 +0100493
494 // Process ID Label
495 int processID = armnnUtils::Processes::GetCurrentId();
496 std::stringstream ss;
497 ss << processID;
498 std::string processIdLabel = ss.str();
499 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), processIdLabel, readableData, offset);
Jim Flynnf7713212020-07-14 09:50:59 +0100500
501 // Entity - Process ID relationship
502 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
503 EmptyOptional(),
504 optNetGuid,
505 EmptyOptional(),
506 LabelsAndEventClasses::PROCESS_ID_GUID,
507 readableData,
508 offset);
Jim Flynnf7713212020-07-14 09:50:59 +0100509
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000510 // Input layer
511 // Input layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000512 VerifyTimelineEntityBinaryPacketData(input->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000513
514 // Name Entity
Jim Flynn6398a982020-05-27 17:05:21 +0100515 ProfilingGuid inputLabelGuid = VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "input", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000516
517 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000518 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
519 EmptyOptional(),
520 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100521 inputLabelGuid,
Finn Williams0a336dc2020-05-11 15:39:58 +0100522 LabelsAndEventClasses::NAME_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000523 readableData,
524 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000525
526 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000527 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
528 EmptyOptional(),
529 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100530 LabelsAndEventClasses::LAYER_GUID,
Finn Williams0a336dc2020-05-11 15:39:58 +0100531 LabelsAndEventClasses::TYPE_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000532 readableData,
533 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000534
535 // Network - Input layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000536 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
537 EmptyOptional(),
538 optNetGuid,
539 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100540 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000541 readableData,
542 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000543
544 // Conv2d layer
545 // Conv2d layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000546 VerifyTimelineEntityBinaryPacketData(conv2d->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000547
548 // Name entity
Jim Flynn6398a982020-05-27 17:05:21 +0100549 ProfilingGuid conv2dNameLabelGuid = VerifyTimelineLabelBinaryPacketData(
550 EmptyOptional(), "<Unnamed>", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000551
552 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000553 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
554 EmptyOptional(),
555 conv2d->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100556 conv2dNameLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000557 LabelsAndEventClasses::NAME_GUID,
558 readableData,
559 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000560
561 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000562 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
563 EmptyOptional(),
564 conv2d->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100565 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000566 LabelsAndEventClasses::TYPE_GUID,
567 readableData,
568 offset);
Finn Williams0a336dc2020-05-11 15:39:58 +0100569
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000570 // Network - Conv2d layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000571 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
572 EmptyOptional(),
573 optNetGuid,
574 conv2d->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100575 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000576 readableData,
577 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000578
579 // Input layer - Conv2d layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000580 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
581 EmptyOptional(),
582 input->GetGuid(),
583 conv2d->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000584 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000585 readableData,
586 offset);
Finn Williams0a336dc2020-05-11 15:39:58 +0100587
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000588 // Conv2d workload
589 // Conv2d workload entity
Jim Flynn6398a982020-05-27 17:05:21 +0100590 ProfilingGuid conv2DWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000591
592 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000593 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
594 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100595 conv2DWorkloadGuid,
596 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000597 LabelsAndEventClasses::TYPE_GUID,
598 readableData,
599 offset);
Finn Williams0a336dc2020-05-11 15:39:58 +0100600
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000601 // BackendId entity
Jim Flynn6398a982020-05-27 17:05:21 +0100602 ProfilingGuid backendIdLabelGuid = VerifyTimelineLabelBinaryPacketData(
603 EmptyOptional(), backendId.Get(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000604
605 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000606 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
607 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100608 conv2DWorkloadGuid,
609 backendIdLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000610 LabelsAndEventClasses::BACKENDID_GUID,
611 readableData,
612 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000613
Finn Williams0a336dc2020-05-11 15:39:58 +0100614
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000615 // Conv2d layer - Conv2d workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000616 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
617 EmptyOptional(),
618 conv2d->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100619 conv2DWorkloadGuid,
620 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000621 readableData,
622 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000623
Mike Kelly07810fc2020-11-12 10:58:48 +0000624 // Abs layer
625 // Abs layer entity
626 VerifyTimelineEntityBinaryPacketData(abs->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000627
628 // Name entity
Mike Kelly07810fc2020-11-12 10:58:48 +0000629 ProfilingGuid absLabelGuid = VerifyTimelineLabelBinaryPacketData(
630 EmptyOptional(), "abs", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000631
632 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000633 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
634 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000635 abs->GetGuid(),
636 absLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000637 LabelsAndEventClasses::NAME_GUID,
638 readableData,
639 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000640
641 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000642 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
643 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000644 abs->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100645 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000646 LabelsAndEventClasses::TYPE_GUID,
647 readableData,
648 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000649
Mike Kelly07810fc2020-11-12 10:58:48 +0000650 // Network - Abs layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000651 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
652 EmptyOptional(),
653 optNetGuid,
Mike Kelly07810fc2020-11-12 10:58:48 +0000654 abs->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100655 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000656 readableData,
657 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000658
Mike Kelly07810fc2020-11-12 10:58:48 +0000659 // Conv2d layer - Abs layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000660 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
661 EmptyOptional(),
662 conv2d->GetGuid(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000663 abs->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000664 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000665 readableData,
666 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000667
Mike Kelly07810fc2020-11-12 10:58:48 +0000668 // Abs workload
669 // Abs workload entity
670 ProfilingGuid absWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000671
672 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000673 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
674 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000675 absWorkloadGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100676 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000677 LabelsAndEventClasses::TYPE_GUID,
678 readableData,
679 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000680
681 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000682 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), backendId.Get(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000683
684 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000685 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
686 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000687 absWorkloadGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100688 backendIdLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000689 LabelsAndEventClasses::BACKENDID_GUID,
690 readableData,
691 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000692
Mike Kelly07810fc2020-11-12 10:58:48 +0000693 // Abs layer - Abs workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000694 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
695 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000696 abs->GetGuid(),
697 absWorkloadGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100698 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000699 readableData,
700 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000701
702 // Output layer
703 // Output layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000704 VerifyTimelineEntityBinaryPacketData(output->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000705
706 // Name entity
Jim Flynn6398a982020-05-27 17:05:21 +0100707 ProfilingGuid outputLabelGuid = VerifyTimelineLabelBinaryPacketData(
708 EmptyOptional(), "output", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000709
710 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000711 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
712 EmptyOptional(),
713 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100714 outputLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000715 LabelsAndEventClasses::NAME_GUID,
716 readableData,
717 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000718
719 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000720 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
721 EmptyOptional(),
722 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100723 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000724 LabelsAndEventClasses::TYPE_GUID,
725 readableData,
726 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000727
728 // Network - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000729 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
730 EmptyOptional(),
731 optNetGuid,
732 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100733 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000734 readableData,
735 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000736
Mike Kelly07810fc2020-11-12 10:58:48 +0000737 // Abs layer - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000738 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
739 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000740 abs->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000741 output->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000742 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000743 readableData,
744 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000745
746 bufferManager.MarkRead(readableBuffer);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000747
748 // Creates structures for input & output.
749 std::vector<float> inputData(inputInfo.GetNumElements());
750 std::vector<float> outputData(outputInfo.GetNumElements());
751
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100752 TensorInfo inputTensorInfo = runtime.GetInputTensorInfo(netId, 0);
753 inputTensorInfo.SetConstant(true);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000754 InputTensors inputTensors
Keith Davis97da5e22020-03-05 16:25:28 +0000755 {
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100756 {0, ConstTensor(inputTensorInfo, inputData.data())}
Keith Davis97da5e22020-03-05 16:25:28 +0000757 };
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000758 OutputTensors outputTensors
Keith Davis97da5e22020-03-05 16:25:28 +0000759 {
Sadik Armagan3184c902020-03-18 10:57:30 +0000760 {0, Tensor(runtime.GetOutputTensorInfo(netId, 0), outputData.data())}
Keith Davis97da5e22020-03-05 16:25:28 +0000761 };
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000762
763 // Does the inference.
Sadik Armagan3184c902020-03-18 10:57:30 +0000764 runtime.EnqueueWorkload(netId, inputTensors, outputTensors);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000765
Finn Williamsb6a402f2020-03-24 13:46:22 +0000766 // Get readable buffer for input workload
767 auto inputReadableBuffer = bufferManager.GetReadableBuffer();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100768 CHECK(inputReadableBuffer != nullptr);
David Monahan6198fe02019-12-02 08:35:43 +0000769
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000770 // Get readable buffer for output workload
771 auto outputReadableBuffer = bufferManager.GetReadableBuffer();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100772 CHECK(outputReadableBuffer != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000773
Finn Williamsb6a402f2020-03-24 13:46:22 +0000774 // Get readable buffer for inference timeline
775 auto inferenceReadableBuffer = bufferManager.GetReadableBuffer();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100776 CHECK(inferenceReadableBuffer != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000777
778 // Validate input workload data
779 size = inputReadableBuffer->GetSize();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100780 CHECK(size == 164);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000781
782 readableData = inputReadableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100783 CHECK(readableData != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000784
785 offset = 0;
786
Keith Davis97da5e22020-03-05 16:25:28 +0000787 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100788 VerifyTimelineHeaderBinary(readableData, offset, 156);
Keith Davis97da5e22020-03-05 16:25:28 +0000789
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000790 // Input workload
791 // Input workload entity
Jim Flynn6398a982020-05-27 17:05:21 +0100792 ProfilingGuid inputWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000793
794 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000795 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
796 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100797 inputWorkloadGuid,
798 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000799 LabelsAndEventClasses::TYPE_GUID,
800 readableData,
801 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000802
803 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000804 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), backendId.Get(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000805
806 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000807 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
808 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100809 inputWorkloadGuid,
810 backendIdLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000811 LabelsAndEventClasses::BACKENDID_GUID,
812 readableData,
813 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000814
815 // Input layer - Input workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000816 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
817 EmptyOptional(),
818 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100819 inputWorkloadGuid,
820 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000821 readableData,
822 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000823
824 bufferManager.MarkRead(inputReadableBuffer);
825
826 // Validate output workload data
827 size = outputReadableBuffer->GetSize();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100828 CHECK(size == 164);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000829
830 readableData = outputReadableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100831 CHECK(readableData != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000832
833 offset = 0;
834
Keith Davis97da5e22020-03-05 16:25:28 +0000835 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100836 VerifyTimelineHeaderBinary(readableData, offset, 156);
Keith Davis97da5e22020-03-05 16:25:28 +0000837
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000838 // Output workload
839 // Output workload entity
Jim Flynn6398a982020-05-27 17:05:21 +0100840 ProfilingGuid outputWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000841
842 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000843 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
844 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100845 outputWorkloadGuid,
846 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000847 LabelsAndEventClasses::TYPE_GUID,
848 readableData,
849 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000850
851 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000852 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), backendId.Get(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000853
854 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000855 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
856 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100857 outputWorkloadGuid,
858 backendIdLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000859 LabelsAndEventClasses::BACKENDID_GUID,
860 readableData,
861 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000862
863 // Output layer - Output workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000864 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
865 EmptyOptional(),
866 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100867 outputWorkloadGuid,
868 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000869 readableData,
870 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000871
872 bufferManager.MarkRead(outputReadableBuffer);
David Monahan6198fe02019-12-02 08:35:43 +0000873
874 // Validate inference data
875 size = inferenceReadableBuffer->GetSize();
Jan Eilersa10e2a22020-03-26 12:04:54 +0000876
Sadik Armagan1625efc2021-06-10 18:24:34 +0100877 CHECK(size == 1228 + 10 * ThreadIdSize);
David Monahan6198fe02019-12-02 08:35:43 +0000878
879 readableData = inferenceReadableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100880 CHECK(readableData != nullptr);
David Monahan6198fe02019-12-02 08:35:43 +0000881
882 offset = 0;
883
Keith Davis97da5e22020-03-05 16:25:28 +0000884 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100885 VerifyTimelineHeaderBinary(readableData, offset, 1220 + 10 * ThreadIdSize);
Keith Davis97da5e22020-03-05 16:25:28 +0000886
David Monahan6198fe02019-12-02 08:35:43 +0000887 // Inference timeline trace
888 // Inference entity
Jim Flynn6398a982020-05-27 17:05:21 +0100889 ProfilingGuid inferenceGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000890
891 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000892 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
893 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100894 inferenceGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000895 LabelsAndEventClasses::INFERENCE_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000896 LabelsAndEventClasses::TYPE_GUID,
897 readableData,
898 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000899
900 // Network - Inference relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000901 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
902 EmptyOptional(),
903 optNetGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100904 inferenceGuid,
905 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000906 readableData,
907 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000908
909 // Start Inference life
910 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100911 ProfilingGuid inferenceEventGuid = VerifyTimelineEventBinaryPacket(
912 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000913
914 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000915 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
916 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100917 inferenceGuid,
918 inferenceEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000919 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
920 readableData,
921 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000922
923 // Execution
924 // Input workload execution
925 // Input workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +0100926 ProfilingGuid inputWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
927 EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000928
929 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000930 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
931 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100932 inputWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000933 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000934 LabelsAndEventClasses::TYPE_GUID,
935 readableData,
936 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000937
938 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000939 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
940 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100941 inferenceGuid,
942 inputWorkloadExecutionGuid,
943 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000944 readableData,
945 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000946
947 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000948 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
949 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100950 inputWorkloadGuid,
951 inputWorkloadExecutionGuid,
952 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000953 readableData,
954 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000955
956 // Start Input workload execution life
957 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100958 ProfilingGuid inputWorkloadExecutionSOLEventId = VerifyTimelineEventBinaryPacket(
959 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000960
961 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000962 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
963 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100964 inputWorkloadExecutionGuid,
965 inputWorkloadExecutionSOLEventId,
Keith Davis97da5e22020-03-05 16:25:28 +0000966 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
967 readableData,
968 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000969
970 // End of Input workload execution life
971 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100972 ProfilingGuid inputWorkloadExecutionEOLEventId = VerifyTimelineEventBinaryPacket(
973 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000974
975 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000976 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
977 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100978 inputWorkloadExecutionGuid,
979 inputWorkloadExecutionEOLEventId,
Keith Davis97da5e22020-03-05 16:25:28 +0000980 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
981 readableData,
982 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000983
984 // Conv2d workload execution
985 // Conv2d workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +0100986 ProfilingGuid conv2DWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
987 EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000988
989 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000990 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
991 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100992 conv2DWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000993 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000994 LabelsAndEventClasses::TYPE_GUID,
995 readableData,
996 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000997
998 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000999 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1000 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001001 inferenceGuid,
1002 conv2DWorkloadExecutionGuid,
1003 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001004 readableData,
1005 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001006
1007 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001008 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1009 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001010 conv2DWorkloadGuid,
1011 conv2DWorkloadExecutionGuid,
1012 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001013 readableData,
1014 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001015
1016 // Start Conv2d workload execution life
1017 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001018 ProfilingGuid conv2DWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
1019 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001020
1021 // Conv2d workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001022 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1023 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001024 conv2DWorkloadExecutionGuid,
1025 conv2DWorkloadExecutionSOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001026 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1027 readableData,
1028 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001029
1030 // End of Conv2d workload execution life
1031 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001032 ProfilingGuid conv2DWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
1033 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001034
1035 // Conv2d workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001036 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1037 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001038 conv2DWorkloadExecutionGuid,
1039 conv2DWorkloadExecutionEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001040 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1041 readableData,
1042 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001043
Mike Kelly07810fc2020-11-12 10:58:48 +00001044 // Abs workload execution
1045 // Abs workload execution entity
1046 ProfilingGuid absWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
Jim Flynn6398a982020-05-27 17:05:21 +01001047 EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001048
1049 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001050 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1051 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +00001052 absWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001053 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001054 LabelsAndEventClasses::TYPE_GUID,
1055 readableData,
1056 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001057
1058 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001059 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1060 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001061 inferenceGuid,
Mike Kelly07810fc2020-11-12 10:58:48 +00001062 absWorkloadExecutionGuid,
Jim Flynn6398a982020-05-27 17:05:21 +01001063 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001064 readableData,
1065 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001066
1067 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001068 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1069 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +00001070 absWorkloadGuid,
1071 absWorkloadExecutionGuid,
Jim Flynn6398a982020-05-27 17:05:21 +01001072 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001073 readableData,
1074 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001075
Mike Kelly07810fc2020-11-12 10:58:48 +00001076 // Start Abs workload execution life
David Monahan6198fe02019-12-02 08:35:43 +00001077 // Event packet - timeline, threadId, eventGuid
Mike Kelly07810fc2020-11-12 10:58:48 +00001078 ProfilingGuid absWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
Jim Flynn6398a982020-05-27 17:05:21 +01001079 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001080
Mike Kelly07810fc2020-11-12 10:58:48 +00001081 // Abs workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001082 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1083 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +00001084 absWorkloadExecutionGuid,
1085 absWorkloadExecutionSOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001086 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1087 readableData,
1088 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001089
Mike Kelly07810fc2020-11-12 10:58:48 +00001090 // End of Abs workload execution life
David Monahan6198fe02019-12-02 08:35:43 +00001091 // Event packet - timeline, threadId, eventGuid
Mike Kelly07810fc2020-11-12 10:58:48 +00001092 ProfilingGuid absWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
Jim Flynn6398a982020-05-27 17:05:21 +01001093 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001094
Mike Kelly07810fc2020-11-12 10:58:48 +00001095 // Abs workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001096 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1097 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +00001098 absWorkloadExecutionGuid,
1099 absWorkloadExecutionEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001100 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1101 readableData,
1102 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001103
1104 // Output workload execution
1105 // Output workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +01001106 ProfilingGuid outputWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
1107 EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001108
1109 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001110 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1111 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001112 outputWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001113 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001114 LabelsAndEventClasses::TYPE_GUID,
1115 readableData,
1116 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001117
1118 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001119 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1120 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001121 inferenceGuid,
1122 outputWorkloadExecutionGuid,
1123 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001124 readableData,
1125 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001126
1127 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001128 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1129 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001130 outputWorkloadGuid,
1131 outputWorkloadExecutionGuid,
1132 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001133 readableData,
1134 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001135
1136 // Start Output workload execution life
1137 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001138 ProfilingGuid outputWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
1139 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001140
1141 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001142 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1143 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001144 outputWorkloadExecutionGuid,
1145 outputWorkloadExecutionSOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001146 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1147 readableData,
1148 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001149
1150 // End of Normalize workload execution life
1151 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001152 ProfilingGuid outputWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
1153 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001154
1155 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001156 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1157 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001158 outputWorkloadExecutionGuid,
1159 outputWorkloadExecutionEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001160 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1161 readableData,
1162 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001163
1164 // End of Inference life
1165 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001166 ProfilingGuid inferenceEOLEventGuid = VerifyTimelineEventBinaryPacket(
1167 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001168
1169 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001170 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1171 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001172 inferenceGuid,
1173 inferenceEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001174 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1175 readableData,
1176 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001177
1178 bufferManager.MarkRead(inferenceReadableBuffer);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +00001179}
Jim Flynn6398a982020-05-27 17:05:21 +01001180
Jim Flynn6398a982020-05-27 17:05:21 +01001181bool CompareOutput(std::vector<std::string> output, std::vector<std::string> expectedOutput)
1182{
1183 if (output.size() != expectedOutput.size())
1184 {
1185 std::cerr << "output has [" << output.size() << "] lines, expected was ["
1186 << expectedOutput.size() << "] lines" << std::endl;
1187 std::cerr << std::endl << "actual" << std::endl << std::endl;
1188 for (auto line : output)
1189 {
1190 std::cerr << line << std::endl;
1191 }
1192 std::cerr << std::endl << "expected" << std::endl << std::endl;
1193 for (auto line : expectedOutput)
1194 {
1195 std::cerr << line << std::endl;
1196 }
1197 return false;
1198 }
1199 bool bRet = true;
1200 for (unsigned long i = 0; i < output.size(); ++i)
1201 {
1202 if (output[i] != expectedOutput[i])
1203 {
1204 bRet = false;
1205 std::cerr << i << ": actual [" << output[i] << "] expected [" << expectedOutput[i] << "]" << std::endl;
1206 }
1207 }
1208 return bRet;
1209}