blob: 154234667e964c0de09e4528ebee27f99588bacf [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 Flynn4c9ed1d2022-01-23 23:57:20 +00006#include "ProfilingOptionsConverter.hpp"
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +00007#include "ProfilingTestUtils.hpp"
8#include "ProfilingUtils.hpp"
9
10#include <armnn/Descriptors.hpp>
Sadik Armagan1625efc2021-06-10 18:24:34 +010011#include <armnn/utility/Assert.hpp>
Matthew Sloyan371b70e2020-09-11 10:14:57 +010012#include <armnn/utility/NumericCast.hpp>
13
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
Nikhil Raj77fe76b2021-06-09 14:55:32 +010018#include <common/include/LabelsAndEventClasses.hpp>
19
Sadik Armagana097d2a2021-11-24 15:47:28 +000020#include <TestUtils.hpp>
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000021
Sadik Armagan1625efc2021-06-10 18:24:34 +010022#include <doctest/doctest.h>
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000023
Finn Williamsa0de0562020-04-22 12:27:37 +010024uint32_t GetStreamMetaDataPacketSize()
25{
26 uint32_t sizeUint32 = sizeof(uint32_t);
27 uint32_t payloadSize = 0;
Matthew Sloyan371b70e2020-09-11 10:14:57 +010028 payloadSize += armnn::numeric_cast<uint32_t>(GetSoftwareInfo().size()) + 1;
29 payloadSize += armnn::numeric_cast<uint32_t>(GetHardwareVersion().size()) + 1;
30 payloadSize += armnn::numeric_cast<uint32_t>(GetSoftwareVersion().size()) + 1;
31 payloadSize += armnn::numeric_cast<uint32_t>(GetProcessName().size()) + 1;
Finn Williamsa0de0562020-04-22 12:27:37 +010032
33 // Add packetVersionEntries
Jim Flynn83d08a92020-07-09 13:48:16 +010034 payloadSize += 13 * 2 * sizeUint32;
Finn Williamsa0de0562020-04-22 12:27:37 +010035 // Add packetVersionCountSize
36 payloadSize += sizeUint32;
37
38 uint32_t headerSize = 2 * sizeUint32;
39 uint32_t bodySize = 10 * sizeUint32;
40
41 return headerSize + bodySize + payloadSize;
42}
43
Jan Eilersf78c7672020-07-01 18:09:39 +010044std::vector<BackendId> GetSuitableBackendRegistered()
45{
46 std::vector<BackendId> suitableBackends;
47 if (BackendRegistryInstance().IsBackendRegistered(GetComputeDeviceAsCString(armnn::Compute::CpuRef)))
48 {
49 suitableBackends.push_back(armnn::Compute::CpuRef);
50 }
51 if (BackendRegistryInstance().IsBackendRegistered(GetComputeDeviceAsCString(armnn::Compute::CpuAcc)))
52 {
53 suitableBackends.push_back(armnn::Compute::CpuAcc);
54 }
55 if (BackendRegistryInstance().IsBackendRegistered(GetComputeDeviceAsCString(armnn::Compute::GpuAcc)))
56 {
57 suitableBackends.push_back(armnn::Compute::GpuAcc);
58 }
59 return suitableBackends;
60}
61
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000062inline unsigned int OffsetToNextWord(unsigned int numberOfBytes)
63{
64 unsigned int uint32_t_size = sizeof(uint32_t);
65
66 unsigned int remainder = numberOfBytes % uint32_t_size;
67 if (remainder == 0)
68 {
69 return numberOfBytes;
70 }
71
72 return numberOfBytes + uint32_t_size - remainder;
73}
74
Keith Davis97da5e22020-03-05 16:25:28 +000075void VerifyTimelineHeaderBinary(const unsigned char* readableData,
76 unsigned int& offset,
77 uint32_t packetDataLength)
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000078{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010079 ARMNN_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000080
81 // Utils
82 unsigned int uint32_t_size = sizeof(uint32_t);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000083
Keith Davis97da5e22020-03-05 16:25:28 +000084 // Check the TimelineEventClassBinaryPacket header
Finn Williams0a336dc2020-05-11 15:39:58 +010085 uint32_t timelineBinaryPacketHeaderWord0 = ReadUint32(readableData, offset);
86 uint32_t timelineBinaryPacketFamily = (timelineBinaryPacketHeaderWord0 >> 26) & 0x0000003F;
87 uint32_t timelineBinaryPacketClass = (timelineBinaryPacketHeaderWord0 >> 19) & 0x0000007F;
88 uint32_t timelineBinaryPacketType = (timelineBinaryPacketHeaderWord0 >> 16) & 0x00000007;
89 uint32_t timelineBinaryPacketStreamId = (timelineBinaryPacketHeaderWord0 >> 0) & 0x00000007;
Sadik Armagan1625efc2021-06-10 18:24:34 +010090 CHECK(timelineBinaryPacketFamily == 1);
91 CHECK(timelineBinaryPacketClass == 0);
92 CHECK(timelineBinaryPacketType == 1);
93 CHECK(timelineBinaryPacketStreamId == 0);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000094 offset += uint32_t_size;
Finn Williams0a336dc2020-05-11 15:39:58 +010095 uint32_t timelineBinaryPacketHeaderWord1 = ReadUint32(readableData, offset);
96 uint32_t timelineBinaryPacketSequenceNumber = (timelineBinaryPacketHeaderWord1 >> 24) & 0x00000001;
97 uint32_t timelineBinaryPacketDataLength = (timelineBinaryPacketHeaderWord1 >> 0) & 0x00FFFFFF;
Sadik Armagan1625efc2021-06-10 18:24:34 +010098 CHECK(timelineBinaryPacketSequenceNumber == 0);
99 CHECK(timelineBinaryPacketDataLength == packetDataLength);
Keith Davis97da5e22020-03-05 16:25:28 +0000100 offset += uint32_t_size;
101}
102
Jim Flynn6398a982020-05-27 17:05:21 +0100103ProfilingGuid VerifyTimelineLabelBinaryPacketData(Optional<ProfilingGuid> guid,
104 const std::string& label,
105 const unsigned char* readableData,
106 unsigned int& offset)
Keith Davis97da5e22020-03-05 16:25:28 +0000107{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100108 ARMNN_ASSERT(readableData);
Keith Davis97da5e22020-03-05 16:25:28 +0000109
110 // Utils
111 unsigned int uint32_t_size = sizeof(uint32_t);
112 unsigned int uint64_t_size = sizeof(uint64_t);
Matthew Sloyan371b70e2020-09-11 10:14:57 +0100113 unsigned int label_size = armnn::numeric_cast<unsigned int>(label.size());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000114
115 // Check the decl id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000116 uint32_t eventClassDeclId = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100117 CHECK(eventClassDeclId == 0);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000118
119 // Check the profiling GUID
120 offset += uint32_t_size;
121 uint64_t readProfilingGuid = ReadUint64(readableData, offset);
122 if (guid.has_value())
123 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100124 CHECK(readProfilingGuid == guid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000125 }
126 else
127 {
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000128 ProfilingService profilingService;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100129 CHECK(readProfilingGuid == profilingService.GetStaticId(label));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000130 }
131
132 // Check the SWTrace label
133 offset += uint64_t_size;
134 uint32_t swTraceLabelLength = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100135 CHECK(swTraceLabelLength == label_size + 1); // Label length including the null-terminator
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000136 offset += uint32_t_size;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100137 CHECK(std::memcmp(readableData + offset, // Offset to the label in the buffer
Keith Davis97da5e22020-03-05 16:25:28 +0000138 label.data(), // The original label
139 swTraceLabelLength - 1) == 0); // The length of the label
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000140
141 // SWTrace strings are written in blocks of words, so the offset has to be updated to the next whole word
142 offset += OffsetToNextWord(swTraceLabelLength);
Jim Flynn6398a982020-05-27 17:05:21 +0100143
144 ProfilingGuid labelGuid(readProfilingGuid);
145 return labelGuid;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000146}
147
Keith Davis97da5e22020-03-05 16:25:28 +0000148void VerifyTimelineEventClassBinaryPacketData(ProfilingGuid guid,
Jim Flynn1892d212020-05-26 21:10:49 +0100149 ProfilingGuid nameGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000150 const unsigned char* readableData,
151 unsigned int& offset)
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000152{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100153 ARMNN_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000154
155 // Utils
156 unsigned int uint32_t_size = sizeof(uint32_t);
157 unsigned int uint64_t_size = sizeof(uint64_t);
158
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000159 // Check the decl id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000160 uint32_t eventClassDeclId = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100161 CHECK(eventClassDeclId == 2);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000162
163 // Check the profiling GUID
164 offset += uint32_t_size;
165 uint64_t readProfilingGuid = ReadUint64(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100166 CHECK(readProfilingGuid == guid);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000167
Jim Flynn1892d212020-05-26 21:10:49 +0100168 offset += uint64_t_size;
169 uint64_t readProfiilngNameGuid = ReadUint64(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100170 CHECK(readProfiilngNameGuid == nameGuid);
Jim Flynn1892d212020-05-26 21:10:49 +0100171
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000172 // Update the offset to allow parsing to be continued after this function returns
173 offset += uint64_t_size;
174}
175
Keith Davis97da5e22020-03-05 16:25:28 +0000176void VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType relationshipType,
Jim Flynn6398a982020-05-27 17:05:21 +0100177 Optional<ProfilingGuid> relationshipGuid,
178 Optional<ProfilingGuid> headGuid,
179 Optional<ProfilingGuid> tailGuid,
180 Optional<ProfilingGuid> attributeGuid,
181 const unsigned char* readableData,
182 unsigned int& offset)
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000183{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100184 ARMNN_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000185
186 uint32_t relationshipTypeUint = 0;
187 switch (relationshipType)
188 {
189 case ProfilingRelationshipType::RetentionLink:
190 relationshipTypeUint = 0;
191 break;
192 case ProfilingRelationshipType::ExecutionLink:
193 relationshipTypeUint = 1;
194 break;
195 case ProfilingRelationshipType::DataLink:
196 relationshipTypeUint = 2;
197 break;
198 case ProfilingRelationshipType::LabelLink:
199 relationshipTypeUint = 3;
200 break;
201 default:
Sadik Armagan1625efc2021-06-10 18:24:34 +0100202 FAIL("Unknown relationship type");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000203 }
204
205 // Utils
206 unsigned int uint32_t_size = sizeof(uint32_t);
207 unsigned int uint64_t_size = sizeof(uint64_t);
208
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000209 // Check the decl id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000210 uint32_t eventClassDeclId = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100211 CHECK(eventClassDeclId == 3);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000212
213 // Check the relationship type
214 offset += uint32_t_size;
215 uint32_t readRelationshipTypeUint = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100216 CHECK(readRelationshipTypeUint == relationshipTypeUint);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000217
218 // Check the relationship GUID
219 offset += uint32_t_size;
220 uint64_t readRelationshipGuid = ReadUint64(readableData, offset);
221 if (relationshipGuid.has_value())
222 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100223 CHECK(readRelationshipGuid == relationshipGuid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000224 }
225 else
226 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100227 CHECK(readRelationshipGuid != ProfilingGuid(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000228 }
229
Jim Flynn6398a982020-05-27 17:05:21 +0100230 // Check the head GUID of the relationship
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000231 offset += uint64_t_size;
232 uint64_t readHeadRelationshipGuid = ReadUint64(readableData, offset);
233 if (headGuid.has_value())
234 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100235 CHECK(readHeadRelationshipGuid == headGuid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000236 }
237 else
238 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100239 CHECK(readHeadRelationshipGuid != ProfilingGuid(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000240 }
241
Jim Flynn6398a982020-05-27 17:05:21 +0100242 // Check the tail GUID of the relationship
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000243 offset += uint64_t_size;
244 uint64_t readTailRelationshipGuid = ReadUint64(readableData, offset);
245 if (tailGuid.has_value())
246 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100247 CHECK(readTailRelationshipGuid == tailGuid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000248 }
249 else
250 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100251 CHECK(readTailRelationshipGuid != ProfilingGuid(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000252 }
253
Jim Flynn6398a982020-05-27 17:05:21 +0100254 // Check the attribute GUID of the relationship
Finn Williams0a336dc2020-05-11 15:39:58 +0100255 offset += uint64_t_size;
256 uint64_t readAttributeRelationshipGuid = ReadUint64(readableData, offset);
257 if (attributeGuid.has_value())
258 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100259 CHECK(readAttributeRelationshipGuid == attributeGuid.value());
Finn Williams0a336dc2020-05-11 15:39:58 +0100260 }
261 else
262 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100263 CHECK(readAttributeRelationshipGuid == ProfilingGuid(0));
Finn Williams0a336dc2020-05-11 15:39:58 +0100264 }
265
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000266 // Update the offset to allow parsing to be continued after this function returns
267 offset += uint64_t_size;
268}
269
Jim Flynn6398a982020-05-27 17:05:21 +0100270ProfilingGuid VerifyTimelineEntityBinaryPacketData(Optional<ProfilingGuid> guid,
271 const unsigned char* readableData,
272 unsigned int& offset)
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000273{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100274 ARMNN_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000275
276 // Utils
277 unsigned int uint32_t_size = sizeof(uint32_t);
278 unsigned int uint64_t_size = sizeof(uint64_t);
279
280 // Reading TimelineEntityClassBinaryPacket
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000281 // Check the decl_id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000282 uint32_t entityDeclId = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100283 CHECK(entityDeclId == 1);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000284
285 // Check the profiling GUID
286 offset += uint32_t_size;
287 uint64_t readProfilingGuid = ReadUint64(readableData, offset);
288
289 if (guid.has_value())
290 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100291 CHECK(readProfilingGuid == guid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000292 }
293 else
294 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100295 CHECK(readProfilingGuid != ProfilingGuid(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000296 }
297
298 offset += uint64_t_size;
Jim Flynn6398a982020-05-27 17:05:21 +0100299
300 ProfilingGuid entityGuid(readProfilingGuid);
301 return entityGuid;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000302}
303
Jim Flynn6398a982020-05-27 17:05:21 +0100304ProfilingGuid VerifyTimelineEventBinaryPacket(Optional<uint64_t> timestamp,
Jim Flynn1fdeb992020-07-09 07:28:37 +0100305 Optional<int> threadId,
Jim Flynn6398a982020-05-27 17:05:21 +0100306 Optional<ProfilingGuid> eventGuid,
307 const unsigned char* readableData,
308 unsigned int& offset)
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000309{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100310 ARMNN_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000311
312 // Utils
313 unsigned int uint32_t_size = sizeof(uint32_t);
314 unsigned int uint64_t_size = sizeof(uint64_t);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000315
316 // Reading TimelineEventBinaryPacket
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000317 // Check the decl_id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000318 uint32_t entityDeclId = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100319 CHECK(entityDeclId == 4);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000320
321 // Check the timestamp
322 offset += uint32_t_size;
323 uint64_t readTimestamp = ReadUint64(readableData, offset);
324 if (timestamp.has_value())
325 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100326 CHECK(readTimestamp == timestamp.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000327 }
328 else
329 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100330 CHECK(readTimestamp != 0);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000331 }
332
333 // Check the thread id
334 offset += uint64_t_size;
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100335 std::vector<uint8_t> readThreadId(ThreadIdSize, 0);
336 ReadBytes(readableData, offset, ThreadIdSize, readThreadId.data());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000337 if (threadId.has_value())
338 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100339 CHECK(readThreadId == threadId.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000340 }
341 else
342 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100343 CHECK(readThreadId == armnnUtils::Threads::GetCurrentThreadId());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000344 }
345
346 // Check the event GUID
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100347 offset += ThreadIdSize;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000348 uint64_t readEventGuid = ReadUint64(readableData, offset);
349 if (eventGuid.has_value())
350 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100351 CHECK(readEventGuid == eventGuid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000352 }
353 else
354 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100355 CHECK(readEventGuid != ProfilingGuid(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000356 }
357
358 offset += uint64_t_size;
Jim Flynn6398a982020-05-27 17:05:21 +0100359
360 ProfilingGuid eventid(readEventGuid);
361 return eventid;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000362}
363
364void VerifyPostOptimisationStructureTestImpl(armnn::BackendId backendId)
365{
366 using namespace armnn;
367
368 // Create runtime in which test will run
369 armnn::IRuntime::CreationOptions options;
370 options.m_ProfilingOptions.m_EnableProfiling = true;
Keith Davis33ed2212020-03-30 10:43:41 +0100371 options.m_ProfilingOptions.m_TimelineEnabled = true;
Kevin Mayd92a6e42021-02-04 10:27:41 +0000372 armnn::RuntimeImpl runtime(options);
Jim Flynn4c9ed1d2022-01-23 23:57:20 +0000373 GetProfilingService(&runtime).ResetExternalProfilingOptions(
374 ConvertExternalProfilingOptions(options.m_ProfilingOptions), false);
Keith Davis33ed2212020-03-30 10:43:41 +0100375
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000376 ProfilingServiceRuntimeHelper profilingServiceHelper(GetProfilingService(&runtime));
Keith Davis33ed2212020-03-30 10:43:41 +0100377 profilingServiceHelper.ForceTransitionToState(ProfilingState::NotConnected);
378 profilingServiceHelper.ForceTransitionToState(ProfilingState::WaitingForAck);
379 profilingServiceHelper.ForceTransitionToState(ProfilingState::Active);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000380
381 // build up the structure of the network
382 INetworkPtr net(INetwork::Create());
383
384 // Convolution details
385 TensorInfo inputInfo({ 1, 2, 5, 1 }, DataType::Float32);
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100386 TensorInfo weightInfo({ 3, 2, 3, 1 }, DataType::Float32, 0.0f, 0, true);
387 TensorInfo biasInfo({ 3 }, DataType::Float32, 0.0f, 0, true);
Keith Davis97da5e22020-03-05 16:25:28 +0000388 TensorInfo outputInfo({ 1, 3, 7, 1 }, DataType::Float32);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000389 std::vector<float> weightsData{
Keith Davis97da5e22020-03-05 16:25:28 +0000390 1.0f, 0.0f, 0.0f,
391 0.0f, 2.0f, -1.5f,
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000392
Keith Davis97da5e22020-03-05 16:25:28 +0000393 0.0f, 0.0f, 0.0f,
394 0.2f, 0.2f, 0.2f,
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000395
Keith Davis97da5e22020-03-05 16:25:28 +0000396 0.5f, 0.0f, 0.5f,
397 0.0f, -1.0f, 0.0f
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000398 };
399 ConstTensor weights(weightInfo, weightsData);
400
401 Optional<ConstTensor> optionalBiases;
402 std::vector<float> biasesData{ 1.0f, 0.0f, 0.0f };
403 ConstTensor biases(biasInfo, biasesData);
404 optionalBiases = Optional<ConstTensor>(biases);
405
406 // Input layer
407 IConnectableLayer* input = net->AddInputLayer(0, "input");
408
409 // Convolution2d layer
410 Convolution2dDescriptor conv2dDesc;
Keith Davis97da5e22020-03-05 16:25:28 +0000411 conv2dDesc.m_StrideX = 1;
412 conv2dDesc.m_StrideY = 1;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000413 conv2dDesc.m_PadLeft = 0;
414 conv2dDesc.m_PadRight = 0;
415 conv2dDesc.m_PadTop = 2;
416 conv2dDesc.m_PadBottom = 2;
417 conv2dDesc.m_BiasEnabled = true;
418 IConnectableLayer* conv2d = net->AddConvolution2dLayer(conv2dDesc, weights, optionalBiases);
419
Mike Kelly07810fc2020-11-12 10:58:48 +0000420 // Abs layer
421 armnn::ElementwiseUnaryDescriptor absDesc;
422 armnn::IConnectableLayer* const abs = net->AddElementwiseUnaryLayer(absDesc, "abs");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000423
424 // Output layer
425 IConnectableLayer* output = net->AddOutputLayer(0, "output");
426
427 input->GetOutputSlot(0).Connect(conv2d->GetInputSlot(0));
Mike Kelly07810fc2020-11-12 10:58:48 +0000428 conv2d->GetOutputSlot(0).Connect(abs->GetInputSlot(0));
429 abs->GetOutputSlot(0).Connect(output->GetInputSlot(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000430
431 input->GetOutputSlot(0).SetTensorInfo(inputInfo);
432 conv2d->GetOutputSlot(0).SetTensorInfo(outputInfo);
Mike Kelly07810fc2020-11-12 10:58:48 +0000433 abs->GetOutputSlot(0).SetTensorInfo(outputInfo);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000434
435 // optimize the network
436 std::vector<armnn::BackendId> backends = { backendId };
Sadik Armagan3184c902020-03-18 10:57:30 +0000437 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime.GetDeviceSpec());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000438
439 ProfilingGuid optNetGuid = optNet->GetGuid();
440
441 // Load it into the runtime. It should success.
442 armnn::NetworkId netId;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100443 CHECK(runtime.LoadNetwork(netId, std::move(optNet)) == Status::Success);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000444
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000445 BufferManager& bufferManager = profilingServiceHelper.GetProfilingBufferManager();
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000446 auto readableBuffer = bufferManager.GetReadableBuffer();
447
Jim Flynnf7713212020-07-14 09:50:59 +0100448 // Profiling is enabled, the post-optimisation structure should be created
Sadik Armagan1625efc2021-06-10 18:24:34 +0100449 CHECK(readableBuffer != nullptr);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000450 unsigned int size = readableBuffer->GetSize();
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000451
452 const unsigned char* readableData = readableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100453 CHECK(readableData != nullptr);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000454
455 unsigned int offset = 0;
456
Keith Davis97da5e22020-03-05 16:25:28 +0000457 // Verify Header
Jim Flynnf7713212020-07-14 09:50:59 +0100458 VerifyTimelineHeaderBinary(readableData, offset, size - 8);
Keith Davis97da5e22020-03-05 16:25:28 +0000459
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000460 // Post-optimisation network
461 // Network entity
Keith Davis97da5e22020-03-05 16:25:28 +0000462 VerifyTimelineEntityBinaryPacketData(optNetGuid, readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000463
464 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000465 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
466 EmptyOptional(),
467 optNetGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100468 LabelsAndEventClasses::NETWORK_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000469 LabelsAndEventClasses::TYPE_GUID,
470 readableData,
471 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000472
Jim Flynnf7713212020-07-14 09:50:59 +0100473 // Network - START OF LIFE
474 ProfilingGuid networkSolEventGuid = VerifyTimelineEventBinaryPacket(EmptyOptional(),
475 EmptyOptional(),
476 EmptyOptional(),
477 readableData,
478 offset);
Jim Flynnf7713212020-07-14 09:50:59 +0100479
480 // Network - START OF LIFE event relationship
481 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
482 EmptyOptional(),
483 optNetGuid,
484 networkSolEventGuid,
485 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
486 readableData,
487 offset);
Jim Flynnf7713212020-07-14 09:50:59 +0100488
489 // Process ID Label
490 int processID = armnnUtils::Processes::GetCurrentId();
491 std::stringstream ss;
492 ss << processID;
493 std::string processIdLabel = ss.str();
494 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), processIdLabel, readableData, offset);
Jim Flynnf7713212020-07-14 09:50:59 +0100495
496 // Entity - Process ID relationship
497 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
498 EmptyOptional(),
499 optNetGuid,
500 EmptyOptional(),
501 LabelsAndEventClasses::PROCESS_ID_GUID,
502 readableData,
503 offset);
Jim Flynnf7713212020-07-14 09:50:59 +0100504
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000505 // Input layer
506 // Input layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000507 VerifyTimelineEntityBinaryPacketData(input->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000508
509 // Name Entity
Jim Flynn6398a982020-05-27 17:05:21 +0100510 ProfilingGuid inputLabelGuid = VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "input", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000511
512 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000513 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
514 EmptyOptional(),
515 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100516 inputLabelGuid,
Finn Williams0a336dc2020-05-11 15:39:58 +0100517 LabelsAndEventClasses::NAME_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000518 readableData,
519 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000520
521 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000522 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
523 EmptyOptional(),
524 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100525 LabelsAndEventClasses::LAYER_GUID,
Finn Williams0a336dc2020-05-11 15:39:58 +0100526 LabelsAndEventClasses::TYPE_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000527 readableData,
528 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000529
530 // Network - Input layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000531 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
532 EmptyOptional(),
533 optNetGuid,
534 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100535 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000536 readableData,
537 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000538
539 // Conv2d layer
540 // Conv2d layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000541 VerifyTimelineEntityBinaryPacketData(conv2d->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000542
543 // Name entity
Jim Flynn6398a982020-05-27 17:05:21 +0100544 ProfilingGuid conv2dNameLabelGuid = VerifyTimelineLabelBinaryPacketData(
545 EmptyOptional(), "<Unnamed>", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000546
547 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000548 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
549 EmptyOptional(),
550 conv2d->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100551 conv2dNameLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000552 LabelsAndEventClasses::NAME_GUID,
553 readableData,
554 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000555
556 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000557 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
558 EmptyOptional(),
559 conv2d->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100560 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000561 LabelsAndEventClasses::TYPE_GUID,
562 readableData,
563 offset);
Finn Williams0a336dc2020-05-11 15:39:58 +0100564
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000565 // Network - Conv2d layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000566 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
567 EmptyOptional(),
568 optNetGuid,
569 conv2d->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100570 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000571 readableData,
572 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000573
574 // Input layer - Conv2d layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000575 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
576 EmptyOptional(),
577 input->GetGuid(),
578 conv2d->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000579 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000580 readableData,
581 offset);
Finn Williams0a336dc2020-05-11 15:39:58 +0100582
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000583 // Conv2d workload
584 // Conv2d workload entity
Jim Flynn6398a982020-05-27 17:05:21 +0100585 ProfilingGuid conv2DWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000586
587 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000588 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
589 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100590 conv2DWorkloadGuid,
591 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000592 LabelsAndEventClasses::TYPE_GUID,
593 readableData,
594 offset);
Finn Williams0a336dc2020-05-11 15:39:58 +0100595
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000596 // BackendId entity
Jim Flynn6398a982020-05-27 17:05:21 +0100597 ProfilingGuid backendIdLabelGuid = VerifyTimelineLabelBinaryPacketData(
598 EmptyOptional(), backendId.Get(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000599
600 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000601 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
602 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100603 conv2DWorkloadGuid,
604 backendIdLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000605 LabelsAndEventClasses::BACKENDID_GUID,
606 readableData,
607 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000608
Finn Williams0a336dc2020-05-11 15:39:58 +0100609
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000610 // Conv2d layer - Conv2d workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000611 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
612 EmptyOptional(),
613 conv2d->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100614 conv2DWorkloadGuid,
615 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000616 readableData,
617 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000618
Mike Kelly07810fc2020-11-12 10:58:48 +0000619 // Abs layer
620 // Abs layer entity
621 VerifyTimelineEntityBinaryPacketData(abs->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000622
623 // Name entity
Mike Kelly07810fc2020-11-12 10:58:48 +0000624 ProfilingGuid absLabelGuid = VerifyTimelineLabelBinaryPacketData(
625 EmptyOptional(), "abs", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000626
627 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000628 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
629 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000630 abs->GetGuid(),
631 absLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000632 LabelsAndEventClasses::NAME_GUID,
633 readableData,
634 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000635
636 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000637 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
638 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000639 abs->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100640 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000641 LabelsAndEventClasses::TYPE_GUID,
642 readableData,
643 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000644
Mike Kelly07810fc2020-11-12 10:58:48 +0000645 // Network - Abs layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000646 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
647 EmptyOptional(),
648 optNetGuid,
Mike Kelly07810fc2020-11-12 10:58:48 +0000649 abs->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100650 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000651 readableData,
652 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000653
Mike Kelly07810fc2020-11-12 10:58:48 +0000654 // Conv2d layer - Abs layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000655 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
656 EmptyOptional(),
657 conv2d->GetGuid(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000658 abs->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000659 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000660 readableData,
661 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000662
Mike Kelly07810fc2020-11-12 10:58:48 +0000663 // Abs workload
664 // Abs workload entity
665 ProfilingGuid absWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000666
667 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000668 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
669 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000670 absWorkloadGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100671 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000672 LabelsAndEventClasses::TYPE_GUID,
673 readableData,
674 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000675
676 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000677 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), backendId.Get(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000678
679 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000680 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
681 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000682 absWorkloadGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100683 backendIdLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000684 LabelsAndEventClasses::BACKENDID_GUID,
685 readableData,
686 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000687
Mike Kelly07810fc2020-11-12 10:58:48 +0000688 // Abs layer - Abs workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000689 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
690 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000691 abs->GetGuid(),
692 absWorkloadGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100693 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000694 readableData,
695 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000696
697 // Output layer
698 // Output layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000699 VerifyTimelineEntityBinaryPacketData(output->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000700
701 // Name entity
Jim Flynn6398a982020-05-27 17:05:21 +0100702 ProfilingGuid outputLabelGuid = VerifyTimelineLabelBinaryPacketData(
703 EmptyOptional(), "output", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000704
705 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000706 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
707 EmptyOptional(),
708 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100709 outputLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000710 LabelsAndEventClasses::NAME_GUID,
711 readableData,
712 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000713
714 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000715 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
716 EmptyOptional(),
717 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100718 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000719 LabelsAndEventClasses::TYPE_GUID,
720 readableData,
721 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000722
723 // Network - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000724 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
725 EmptyOptional(),
726 optNetGuid,
727 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100728 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000729 readableData,
730 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000731
Mike Kelly07810fc2020-11-12 10:58:48 +0000732 // Abs layer - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000733 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
734 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000735 abs->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000736 output->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000737 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000738 readableData,
739 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000740
741 bufferManager.MarkRead(readableBuffer);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000742
743 // Creates structures for input & output.
744 std::vector<float> inputData(inputInfo.GetNumElements());
745 std::vector<float> outputData(outputInfo.GetNumElements());
746
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100747 TensorInfo inputTensorInfo = runtime.GetInputTensorInfo(netId, 0);
748 inputTensorInfo.SetConstant(true);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000749 InputTensors inputTensors
Keith Davis97da5e22020-03-05 16:25:28 +0000750 {
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100751 {0, ConstTensor(inputTensorInfo, inputData.data())}
Keith Davis97da5e22020-03-05 16:25:28 +0000752 };
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000753 OutputTensors outputTensors
Keith Davis97da5e22020-03-05 16:25:28 +0000754 {
Sadik Armagan3184c902020-03-18 10:57:30 +0000755 {0, Tensor(runtime.GetOutputTensorInfo(netId, 0), outputData.data())}
Keith Davis97da5e22020-03-05 16:25:28 +0000756 };
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000757
758 // Does the inference.
Sadik Armagan3184c902020-03-18 10:57:30 +0000759 runtime.EnqueueWorkload(netId, inputTensors, outputTensors);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000760
Finn Williamsb6a402f2020-03-24 13:46:22 +0000761 // Get readable buffer for input workload
762 auto inputReadableBuffer = bufferManager.GetReadableBuffer();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100763 CHECK(inputReadableBuffer != nullptr);
David Monahan6198fe02019-12-02 08:35:43 +0000764
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000765 // Get readable buffer for output workload
766 auto outputReadableBuffer = bufferManager.GetReadableBuffer();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100767 CHECK(outputReadableBuffer != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000768
Finn Williamsb6a402f2020-03-24 13:46:22 +0000769 // Get readable buffer for inference timeline
770 auto inferenceReadableBuffer = bufferManager.GetReadableBuffer();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100771 CHECK(inferenceReadableBuffer != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000772
773 // Validate input workload data
774 size = inputReadableBuffer->GetSize();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100775 CHECK(size == 164);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000776
777 readableData = inputReadableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100778 CHECK(readableData != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000779
780 offset = 0;
781
Keith Davis97da5e22020-03-05 16:25:28 +0000782 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100783 VerifyTimelineHeaderBinary(readableData, offset, 156);
Keith Davis97da5e22020-03-05 16:25:28 +0000784
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000785 // Input workload
786 // Input workload entity
Jim Flynn6398a982020-05-27 17:05:21 +0100787 ProfilingGuid inputWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000788
789 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000790 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
791 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100792 inputWorkloadGuid,
793 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000794 LabelsAndEventClasses::TYPE_GUID,
795 readableData,
796 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000797
798 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000799 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), backendId.Get(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000800
801 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000802 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
803 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100804 inputWorkloadGuid,
805 backendIdLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000806 LabelsAndEventClasses::BACKENDID_GUID,
807 readableData,
808 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000809
810 // Input layer - Input workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000811 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
812 EmptyOptional(),
813 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100814 inputWorkloadGuid,
815 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000816 readableData,
817 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000818
819 bufferManager.MarkRead(inputReadableBuffer);
820
821 // Validate output workload data
822 size = outputReadableBuffer->GetSize();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100823 CHECK(size == 164);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000824
825 readableData = outputReadableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100826 CHECK(readableData != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000827
828 offset = 0;
829
Keith Davis97da5e22020-03-05 16:25:28 +0000830 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100831 VerifyTimelineHeaderBinary(readableData, offset, 156);
Keith Davis97da5e22020-03-05 16:25:28 +0000832
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000833 // Output workload
834 // Output workload entity
Jim Flynn6398a982020-05-27 17:05:21 +0100835 ProfilingGuid outputWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000836
837 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000838 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
839 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100840 outputWorkloadGuid,
841 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000842 LabelsAndEventClasses::TYPE_GUID,
843 readableData,
844 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000845
846 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000847 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), backendId.Get(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000848
849 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000850 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
851 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100852 outputWorkloadGuid,
853 backendIdLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000854 LabelsAndEventClasses::BACKENDID_GUID,
855 readableData,
856 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000857
858 // Output layer - Output workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000859 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
860 EmptyOptional(),
861 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100862 outputWorkloadGuid,
863 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000864 readableData,
865 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000866
867 bufferManager.MarkRead(outputReadableBuffer);
David Monahan6198fe02019-12-02 08:35:43 +0000868
869 // Validate inference data
870 size = inferenceReadableBuffer->GetSize();
Jan Eilersa10e2a22020-03-26 12:04:54 +0000871
Sadik Armagan1625efc2021-06-10 18:24:34 +0100872 CHECK(size == 1228 + 10 * ThreadIdSize);
David Monahan6198fe02019-12-02 08:35:43 +0000873
874 readableData = inferenceReadableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100875 CHECK(readableData != nullptr);
David Monahan6198fe02019-12-02 08:35:43 +0000876
877 offset = 0;
878
Keith Davis97da5e22020-03-05 16:25:28 +0000879 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100880 VerifyTimelineHeaderBinary(readableData, offset, 1220 + 10 * ThreadIdSize);
Keith Davis97da5e22020-03-05 16:25:28 +0000881
David Monahan6198fe02019-12-02 08:35:43 +0000882 // Inference timeline trace
883 // Inference entity
Jim Flynn6398a982020-05-27 17:05:21 +0100884 ProfilingGuid inferenceGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000885
886 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000887 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
888 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100889 inferenceGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000890 LabelsAndEventClasses::INFERENCE_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000891 LabelsAndEventClasses::TYPE_GUID,
892 readableData,
893 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000894
895 // Network - Inference relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000896 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
897 EmptyOptional(),
898 optNetGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100899 inferenceGuid,
900 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000901 readableData,
902 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000903
904 // Start Inference life
905 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100906 ProfilingGuid inferenceEventGuid = VerifyTimelineEventBinaryPacket(
907 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000908
909 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000910 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
911 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100912 inferenceGuid,
913 inferenceEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000914 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
915 readableData,
916 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000917
918 // Execution
919 // Input workload execution
920 // Input workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +0100921 ProfilingGuid inputWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
922 EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000923
924 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000925 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
926 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100927 inputWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000928 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000929 LabelsAndEventClasses::TYPE_GUID,
930 readableData,
931 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000932
933 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000934 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
935 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100936 inferenceGuid,
937 inputWorkloadExecutionGuid,
938 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000939 readableData,
940 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000941
942 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000943 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
944 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100945 inputWorkloadGuid,
946 inputWorkloadExecutionGuid,
947 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000948 readableData,
949 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000950
951 // Start Input workload execution life
952 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100953 ProfilingGuid inputWorkloadExecutionSOLEventId = VerifyTimelineEventBinaryPacket(
954 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000955
956 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000957 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
958 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100959 inputWorkloadExecutionGuid,
960 inputWorkloadExecutionSOLEventId,
Keith Davis97da5e22020-03-05 16:25:28 +0000961 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
962 readableData,
963 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000964
965 // End of Input workload execution life
966 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100967 ProfilingGuid inputWorkloadExecutionEOLEventId = VerifyTimelineEventBinaryPacket(
968 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000969
970 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000971 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
972 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100973 inputWorkloadExecutionGuid,
974 inputWorkloadExecutionEOLEventId,
Keith Davis97da5e22020-03-05 16:25:28 +0000975 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
976 readableData,
977 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000978
979 // Conv2d workload execution
980 // Conv2d workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +0100981 ProfilingGuid conv2DWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
982 EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000983
984 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000985 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
986 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100987 conv2DWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000988 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000989 LabelsAndEventClasses::TYPE_GUID,
990 readableData,
991 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000992
993 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000994 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
995 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100996 inferenceGuid,
997 conv2DWorkloadExecutionGuid,
998 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000999 readableData,
1000 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001001
1002 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001003 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1004 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001005 conv2DWorkloadGuid,
1006 conv2DWorkloadExecutionGuid,
1007 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001008 readableData,
1009 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001010
1011 // Start Conv2d workload execution life
1012 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001013 ProfilingGuid conv2DWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
1014 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001015
1016 // Conv2d workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001017 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1018 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001019 conv2DWorkloadExecutionGuid,
1020 conv2DWorkloadExecutionSOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001021 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1022 readableData,
1023 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001024
1025 // End of Conv2d workload execution life
1026 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001027 ProfilingGuid conv2DWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
1028 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001029
1030 // Conv2d workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001031 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1032 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001033 conv2DWorkloadExecutionGuid,
1034 conv2DWorkloadExecutionEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001035 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1036 readableData,
1037 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001038
Mike Kelly07810fc2020-11-12 10:58:48 +00001039 // Abs workload execution
1040 // Abs workload execution entity
1041 ProfilingGuid absWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
Jim Flynn6398a982020-05-27 17:05:21 +01001042 EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001043
1044 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001045 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1046 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +00001047 absWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001048 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001049 LabelsAndEventClasses::TYPE_GUID,
1050 readableData,
1051 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001052
1053 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001054 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1055 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001056 inferenceGuid,
Mike Kelly07810fc2020-11-12 10:58:48 +00001057 absWorkloadExecutionGuid,
Jim Flynn6398a982020-05-27 17:05:21 +01001058 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001059 readableData,
1060 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001061
1062 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001063 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1064 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +00001065 absWorkloadGuid,
1066 absWorkloadExecutionGuid,
Jim Flynn6398a982020-05-27 17:05:21 +01001067 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001068 readableData,
1069 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001070
Mike Kelly07810fc2020-11-12 10:58:48 +00001071 // Start Abs workload execution life
David Monahan6198fe02019-12-02 08:35:43 +00001072 // Event packet - timeline, threadId, eventGuid
Mike Kelly07810fc2020-11-12 10:58:48 +00001073 ProfilingGuid absWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
Jim Flynn6398a982020-05-27 17:05:21 +01001074 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001075
Mike Kelly07810fc2020-11-12 10:58:48 +00001076 // Abs workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001077 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1078 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +00001079 absWorkloadExecutionGuid,
1080 absWorkloadExecutionSOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001081 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1082 readableData,
1083 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001084
Mike Kelly07810fc2020-11-12 10:58:48 +00001085 // End of Abs workload execution life
David Monahan6198fe02019-12-02 08:35:43 +00001086 // Event packet - timeline, threadId, eventGuid
Mike Kelly07810fc2020-11-12 10:58:48 +00001087 ProfilingGuid absWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
Jim Flynn6398a982020-05-27 17:05:21 +01001088 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001089
Mike Kelly07810fc2020-11-12 10:58:48 +00001090 // Abs workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001091 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1092 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +00001093 absWorkloadExecutionGuid,
1094 absWorkloadExecutionEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001095 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1096 readableData,
1097 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001098
1099 // Output workload execution
1100 // Output workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +01001101 ProfilingGuid outputWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
1102 EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001103
1104 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001105 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1106 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001107 outputWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001108 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001109 LabelsAndEventClasses::TYPE_GUID,
1110 readableData,
1111 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001112
1113 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001114 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1115 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001116 inferenceGuid,
1117 outputWorkloadExecutionGuid,
1118 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001119 readableData,
1120 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001121
1122 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001123 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1124 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001125 outputWorkloadGuid,
1126 outputWorkloadExecutionGuid,
1127 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001128 readableData,
1129 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001130
1131 // Start Output workload execution life
1132 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001133 ProfilingGuid outputWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
1134 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001135
1136 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001137 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1138 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001139 outputWorkloadExecutionGuid,
1140 outputWorkloadExecutionSOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001141 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1142 readableData,
1143 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001144
1145 // End of Normalize workload execution life
1146 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001147 ProfilingGuid outputWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
1148 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001149
1150 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001151 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1152 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001153 outputWorkloadExecutionGuid,
1154 outputWorkloadExecutionEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001155 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1156 readableData,
1157 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001158
1159 // End of Inference life
1160 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001161 ProfilingGuid inferenceEOLEventGuid = VerifyTimelineEventBinaryPacket(
1162 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001163
1164 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001165 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1166 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001167 inferenceGuid,
1168 inferenceEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001169 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1170 readableData,
1171 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001172
1173 bufferManager.MarkRead(inferenceReadableBuffer);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +00001174}
Jim Flynn6398a982020-05-27 17:05:21 +01001175
Jim Flynn6398a982020-05-27 17:05:21 +01001176bool CompareOutput(std::vector<std::string> output, std::vector<std::string> expectedOutput)
1177{
1178 if (output.size() != expectedOutput.size())
1179 {
1180 std::cerr << "output has [" << output.size() << "] lines, expected was ["
1181 << expectedOutput.size() << "] lines" << std::endl;
1182 std::cerr << std::endl << "actual" << std::endl << std::endl;
1183 for (auto line : output)
1184 {
1185 std::cerr << line << std::endl;
1186 }
1187 std::cerr << std::endl << "expected" << std::endl << std::endl;
1188 for (auto line : expectedOutput)
1189 {
1190 std::cerr << line << std::endl;
1191 }
1192 return false;
1193 }
1194 bool bRet = true;
1195 for (unsigned long i = 0; i < output.size(); ++i)
1196 {
1197 if (output[i] != expectedOutput[i])
1198 {
1199 bRet = false;
1200 std::cerr << i << ": actual [" << output[i] << "] expected [" << expectedOutput[i] << "]" << std::endl;
1201 }
1202 }
1203 return bRet;
1204}