blob: e0d3dd717c549bd2191d56ba5a4e237def4e7ad8 [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
6#include "ProfilingTestUtils.hpp"
7#include "ProfilingUtils.hpp"
8
9#include <armnn/Descriptors.hpp>
Sadik Armagan1625efc2021-06-10 18:24:34 +010010#include <armnn/utility/Assert.hpp>
Matthew Sloyan371b70e2020-09-11 10:14:57 +010011#include <armnn/utility/NumericCast.hpp>
12
Jim Flynnf7713212020-07-14 09:50:59 +010013#include <Processes.hpp>
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000014#include <ProfilingService.hpp>
Rob Hughes9542f902021-07-14 09:48:54 +010015#include <armnnUtils/Threads.hpp>
Sadik Armaganea41b572020-03-19 18:16:46 +000016
Nikhil Raj77fe76b2021-06-09 14:55:32 +010017#include <common/include/LabelsAndEventClasses.hpp>
18
Sadik Armaganea41b572020-03-19 18:16:46 +000019#include <test/TestUtils.hpp>
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000020
Sadik Armagan1625efc2021-06-10 18:24:34 +010021#include <doctest/doctest.h>
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000022
Finn Williamsa0de0562020-04-22 12:27:37 +010023uint32_t GetStreamMetaDataPacketSize()
24{
25 uint32_t sizeUint32 = sizeof(uint32_t);
26 uint32_t payloadSize = 0;
Matthew Sloyan371b70e2020-09-11 10:14:57 +010027 payloadSize += armnn::numeric_cast<uint32_t>(GetSoftwareInfo().size()) + 1;
28 payloadSize += armnn::numeric_cast<uint32_t>(GetHardwareVersion().size()) + 1;
29 payloadSize += armnn::numeric_cast<uint32_t>(GetSoftwareVersion().size()) + 1;
30 payloadSize += armnn::numeric_cast<uint32_t>(GetProcessName().size()) + 1;
Finn Williamsa0de0562020-04-22 12:27:37 +010031
32 // Add packetVersionEntries
Jim Flynn83d08a92020-07-09 13:48:16 +010033 payloadSize += 13 * 2 * sizeUint32;
Finn Williamsa0de0562020-04-22 12:27:37 +010034 // Add packetVersionCountSize
35 payloadSize += sizeUint32;
36
37 uint32_t headerSize = 2 * sizeUint32;
38 uint32_t bodySize = 10 * sizeUint32;
39
40 return headerSize + bodySize + payloadSize;
41}
42
Jan Eilersf78c7672020-07-01 18:09:39 +010043std::vector<BackendId> GetSuitableBackendRegistered()
44{
45 std::vector<BackendId> suitableBackends;
46 if (BackendRegistryInstance().IsBackendRegistered(GetComputeDeviceAsCString(armnn::Compute::CpuRef)))
47 {
48 suitableBackends.push_back(armnn::Compute::CpuRef);
49 }
50 if (BackendRegistryInstance().IsBackendRegistered(GetComputeDeviceAsCString(armnn::Compute::CpuAcc)))
51 {
52 suitableBackends.push_back(armnn::Compute::CpuAcc);
53 }
54 if (BackendRegistryInstance().IsBackendRegistered(GetComputeDeviceAsCString(armnn::Compute::GpuAcc)))
55 {
56 suitableBackends.push_back(armnn::Compute::GpuAcc);
57 }
58 return suitableBackends;
59}
60
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000061inline unsigned int OffsetToNextWord(unsigned int numberOfBytes)
62{
63 unsigned int uint32_t_size = sizeof(uint32_t);
64
65 unsigned int remainder = numberOfBytes % uint32_t_size;
66 if (remainder == 0)
67 {
68 return numberOfBytes;
69 }
70
71 return numberOfBytes + uint32_t_size - remainder;
72}
73
Keith Davis97da5e22020-03-05 16:25:28 +000074void VerifyTimelineHeaderBinary(const unsigned char* readableData,
75 unsigned int& offset,
76 uint32_t packetDataLength)
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000077{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010078 ARMNN_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000079
80 // Utils
81 unsigned int uint32_t_size = sizeof(uint32_t);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000082
Keith Davis97da5e22020-03-05 16:25:28 +000083 // Check the TimelineEventClassBinaryPacket header
Finn Williams0a336dc2020-05-11 15:39:58 +010084 uint32_t timelineBinaryPacketHeaderWord0 = ReadUint32(readableData, offset);
85 uint32_t timelineBinaryPacketFamily = (timelineBinaryPacketHeaderWord0 >> 26) & 0x0000003F;
86 uint32_t timelineBinaryPacketClass = (timelineBinaryPacketHeaderWord0 >> 19) & 0x0000007F;
87 uint32_t timelineBinaryPacketType = (timelineBinaryPacketHeaderWord0 >> 16) & 0x00000007;
88 uint32_t timelineBinaryPacketStreamId = (timelineBinaryPacketHeaderWord0 >> 0) & 0x00000007;
Sadik Armagan1625efc2021-06-10 18:24:34 +010089 CHECK(timelineBinaryPacketFamily == 1);
90 CHECK(timelineBinaryPacketClass == 0);
91 CHECK(timelineBinaryPacketType == 1);
92 CHECK(timelineBinaryPacketStreamId == 0);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000093 offset += uint32_t_size;
Finn Williams0a336dc2020-05-11 15:39:58 +010094 uint32_t timelineBinaryPacketHeaderWord1 = ReadUint32(readableData, offset);
95 uint32_t timelineBinaryPacketSequenceNumber = (timelineBinaryPacketHeaderWord1 >> 24) & 0x00000001;
96 uint32_t timelineBinaryPacketDataLength = (timelineBinaryPacketHeaderWord1 >> 0) & 0x00FFFFFF;
Sadik Armagan1625efc2021-06-10 18:24:34 +010097 CHECK(timelineBinaryPacketSequenceNumber == 0);
98 CHECK(timelineBinaryPacketDataLength == packetDataLength);
Keith Davis97da5e22020-03-05 16:25:28 +000099 offset += uint32_t_size;
100}
101
Jim Flynn6398a982020-05-27 17:05:21 +0100102ProfilingGuid VerifyTimelineLabelBinaryPacketData(Optional<ProfilingGuid> guid,
103 const std::string& label,
104 const unsigned char* readableData,
105 unsigned int& offset)
Keith Davis97da5e22020-03-05 16:25:28 +0000106{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100107 ARMNN_ASSERT(readableData);
Keith Davis97da5e22020-03-05 16:25:28 +0000108
109 // Utils
110 unsigned int uint32_t_size = sizeof(uint32_t);
111 unsigned int uint64_t_size = sizeof(uint64_t);
Matthew Sloyan371b70e2020-09-11 10:14:57 +0100112 unsigned int label_size = armnn::numeric_cast<unsigned int>(label.size());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000113
114 // Check the decl id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000115 uint32_t eventClassDeclId = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100116 CHECK(eventClassDeclId == 0);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000117
118 // Check the profiling GUID
119 offset += uint32_t_size;
120 uint64_t readProfilingGuid = ReadUint64(readableData, offset);
121 if (guid.has_value())
122 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100123 CHECK(readProfilingGuid == guid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000124 }
125 else
126 {
Sadik Armagan3184c902020-03-18 10:57:30 +0000127 armnn::profiling::ProfilingService profilingService;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100128 CHECK(readProfilingGuid == profilingService.GetStaticId(label));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000129 }
130
131 // Check the SWTrace label
132 offset += uint64_t_size;
133 uint32_t swTraceLabelLength = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100134 CHECK(swTraceLabelLength == label_size + 1); // Label length including the null-terminator
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000135 offset += uint32_t_size;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100136 CHECK(std::memcmp(readableData + offset, // Offset to the label in the buffer
Keith Davis97da5e22020-03-05 16:25:28 +0000137 label.data(), // The original label
138 swTraceLabelLength - 1) == 0); // The length of the label
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000139
140 // SWTrace strings are written in blocks of words, so the offset has to be updated to the next whole word
141 offset += OffsetToNextWord(swTraceLabelLength);
Jim Flynn6398a982020-05-27 17:05:21 +0100142
143 ProfilingGuid labelGuid(readProfilingGuid);
144 return labelGuid;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000145}
146
Keith Davis97da5e22020-03-05 16:25:28 +0000147void VerifyTimelineEventClassBinaryPacketData(ProfilingGuid guid,
Jim Flynn1892d212020-05-26 21:10:49 +0100148 ProfilingGuid nameGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000149 const unsigned char* readableData,
150 unsigned int& offset)
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000151{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100152 ARMNN_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000153
154 // Utils
155 unsigned int uint32_t_size = sizeof(uint32_t);
156 unsigned int uint64_t_size = sizeof(uint64_t);
157
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000158 // Check the decl id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000159 uint32_t eventClassDeclId = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100160 CHECK(eventClassDeclId == 2);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000161
162 // Check the profiling GUID
163 offset += uint32_t_size;
164 uint64_t readProfilingGuid = ReadUint64(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100165 CHECK(readProfilingGuid == guid);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000166
Jim Flynn1892d212020-05-26 21:10:49 +0100167 offset += uint64_t_size;
168 uint64_t readProfiilngNameGuid = ReadUint64(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100169 CHECK(readProfiilngNameGuid == nameGuid);
Jim Flynn1892d212020-05-26 21:10:49 +0100170
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000171 // Update the offset to allow parsing to be continued after this function returns
172 offset += uint64_t_size;
173}
174
Keith Davis97da5e22020-03-05 16:25:28 +0000175void VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType relationshipType,
Jim Flynn6398a982020-05-27 17:05:21 +0100176 Optional<ProfilingGuid> relationshipGuid,
177 Optional<ProfilingGuid> headGuid,
178 Optional<ProfilingGuid> tailGuid,
179 Optional<ProfilingGuid> attributeGuid,
180 const unsigned char* readableData,
181 unsigned int& offset)
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000182{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100183 ARMNN_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000184
185 uint32_t relationshipTypeUint = 0;
186 switch (relationshipType)
187 {
188 case ProfilingRelationshipType::RetentionLink:
189 relationshipTypeUint = 0;
190 break;
191 case ProfilingRelationshipType::ExecutionLink:
192 relationshipTypeUint = 1;
193 break;
194 case ProfilingRelationshipType::DataLink:
195 relationshipTypeUint = 2;
196 break;
197 case ProfilingRelationshipType::LabelLink:
198 relationshipTypeUint = 3;
199 break;
200 default:
Sadik Armagan1625efc2021-06-10 18:24:34 +0100201 FAIL("Unknown relationship type");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000202 }
203
204 // Utils
205 unsigned int uint32_t_size = sizeof(uint32_t);
206 unsigned int uint64_t_size = sizeof(uint64_t);
207
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000208 // Check the decl id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000209 uint32_t eventClassDeclId = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100210 CHECK(eventClassDeclId == 3);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000211
212 // Check the relationship type
213 offset += uint32_t_size;
214 uint32_t readRelationshipTypeUint = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100215 CHECK(readRelationshipTypeUint == relationshipTypeUint);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000216
217 // Check the relationship GUID
218 offset += uint32_t_size;
219 uint64_t readRelationshipGuid = ReadUint64(readableData, offset);
220 if (relationshipGuid.has_value())
221 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100222 CHECK(readRelationshipGuid == relationshipGuid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000223 }
224 else
225 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100226 CHECK(readRelationshipGuid != ProfilingGuid(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000227 }
228
Jim Flynn6398a982020-05-27 17:05:21 +0100229 // Check the head GUID of the relationship
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000230 offset += uint64_t_size;
231 uint64_t readHeadRelationshipGuid = ReadUint64(readableData, offset);
232 if (headGuid.has_value())
233 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100234 CHECK(readHeadRelationshipGuid == headGuid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000235 }
236 else
237 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100238 CHECK(readHeadRelationshipGuid != ProfilingGuid(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000239 }
240
Jim Flynn6398a982020-05-27 17:05:21 +0100241 // Check the tail GUID of the relationship
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000242 offset += uint64_t_size;
243 uint64_t readTailRelationshipGuid = ReadUint64(readableData, offset);
244 if (tailGuid.has_value())
245 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100246 CHECK(readTailRelationshipGuid == tailGuid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000247 }
248 else
249 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100250 CHECK(readTailRelationshipGuid != ProfilingGuid(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000251 }
252
Jim Flynn6398a982020-05-27 17:05:21 +0100253 // Check the attribute GUID of the relationship
Finn Williams0a336dc2020-05-11 15:39:58 +0100254 offset += uint64_t_size;
255 uint64_t readAttributeRelationshipGuid = ReadUint64(readableData, offset);
256 if (attributeGuid.has_value())
257 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100258 CHECK(readAttributeRelationshipGuid == attributeGuid.value());
Finn Williams0a336dc2020-05-11 15:39:58 +0100259 }
260 else
261 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100262 CHECK(readAttributeRelationshipGuid == ProfilingGuid(0));
Finn Williams0a336dc2020-05-11 15:39:58 +0100263 }
264
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000265 // Update the offset to allow parsing to be continued after this function returns
266 offset += uint64_t_size;
267}
268
Jim Flynn6398a982020-05-27 17:05:21 +0100269ProfilingGuid VerifyTimelineEntityBinaryPacketData(Optional<ProfilingGuid> guid,
270 const unsigned char* readableData,
271 unsigned int& offset)
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000272{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100273 ARMNN_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000274
275 // Utils
276 unsigned int uint32_t_size = sizeof(uint32_t);
277 unsigned int uint64_t_size = sizeof(uint64_t);
278
279 // Reading TimelineEntityClassBinaryPacket
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000280 // Check the decl_id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000281 uint32_t entityDeclId = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100282 CHECK(entityDeclId == 1);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000283
284 // Check the profiling GUID
285 offset += uint32_t_size;
286 uint64_t readProfilingGuid = ReadUint64(readableData, offset);
287
288 if (guid.has_value())
289 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100290 CHECK(readProfilingGuid == guid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000291 }
292 else
293 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100294 CHECK(readProfilingGuid != ProfilingGuid(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000295 }
296
297 offset += uint64_t_size;
Jim Flynn6398a982020-05-27 17:05:21 +0100298
299 ProfilingGuid entityGuid(readProfilingGuid);
300 return entityGuid;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000301}
302
Jim Flynn6398a982020-05-27 17:05:21 +0100303ProfilingGuid VerifyTimelineEventBinaryPacket(Optional<uint64_t> timestamp,
Jim Flynn1fdeb992020-07-09 07:28:37 +0100304 Optional<int> threadId,
Jim Flynn6398a982020-05-27 17:05:21 +0100305 Optional<ProfilingGuid> eventGuid,
306 const unsigned char* readableData,
307 unsigned int& offset)
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000308{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100309 ARMNN_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000310
311 // Utils
312 unsigned int uint32_t_size = sizeof(uint32_t);
313 unsigned int uint64_t_size = sizeof(uint64_t);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000314
315 // Reading TimelineEventBinaryPacket
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000316 // Check the decl_id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000317 uint32_t entityDeclId = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100318 CHECK(entityDeclId == 4);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000319
320 // Check the timestamp
321 offset += uint32_t_size;
322 uint64_t readTimestamp = ReadUint64(readableData, offset);
323 if (timestamp.has_value())
324 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100325 CHECK(readTimestamp == timestamp.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000326 }
327 else
328 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100329 CHECK(readTimestamp != 0);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000330 }
331
332 // Check the thread id
333 offset += uint64_t_size;
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100334 std::vector<uint8_t> readThreadId(ThreadIdSize, 0);
335 ReadBytes(readableData, offset, ThreadIdSize, readThreadId.data());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000336 if (threadId.has_value())
337 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100338 CHECK(readThreadId == threadId.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000339 }
340 else
341 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100342 CHECK(readThreadId == armnnUtils::Threads::GetCurrentThreadId());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000343 }
344
345 // Check the event GUID
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100346 offset += ThreadIdSize;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000347 uint64_t readEventGuid = ReadUint64(readableData, offset);
348 if (eventGuid.has_value())
349 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100350 CHECK(readEventGuid == eventGuid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000351 }
352 else
353 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100354 CHECK(readEventGuid != ProfilingGuid(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000355 }
356
357 offset += uint64_t_size;
Jim Flynn6398a982020-05-27 17:05:21 +0100358
359 ProfilingGuid eventid(readEventGuid);
360 return eventid;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000361}
362
363void VerifyPostOptimisationStructureTestImpl(armnn::BackendId backendId)
364{
365 using namespace armnn;
366
367 // Create runtime in which test will run
368 armnn::IRuntime::CreationOptions options;
369 options.m_ProfilingOptions.m_EnableProfiling = true;
Keith Davis33ed2212020-03-30 10:43:41 +0100370 options.m_ProfilingOptions.m_TimelineEnabled = true;
Kevin Mayd92a6e42021-02-04 10:27:41 +0000371 armnn::RuntimeImpl runtime(options);
Keith Davis33ed2212020-03-30 10:43:41 +0100372 GetProfilingService(&runtime).ResetExternalProfilingOptions(options.m_ProfilingOptions, false);
373
374 profiling::ProfilingServiceRuntimeHelper profilingServiceHelper(GetProfilingService(&runtime));
375 profilingServiceHelper.ForceTransitionToState(ProfilingState::NotConnected);
376 profilingServiceHelper.ForceTransitionToState(ProfilingState::WaitingForAck);
377 profilingServiceHelper.ForceTransitionToState(ProfilingState::Active);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000378
379 // build up the structure of the network
380 INetworkPtr net(INetwork::Create());
381
382 // Convolution details
383 TensorInfo inputInfo({ 1, 2, 5, 1 }, DataType::Float32);
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100384 TensorInfo weightInfo({ 3, 2, 3, 1 }, DataType::Float32, 0.0f, 0, true);
385 TensorInfo biasInfo({ 3 }, DataType::Float32, 0.0f, 0, true);
Keith Davis97da5e22020-03-05 16:25:28 +0000386 TensorInfo outputInfo({ 1, 3, 7, 1 }, DataType::Float32);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000387 std::vector<float> weightsData{
Keith Davis97da5e22020-03-05 16:25:28 +0000388 1.0f, 0.0f, 0.0f,
389 0.0f, 2.0f, -1.5f,
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000390
Keith Davis97da5e22020-03-05 16:25:28 +0000391 0.0f, 0.0f, 0.0f,
392 0.2f, 0.2f, 0.2f,
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000393
Keith Davis97da5e22020-03-05 16:25:28 +0000394 0.5f, 0.0f, 0.5f,
395 0.0f, -1.0f, 0.0f
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000396 };
397 ConstTensor weights(weightInfo, weightsData);
398
399 Optional<ConstTensor> optionalBiases;
400 std::vector<float> biasesData{ 1.0f, 0.0f, 0.0f };
401 ConstTensor biases(biasInfo, biasesData);
402 optionalBiases = Optional<ConstTensor>(biases);
403
404 // Input layer
405 IConnectableLayer* input = net->AddInputLayer(0, "input");
406
407 // Convolution2d layer
408 Convolution2dDescriptor conv2dDesc;
Keith Davis97da5e22020-03-05 16:25:28 +0000409 conv2dDesc.m_StrideX = 1;
410 conv2dDesc.m_StrideY = 1;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000411 conv2dDesc.m_PadLeft = 0;
412 conv2dDesc.m_PadRight = 0;
413 conv2dDesc.m_PadTop = 2;
414 conv2dDesc.m_PadBottom = 2;
415 conv2dDesc.m_BiasEnabled = true;
416 IConnectableLayer* conv2d = net->AddConvolution2dLayer(conv2dDesc, weights, optionalBiases);
417
Mike Kelly07810fc2020-11-12 10:58:48 +0000418 // Abs layer
419 armnn::ElementwiseUnaryDescriptor absDesc;
420 armnn::IConnectableLayer* const abs = net->AddElementwiseUnaryLayer(absDesc, "abs");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000421
422 // Output layer
423 IConnectableLayer* output = net->AddOutputLayer(0, "output");
424
425 input->GetOutputSlot(0).Connect(conv2d->GetInputSlot(0));
Mike Kelly07810fc2020-11-12 10:58:48 +0000426 conv2d->GetOutputSlot(0).Connect(abs->GetInputSlot(0));
427 abs->GetOutputSlot(0).Connect(output->GetInputSlot(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000428
429 input->GetOutputSlot(0).SetTensorInfo(inputInfo);
430 conv2d->GetOutputSlot(0).SetTensorInfo(outputInfo);
Mike Kelly07810fc2020-11-12 10:58:48 +0000431 abs->GetOutputSlot(0).SetTensorInfo(outputInfo);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000432
433 // optimize the network
434 std::vector<armnn::BackendId> backends = { backendId };
Sadik Armagan3184c902020-03-18 10:57:30 +0000435 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime.GetDeviceSpec());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000436
437 ProfilingGuid optNetGuid = optNet->GetGuid();
438
439 // Load it into the runtime. It should success.
440 armnn::NetworkId netId;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100441 CHECK(runtime.LoadNetwork(netId, std::move(optNet)) == Status::Success);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000442
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000443 profiling::BufferManager& bufferManager = profilingServiceHelper.GetProfilingBufferManager();
444 auto readableBuffer = bufferManager.GetReadableBuffer();
445
Jim Flynnf7713212020-07-14 09:50:59 +0100446 // Profiling is enabled, the post-optimisation structure should be created
Sadik Armagan1625efc2021-06-10 18:24:34 +0100447 CHECK(readableBuffer != nullptr);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000448 unsigned int size = readableBuffer->GetSize();
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000449
450 const unsigned char* readableData = readableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100451 CHECK(readableData != nullptr);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000452
453 unsigned int offset = 0;
454
Keith Davis97da5e22020-03-05 16:25:28 +0000455 // Verify Header
Jim Flynnf7713212020-07-14 09:50:59 +0100456 VerifyTimelineHeaderBinary(readableData, offset, size - 8);
Keith Davis97da5e22020-03-05 16:25:28 +0000457
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000458 // Post-optimisation network
459 // Network entity
Keith Davis97da5e22020-03-05 16:25:28 +0000460 VerifyTimelineEntityBinaryPacketData(optNetGuid, readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000461
462 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000463 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
464 EmptyOptional(),
465 optNetGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100466 LabelsAndEventClasses::NETWORK_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000467 LabelsAndEventClasses::TYPE_GUID,
468 readableData,
469 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000470
Jim Flynnf7713212020-07-14 09:50:59 +0100471 // Network - START OF LIFE
472 ProfilingGuid networkSolEventGuid = VerifyTimelineEventBinaryPacket(EmptyOptional(),
473 EmptyOptional(),
474 EmptyOptional(),
475 readableData,
476 offset);
Jim Flynnf7713212020-07-14 09:50:59 +0100477
478 // Network - START OF LIFE event relationship
479 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
480 EmptyOptional(),
481 optNetGuid,
482 networkSolEventGuid,
483 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
484 readableData,
485 offset);
Jim Flynnf7713212020-07-14 09:50:59 +0100486
487 // Process ID Label
488 int processID = armnnUtils::Processes::GetCurrentId();
489 std::stringstream ss;
490 ss << processID;
491 std::string processIdLabel = ss.str();
492 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), processIdLabel, readableData, offset);
Jim Flynnf7713212020-07-14 09:50:59 +0100493
494 // Entity - Process ID relationship
495 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
496 EmptyOptional(),
497 optNetGuid,
498 EmptyOptional(),
499 LabelsAndEventClasses::PROCESS_ID_GUID,
500 readableData,
501 offset);
Jim Flynnf7713212020-07-14 09:50:59 +0100502
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000503 // Input layer
504 // Input layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000505 VerifyTimelineEntityBinaryPacketData(input->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000506
507 // Name Entity
Jim Flynn6398a982020-05-27 17:05:21 +0100508 ProfilingGuid inputLabelGuid = VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "input", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000509
510 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000511 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
512 EmptyOptional(),
513 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100514 inputLabelGuid,
Finn Williams0a336dc2020-05-11 15:39:58 +0100515 LabelsAndEventClasses::NAME_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000516 readableData,
517 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000518
519 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000520 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
521 EmptyOptional(),
522 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100523 LabelsAndEventClasses::LAYER_GUID,
Finn Williams0a336dc2020-05-11 15:39:58 +0100524 LabelsAndEventClasses::TYPE_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000525 readableData,
526 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000527
528 // Network - Input layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000529 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
530 EmptyOptional(),
531 optNetGuid,
532 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100533 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000534 readableData,
535 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000536
537 // Conv2d layer
538 // Conv2d layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000539 VerifyTimelineEntityBinaryPacketData(conv2d->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000540
541 // Name entity
Jim Flynn6398a982020-05-27 17:05:21 +0100542 ProfilingGuid conv2dNameLabelGuid = VerifyTimelineLabelBinaryPacketData(
543 EmptyOptional(), "<Unnamed>", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000544
545 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000546 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
547 EmptyOptional(),
548 conv2d->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100549 conv2dNameLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000550 LabelsAndEventClasses::NAME_GUID,
551 readableData,
552 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000553
554 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000555 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
556 EmptyOptional(),
557 conv2d->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100558 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000559 LabelsAndEventClasses::TYPE_GUID,
560 readableData,
561 offset);
Finn Williams0a336dc2020-05-11 15:39:58 +0100562
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000563 // Network - Conv2d layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000564 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
565 EmptyOptional(),
566 optNetGuid,
567 conv2d->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100568 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000569 readableData,
570 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000571
572 // Input layer - Conv2d layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000573 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
574 EmptyOptional(),
575 input->GetGuid(),
576 conv2d->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000577 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000578 readableData,
579 offset);
Finn Williams0a336dc2020-05-11 15:39:58 +0100580
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000581 // Conv2d workload
582 // Conv2d workload entity
Jim Flynn6398a982020-05-27 17:05:21 +0100583 ProfilingGuid conv2DWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000584
585 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000586 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
587 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100588 conv2DWorkloadGuid,
589 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000590 LabelsAndEventClasses::TYPE_GUID,
591 readableData,
592 offset);
Finn Williams0a336dc2020-05-11 15:39:58 +0100593
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000594 // BackendId entity
Jim Flynn6398a982020-05-27 17:05:21 +0100595 ProfilingGuid backendIdLabelGuid = VerifyTimelineLabelBinaryPacketData(
596 EmptyOptional(), backendId.Get(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000597
598 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000599 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
600 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100601 conv2DWorkloadGuid,
602 backendIdLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000603 LabelsAndEventClasses::BACKENDID_GUID,
604 readableData,
605 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000606
Finn Williams0a336dc2020-05-11 15:39:58 +0100607
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000608 // Conv2d layer - Conv2d workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000609 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
610 EmptyOptional(),
611 conv2d->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100612 conv2DWorkloadGuid,
613 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000614 readableData,
615 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000616
Mike Kelly07810fc2020-11-12 10:58:48 +0000617 // Abs layer
618 // Abs layer entity
619 VerifyTimelineEntityBinaryPacketData(abs->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000620
621 // Name entity
Mike Kelly07810fc2020-11-12 10:58:48 +0000622 ProfilingGuid absLabelGuid = VerifyTimelineLabelBinaryPacketData(
623 EmptyOptional(), "abs", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000624
625 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000626 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
627 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000628 abs->GetGuid(),
629 absLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000630 LabelsAndEventClasses::NAME_GUID,
631 readableData,
632 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000633
634 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000635 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
636 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000637 abs->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100638 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000639 LabelsAndEventClasses::TYPE_GUID,
640 readableData,
641 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000642
Mike Kelly07810fc2020-11-12 10:58:48 +0000643 // Network - Abs layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000644 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
645 EmptyOptional(),
646 optNetGuid,
Mike Kelly07810fc2020-11-12 10:58:48 +0000647 abs->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100648 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000649 readableData,
650 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000651
Mike Kelly07810fc2020-11-12 10:58:48 +0000652 // Conv2d layer - Abs layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000653 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
654 EmptyOptional(),
655 conv2d->GetGuid(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000656 abs->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000657 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000658 readableData,
659 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000660
Mike Kelly07810fc2020-11-12 10:58:48 +0000661 // Abs workload
662 // Abs workload entity
663 ProfilingGuid absWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000664
665 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000666 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
667 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000668 absWorkloadGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100669 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000670 LabelsAndEventClasses::TYPE_GUID,
671 readableData,
672 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000673
674 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000675 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), backendId.Get(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000676
677 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000678 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
679 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000680 absWorkloadGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100681 backendIdLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000682 LabelsAndEventClasses::BACKENDID_GUID,
683 readableData,
684 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000685
Mike Kelly07810fc2020-11-12 10:58:48 +0000686 // Abs layer - Abs workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000687 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
688 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000689 abs->GetGuid(),
690 absWorkloadGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100691 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000692 readableData,
693 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000694
695 // Output layer
696 // Output layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000697 VerifyTimelineEntityBinaryPacketData(output->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000698
699 // Name entity
Jim Flynn6398a982020-05-27 17:05:21 +0100700 ProfilingGuid outputLabelGuid = VerifyTimelineLabelBinaryPacketData(
701 EmptyOptional(), "output", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000702
703 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000704 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
705 EmptyOptional(),
706 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100707 outputLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000708 LabelsAndEventClasses::NAME_GUID,
709 readableData,
710 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000711
712 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000713 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
714 EmptyOptional(),
715 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100716 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000717 LabelsAndEventClasses::TYPE_GUID,
718 readableData,
719 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000720
721 // Network - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000722 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
723 EmptyOptional(),
724 optNetGuid,
725 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100726 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000727 readableData,
728 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000729
Mike Kelly07810fc2020-11-12 10:58:48 +0000730 // Abs layer - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000731 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
732 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000733 abs->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000734 output->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000735 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000736 readableData,
737 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000738
739 bufferManager.MarkRead(readableBuffer);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000740
741 // Creates structures for input & output.
742 std::vector<float> inputData(inputInfo.GetNumElements());
743 std::vector<float> outputData(outputInfo.GetNumElements());
744
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100745 TensorInfo inputTensorInfo = runtime.GetInputTensorInfo(netId, 0);
746 inputTensorInfo.SetConstant(true);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000747 InputTensors inputTensors
Keith Davis97da5e22020-03-05 16:25:28 +0000748 {
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100749 {0, ConstTensor(inputTensorInfo, inputData.data())}
Keith Davis97da5e22020-03-05 16:25:28 +0000750 };
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000751 OutputTensors outputTensors
Keith Davis97da5e22020-03-05 16:25:28 +0000752 {
Sadik Armagan3184c902020-03-18 10:57:30 +0000753 {0, Tensor(runtime.GetOutputTensorInfo(netId, 0), outputData.data())}
Keith Davis97da5e22020-03-05 16:25:28 +0000754 };
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000755
756 // Does the inference.
Sadik Armagan3184c902020-03-18 10:57:30 +0000757 runtime.EnqueueWorkload(netId, inputTensors, outputTensors);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000758
Finn Williamsb6a402f2020-03-24 13:46:22 +0000759 // Get readable buffer for input workload
760 auto inputReadableBuffer = bufferManager.GetReadableBuffer();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100761 CHECK(inputReadableBuffer != nullptr);
David Monahan6198fe02019-12-02 08:35:43 +0000762
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000763 // Get readable buffer for output workload
764 auto outputReadableBuffer = bufferManager.GetReadableBuffer();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100765 CHECK(outputReadableBuffer != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000766
Finn Williamsb6a402f2020-03-24 13:46:22 +0000767 // Get readable buffer for inference timeline
768 auto inferenceReadableBuffer = bufferManager.GetReadableBuffer();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100769 CHECK(inferenceReadableBuffer != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000770
771 // Validate input workload data
772 size = inputReadableBuffer->GetSize();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100773 CHECK(size == 164);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000774
775 readableData = inputReadableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100776 CHECK(readableData != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000777
778 offset = 0;
779
Keith Davis97da5e22020-03-05 16:25:28 +0000780 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100781 VerifyTimelineHeaderBinary(readableData, offset, 156);
Keith Davis97da5e22020-03-05 16:25:28 +0000782
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000783 // Input workload
784 // Input workload entity
Jim Flynn6398a982020-05-27 17:05:21 +0100785 ProfilingGuid inputWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000786
787 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000788 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
789 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100790 inputWorkloadGuid,
791 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000792 LabelsAndEventClasses::TYPE_GUID,
793 readableData,
794 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000795
796 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000797 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), backendId.Get(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000798
799 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000800 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
801 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100802 inputWorkloadGuid,
803 backendIdLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000804 LabelsAndEventClasses::BACKENDID_GUID,
805 readableData,
806 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000807
808 // Input layer - Input workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000809 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
810 EmptyOptional(),
811 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100812 inputWorkloadGuid,
813 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000814 readableData,
815 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000816
817 bufferManager.MarkRead(inputReadableBuffer);
818
819 // Validate output workload data
820 size = outputReadableBuffer->GetSize();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100821 CHECK(size == 164);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000822
823 readableData = outputReadableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100824 CHECK(readableData != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000825
826 offset = 0;
827
Keith Davis97da5e22020-03-05 16:25:28 +0000828 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100829 VerifyTimelineHeaderBinary(readableData, offset, 156);
Keith Davis97da5e22020-03-05 16:25:28 +0000830
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000831 // Output workload
832 // Output workload entity
Jim Flynn6398a982020-05-27 17:05:21 +0100833 ProfilingGuid outputWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000834
835 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000836 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
837 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100838 outputWorkloadGuid,
839 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000840 LabelsAndEventClasses::TYPE_GUID,
841 readableData,
842 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000843
844 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000845 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), backendId.Get(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000846
847 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000848 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
849 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100850 outputWorkloadGuid,
851 backendIdLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000852 LabelsAndEventClasses::BACKENDID_GUID,
853 readableData,
854 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000855
856 // Output layer - Output workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000857 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
858 EmptyOptional(),
859 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100860 outputWorkloadGuid,
861 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000862 readableData,
863 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000864
865 bufferManager.MarkRead(outputReadableBuffer);
David Monahan6198fe02019-12-02 08:35:43 +0000866
867 // Validate inference data
868 size = inferenceReadableBuffer->GetSize();
Jan Eilersa10e2a22020-03-26 12:04:54 +0000869
Sadik Armagan1625efc2021-06-10 18:24:34 +0100870 CHECK(size == 1228 + 10 * ThreadIdSize);
David Monahan6198fe02019-12-02 08:35:43 +0000871
872 readableData = inferenceReadableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100873 CHECK(readableData != nullptr);
David Monahan6198fe02019-12-02 08:35:43 +0000874
875 offset = 0;
876
Keith Davis97da5e22020-03-05 16:25:28 +0000877 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100878 VerifyTimelineHeaderBinary(readableData, offset, 1220 + 10 * ThreadIdSize);
Keith Davis97da5e22020-03-05 16:25:28 +0000879
David Monahan6198fe02019-12-02 08:35:43 +0000880 // Inference timeline trace
881 // Inference entity
Jim Flynn6398a982020-05-27 17:05:21 +0100882 ProfilingGuid inferenceGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000883
884 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000885 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
886 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100887 inferenceGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000888 LabelsAndEventClasses::INFERENCE_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000889 LabelsAndEventClasses::TYPE_GUID,
890 readableData,
891 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000892
893 // Network - Inference relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000894 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
895 EmptyOptional(),
896 optNetGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100897 inferenceGuid,
898 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000899 readableData,
900 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000901
902 // Start Inference life
903 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100904 ProfilingGuid inferenceEventGuid = VerifyTimelineEventBinaryPacket(
905 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000906
907 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000908 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
909 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100910 inferenceGuid,
911 inferenceEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000912 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
913 readableData,
914 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000915
916 // Execution
917 // Input workload execution
918 // Input workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +0100919 ProfilingGuid inputWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
920 EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000921
922 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000923 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
924 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100925 inputWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000926 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000927 LabelsAndEventClasses::TYPE_GUID,
928 readableData,
929 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000930
931 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000932 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
933 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100934 inferenceGuid,
935 inputWorkloadExecutionGuid,
936 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000937 readableData,
938 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000939
940 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000941 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
942 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100943 inputWorkloadGuid,
944 inputWorkloadExecutionGuid,
945 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000946 readableData,
947 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000948
949 // Start Input workload execution life
950 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100951 ProfilingGuid inputWorkloadExecutionSOLEventId = VerifyTimelineEventBinaryPacket(
952 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000953
954 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000955 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
956 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100957 inputWorkloadExecutionGuid,
958 inputWorkloadExecutionSOLEventId,
Keith Davis97da5e22020-03-05 16:25:28 +0000959 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
960 readableData,
961 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000962
963 // End of Input workload execution life
964 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100965 ProfilingGuid inputWorkloadExecutionEOLEventId = VerifyTimelineEventBinaryPacket(
966 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000967
968 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000969 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
970 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100971 inputWorkloadExecutionGuid,
972 inputWorkloadExecutionEOLEventId,
Keith Davis97da5e22020-03-05 16:25:28 +0000973 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
974 readableData,
975 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000976
977 // Conv2d workload execution
978 // Conv2d workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +0100979 ProfilingGuid conv2DWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
980 EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000981
982 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000983 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
984 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100985 conv2DWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000986 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000987 LabelsAndEventClasses::TYPE_GUID,
988 readableData,
989 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000990
991 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000992 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
993 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100994 inferenceGuid,
995 conv2DWorkloadExecutionGuid,
996 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000997 readableData,
998 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000999
1000 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001001 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1002 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001003 conv2DWorkloadGuid,
1004 conv2DWorkloadExecutionGuid,
1005 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001006 readableData,
1007 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001008
1009 // Start Conv2d workload execution life
1010 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001011 ProfilingGuid conv2DWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
1012 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001013
1014 // Conv2d workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001015 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1016 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001017 conv2DWorkloadExecutionGuid,
1018 conv2DWorkloadExecutionSOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001019 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1020 readableData,
1021 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001022
1023 // End of Conv2d workload execution life
1024 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001025 ProfilingGuid conv2DWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
1026 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001027
1028 // Conv2d workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001029 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1030 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001031 conv2DWorkloadExecutionGuid,
1032 conv2DWorkloadExecutionEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001033 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1034 readableData,
1035 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001036
Mike Kelly07810fc2020-11-12 10:58:48 +00001037 // Abs workload execution
1038 // Abs workload execution entity
1039 ProfilingGuid absWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
Jim Flynn6398a982020-05-27 17:05:21 +01001040 EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001041
1042 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001043 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1044 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +00001045 absWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001046 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001047 LabelsAndEventClasses::TYPE_GUID,
1048 readableData,
1049 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001050
1051 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001052 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1053 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001054 inferenceGuid,
Mike Kelly07810fc2020-11-12 10:58:48 +00001055 absWorkloadExecutionGuid,
Jim Flynn6398a982020-05-27 17:05:21 +01001056 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001057 readableData,
1058 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001059
1060 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001061 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1062 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +00001063 absWorkloadGuid,
1064 absWorkloadExecutionGuid,
Jim Flynn6398a982020-05-27 17:05:21 +01001065 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001066 readableData,
1067 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001068
Mike Kelly07810fc2020-11-12 10:58:48 +00001069 // Start Abs workload execution life
David Monahan6198fe02019-12-02 08:35:43 +00001070 // Event packet - timeline, threadId, eventGuid
Mike Kelly07810fc2020-11-12 10:58:48 +00001071 ProfilingGuid absWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
Jim Flynn6398a982020-05-27 17:05:21 +01001072 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001073
Mike Kelly07810fc2020-11-12 10:58:48 +00001074 // Abs workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001075 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1076 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +00001077 absWorkloadExecutionGuid,
1078 absWorkloadExecutionSOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001079 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1080 readableData,
1081 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001082
Mike Kelly07810fc2020-11-12 10:58:48 +00001083 // End of Abs workload execution life
David Monahan6198fe02019-12-02 08:35:43 +00001084 // Event packet - timeline, threadId, eventGuid
Mike Kelly07810fc2020-11-12 10:58:48 +00001085 ProfilingGuid absWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
Jim Flynn6398a982020-05-27 17:05:21 +01001086 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001087
Mike Kelly07810fc2020-11-12 10:58:48 +00001088 // Abs workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001089 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1090 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +00001091 absWorkloadExecutionGuid,
1092 absWorkloadExecutionEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001093 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1094 readableData,
1095 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001096
1097 // Output workload execution
1098 // Output workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +01001099 ProfilingGuid outputWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
1100 EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001101
1102 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001103 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1104 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001105 outputWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001106 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001107 LabelsAndEventClasses::TYPE_GUID,
1108 readableData,
1109 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001110
1111 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001112 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1113 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001114 inferenceGuid,
1115 outputWorkloadExecutionGuid,
1116 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001117 readableData,
1118 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001119
1120 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001121 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1122 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001123 outputWorkloadGuid,
1124 outputWorkloadExecutionGuid,
1125 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001126 readableData,
1127 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001128
1129 // Start Output workload execution life
1130 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001131 ProfilingGuid outputWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
1132 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001133
1134 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001135 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1136 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001137 outputWorkloadExecutionGuid,
1138 outputWorkloadExecutionSOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001139 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1140 readableData,
1141 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001142
1143 // End of Normalize workload execution life
1144 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001145 ProfilingGuid outputWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
1146 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001147
1148 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001149 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1150 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001151 outputWorkloadExecutionGuid,
1152 outputWorkloadExecutionEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001153 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1154 readableData,
1155 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001156
1157 // End of Inference life
1158 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001159 ProfilingGuid inferenceEOLEventGuid = VerifyTimelineEventBinaryPacket(
1160 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001161
1162 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001163 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1164 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001165 inferenceGuid,
1166 inferenceEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001167 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1168 readableData,
1169 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001170
1171 bufferManager.MarkRead(inferenceReadableBuffer);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +00001172}
Jim Flynn6398a982020-05-27 17:05:21 +01001173
Jim Flynn6398a982020-05-27 17:05:21 +01001174bool CompareOutput(std::vector<std::string> output, std::vector<std::string> expectedOutput)
1175{
1176 if (output.size() != expectedOutput.size())
1177 {
1178 std::cerr << "output has [" << output.size() << "] lines, expected was ["
1179 << expectedOutput.size() << "] lines" << std::endl;
1180 std::cerr << std::endl << "actual" << std::endl << std::endl;
1181 for (auto line : output)
1182 {
1183 std::cerr << line << std::endl;
1184 }
1185 std::cerr << std::endl << "expected" << std::endl << std::endl;
1186 for (auto line : expectedOutput)
1187 {
1188 std::cerr << line << std::endl;
1189 }
1190 return false;
1191 }
1192 bool bRet = true;
1193 for (unsigned long i = 0; i < output.size(); ++i)
1194 {
1195 if (output[i] != expectedOutput[i])
1196 {
1197 bRet = false;
1198 std::cerr << i << ": actual [" << output[i] << "] expected [" << expectedOutput[i] << "]" << std::endl;
1199 }
1200 }
1201 return bRet;
1202}