blob: b9035b44e9bb9a6830a15adadf9046fa004a40ff [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>
Jim Flynnf7713212020-07-14 09:50:59 +010015#include <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);
Keith Davis97da5e22020-03-05 16:25:28 +0000384 TensorInfo weightInfo({ 3, 2, 3, 1 }, DataType::Float32);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000385 TensorInfo biasInfo({ 3 }, DataType::Float32);
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);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100457 MESSAGE("HEADER OK");
Keith Davis97da5e22020-03-05 16:25:28 +0000458
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000459 // Post-optimisation network
460 // Network entity
Keith Davis97da5e22020-03-05 16:25:28 +0000461 VerifyTimelineEntityBinaryPacketData(optNetGuid, readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100462 MESSAGE("NETWORK ENTITY OK");
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);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100472 MESSAGE("NETWORK TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000473
Jim Flynnf7713212020-07-14 09:50:59 +0100474 // Network - START OF LIFE
475 ProfilingGuid networkSolEventGuid = VerifyTimelineEventBinaryPacket(EmptyOptional(),
476 EmptyOptional(),
477 EmptyOptional(),
478 readableData,
479 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100480 MESSAGE("NETWORK START OF LIFE EVENT OK");
Jim Flynnf7713212020-07-14 09:50:59 +0100481
482 // Network - START OF LIFE event relationship
483 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
484 EmptyOptional(),
485 optNetGuid,
486 networkSolEventGuid,
487 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
488 readableData,
489 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100490 MESSAGE("NETWORK START OF LIFE RELATIONSHIP OK");
Jim Flynnf7713212020-07-14 09:50:59 +0100491
492 // Process ID Label
493 int processID = armnnUtils::Processes::GetCurrentId();
494 std::stringstream ss;
495 ss << processID;
496 std::string processIdLabel = ss.str();
497 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), processIdLabel, readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100498 MESSAGE("PROCESS ID LABEL OK");
Jim Flynnf7713212020-07-14 09:50:59 +0100499
500 // Entity - Process ID relationship
501 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
502 EmptyOptional(),
503 optNetGuid,
504 EmptyOptional(),
505 LabelsAndEventClasses::PROCESS_ID_GUID,
506 readableData,
507 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100508 MESSAGE("NETWORK PROCESS ID RELATIONSHIP OK");
Jim Flynnf7713212020-07-14 09:50:59 +0100509
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000510 // Input layer
511 // Input layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000512 VerifyTimelineEntityBinaryPacketData(input->GetGuid(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100513 MESSAGE("INPUT ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000514
515 // Name Entity
Jim Flynn6398a982020-05-27 17:05:21 +0100516 ProfilingGuid inputLabelGuid = VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "input", readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100517 MESSAGE("INPUT NAME LABEL OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000518
519 // Entity - Name 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 inputLabelGuid,
Finn Williams0a336dc2020-05-11 15:39:58 +0100524 LabelsAndEventClasses::NAME_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000525 readableData,
526 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100527 MESSAGE("INPUT NAME RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000528
529 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000530 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
531 EmptyOptional(),
532 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100533 LabelsAndEventClasses::LAYER_GUID,
Finn Williams0a336dc2020-05-11 15:39:58 +0100534 LabelsAndEventClasses::TYPE_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000535 readableData,
536 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100537 MESSAGE("INPUT TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000538
539 // Network - Input layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000540 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
541 EmptyOptional(),
542 optNetGuid,
543 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100544 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000545 readableData,
546 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100547 MESSAGE("NETWORK - INPUT CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000548
549 // Conv2d layer
550 // Conv2d layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000551 VerifyTimelineEntityBinaryPacketData(conv2d->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000552
553 // Name entity
Jim Flynn6398a982020-05-27 17:05:21 +0100554 ProfilingGuid conv2dNameLabelGuid = VerifyTimelineLabelBinaryPacketData(
555 EmptyOptional(), "<Unnamed>", readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100556 MESSAGE("CONV2D NAME LABEL OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000557
558 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000559 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
560 EmptyOptional(),
561 conv2d->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100562 conv2dNameLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000563 LabelsAndEventClasses::NAME_GUID,
564 readableData,
565 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100566 MESSAGE("CONV2D NAME RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000567
568 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000569 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
570 EmptyOptional(),
571 conv2d->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100572 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000573 LabelsAndEventClasses::TYPE_GUID,
574 readableData,
575 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100576 MESSAGE("CONV2D TYPE RELATIONSHIP OK");
Finn Williams0a336dc2020-05-11 15:39:58 +0100577
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000578 // Network - Conv2d layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000579 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
580 EmptyOptional(),
581 optNetGuid,
582 conv2d->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100583 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000584 readableData,
585 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100586 MESSAGE("NETWORK - CONV2D CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000587
588 // Input layer - Conv2d layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000589 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
590 EmptyOptional(),
591 input->GetGuid(),
592 conv2d->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000593 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000594 readableData,
595 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100596 MESSAGE("INPUT - CONV2D LAYER CONNECTION OK");
Finn Williams0a336dc2020-05-11 15:39:58 +0100597
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000598 // Conv2d workload
599 // Conv2d workload entity
Jim Flynn6398a982020-05-27 17:05:21 +0100600 ProfilingGuid conv2DWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100601 MESSAGE("CONV2D WORKLOAD ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000602
603 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000604 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
605 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100606 conv2DWorkloadGuid,
607 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000608 LabelsAndEventClasses::TYPE_GUID,
609 readableData,
610 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100611 MESSAGE("CONV2D WORKLOAD TYPE RELATIONSHIP OK");
Finn Williams0a336dc2020-05-11 15:39:58 +0100612
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000613 // BackendId entity
Jim Flynn6398a982020-05-27 17:05:21 +0100614 ProfilingGuid backendIdLabelGuid = VerifyTimelineLabelBinaryPacketData(
615 EmptyOptional(), backendId.Get(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000616
617 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000618 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
619 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100620 conv2DWorkloadGuid,
621 backendIdLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000622 LabelsAndEventClasses::BACKENDID_GUID,
623 readableData,
624 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100625 MESSAGE("CONV2D WORKLOAD BACKEND ID RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000626
Finn Williams0a336dc2020-05-11 15:39:58 +0100627
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000628 // Conv2d layer - Conv2d workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000629 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
630 EmptyOptional(),
631 conv2d->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100632 conv2DWorkloadGuid,
633 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000634 readableData,
635 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100636 MESSAGE("CONV2D LAYER - WORKLOAD CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000637
Mike Kelly07810fc2020-11-12 10:58:48 +0000638 // Abs layer
639 // Abs layer entity
640 VerifyTimelineEntityBinaryPacketData(abs->GetGuid(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100641 MESSAGE("ABS ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000642
643 // Name entity
Mike Kelly07810fc2020-11-12 10:58:48 +0000644 ProfilingGuid absLabelGuid = VerifyTimelineLabelBinaryPacketData(
645 EmptyOptional(), "abs", readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100646 MESSAGE("ABS NAME LABEL OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000647
648 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000649 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
650 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000651 abs->GetGuid(),
652 absLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000653 LabelsAndEventClasses::NAME_GUID,
654 readableData,
655 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100656 MESSAGE("ABS LAYER - NAME RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000657
658 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000659 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
660 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000661 abs->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100662 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000663 LabelsAndEventClasses::TYPE_GUID,
664 readableData,
665 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100666 MESSAGE("ABS LAYER TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000667
Mike Kelly07810fc2020-11-12 10:58:48 +0000668 // Network - Abs layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000669 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
670 EmptyOptional(),
671 optNetGuid,
Mike Kelly07810fc2020-11-12 10:58:48 +0000672 abs->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100673 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000674 readableData,
675 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100676 MESSAGE("NETWORK - ABS LAYER CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000677
Mike Kelly07810fc2020-11-12 10:58:48 +0000678 // Conv2d layer - Abs layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000679 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
680 EmptyOptional(),
681 conv2d->GetGuid(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000682 abs->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000683 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000684 readableData,
685 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100686 MESSAGE("CONV2D LAYER - ABS LAYER CONNECTION OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000687
Mike Kelly07810fc2020-11-12 10:58:48 +0000688 // Abs workload
689 // Abs workload entity
690 ProfilingGuid absWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100691 MESSAGE("ABS WORKLOAD ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000692
693 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000694 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
695 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000696 absWorkloadGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100697 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000698 LabelsAndEventClasses::TYPE_GUID,
699 readableData,
700 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100701 MESSAGE("ABS WORKLAD TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000702
703 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000704 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), backendId.Get(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100705 MESSAGE("BACKEND ID LABEL OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000706
707 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000708 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
709 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000710 absWorkloadGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100711 backendIdLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000712 LabelsAndEventClasses::BACKENDID_GUID,
713 readableData,
714 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100715 MESSAGE("ABS WORKLOAD BACKEND ID RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000716
Mike Kelly07810fc2020-11-12 10:58:48 +0000717 // Abs layer - Abs workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000718 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
719 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000720 abs->GetGuid(),
721 absWorkloadGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100722 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000723 readableData,
724 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100725 MESSAGE("ABS LAYER - WORKLOAD CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000726
727 // Output layer
728 // Output layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000729 VerifyTimelineEntityBinaryPacketData(output->GetGuid(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100730 MESSAGE("OUTPUT LAYER ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000731
732 // Name entity
Jim Flynn6398a982020-05-27 17:05:21 +0100733 ProfilingGuid outputLabelGuid = VerifyTimelineLabelBinaryPacketData(
734 EmptyOptional(), "output", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000735
736 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000737 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
738 EmptyOptional(),
739 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100740 outputLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000741 LabelsAndEventClasses::NAME_GUID,
742 readableData,
743 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100744 MESSAGE("OUTPUT LAYER NAME RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000745
746 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000747 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
748 EmptyOptional(),
749 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100750 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000751 LabelsAndEventClasses::TYPE_GUID,
752 readableData,
753 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100754 MESSAGE("OUTPUT LAYER TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000755
756 // Network - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000757 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
758 EmptyOptional(),
759 optNetGuid,
760 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100761 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000762 readableData,
763 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100764 MESSAGE("NETWORK - OUTPUT LAYER CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000765
Mike Kelly07810fc2020-11-12 10:58:48 +0000766 // Abs layer - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000767 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
768 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000769 abs->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000770 output->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000771 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000772 readableData,
773 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100774 MESSAGE("ABS LAYER - OUTPUT LAYER CONNECTION OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000775
776 bufferManager.MarkRead(readableBuffer);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000777
778 // Creates structures for input & output.
779 std::vector<float> inputData(inputInfo.GetNumElements());
780 std::vector<float> outputData(outputInfo.GetNumElements());
781
782 InputTensors inputTensors
Keith Davis97da5e22020-03-05 16:25:28 +0000783 {
Sadik Armagan3184c902020-03-18 10:57:30 +0000784 {0, ConstTensor(runtime.GetInputTensorInfo(netId, 0), inputData.data())}
Keith Davis97da5e22020-03-05 16:25:28 +0000785 };
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000786 OutputTensors outputTensors
Keith Davis97da5e22020-03-05 16:25:28 +0000787 {
Sadik Armagan3184c902020-03-18 10:57:30 +0000788 {0, Tensor(runtime.GetOutputTensorInfo(netId, 0), outputData.data())}
Keith Davis97da5e22020-03-05 16:25:28 +0000789 };
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000790
791 // Does the inference.
Sadik Armagan3184c902020-03-18 10:57:30 +0000792 runtime.EnqueueWorkload(netId, inputTensors, outputTensors);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000793
Finn Williamsb6a402f2020-03-24 13:46:22 +0000794 // Get readable buffer for input workload
795 auto inputReadableBuffer = bufferManager.GetReadableBuffer();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100796 CHECK(inputReadableBuffer != nullptr);
David Monahan6198fe02019-12-02 08:35:43 +0000797
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000798 // Get readable buffer for output workload
799 auto outputReadableBuffer = bufferManager.GetReadableBuffer();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100800 CHECK(outputReadableBuffer != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000801
Finn Williamsb6a402f2020-03-24 13:46:22 +0000802 // Get readable buffer for inference timeline
803 auto inferenceReadableBuffer = bufferManager.GetReadableBuffer();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100804 CHECK(inferenceReadableBuffer != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000805
806 // Validate input workload data
807 size = inputReadableBuffer->GetSize();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100808 CHECK(size == 164);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000809
810 readableData = inputReadableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100811 CHECK(readableData != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000812
813 offset = 0;
814
Keith Davis97da5e22020-03-05 16:25:28 +0000815 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100816 VerifyTimelineHeaderBinary(readableData, offset, 156);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100817 MESSAGE("INPUT WORKLOAD HEADER OK");
Keith Davis97da5e22020-03-05 16:25:28 +0000818
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000819 // Input workload
820 // Input workload entity
Jim Flynn6398a982020-05-27 17:05:21 +0100821 ProfilingGuid inputWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100822 MESSAGE("INPUT WORKLOAD TYPE RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000823
824 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000825 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
826 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100827 inputWorkloadGuid,
828 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000829 LabelsAndEventClasses::TYPE_GUID,
830 readableData,
831 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100832 MESSAGE("INPUT WORKLOAD TYPE RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000833
834 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000835 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), backendId.Get(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000836
837 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000838 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
839 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100840 inputWorkloadGuid,
841 backendIdLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000842 LabelsAndEventClasses::BACKENDID_GUID,
843 readableData,
844 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100845 MESSAGE("INPUT WORKLOAD BACKEND ID RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000846
847 // Input layer - Input workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000848 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
849 EmptyOptional(),
850 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100851 inputWorkloadGuid,
852 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000853 readableData,
854 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100855 MESSAGE("INPUT LAYER - INPUT WORKLOAD CHILD RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000856
857 bufferManager.MarkRead(inputReadableBuffer);
858
859 // Validate output workload data
860 size = outputReadableBuffer->GetSize();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100861 CHECK(size == 164);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000862
863 readableData = outputReadableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100864 CHECK(readableData != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000865
866 offset = 0;
867
Keith Davis97da5e22020-03-05 16:25:28 +0000868 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100869 VerifyTimelineHeaderBinary(readableData, offset, 156);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100870 MESSAGE("OUTPUT WORKLOAD HEADER OK");
Keith Davis97da5e22020-03-05 16:25:28 +0000871
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000872 // Output workload
873 // Output workload entity
Jim Flynn6398a982020-05-27 17:05:21 +0100874 ProfilingGuid outputWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100875 MESSAGE("OUTPUT WORKLOAD ENTITY OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000876
877 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000878 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
879 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100880 outputWorkloadGuid,
881 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000882 LabelsAndEventClasses::TYPE_GUID,
883 readableData,
884 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100885 MESSAGE("OUTPUT WORKLOAD TYPE RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000886
887 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000888 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), backendId.Get(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100889 MESSAGE("OUTPUT WORKLOAD LABEL OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000890
891 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000892 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
893 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100894 outputWorkloadGuid,
895 backendIdLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000896 LabelsAndEventClasses::BACKENDID_GUID,
897 readableData,
898 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100899 MESSAGE("OUTPUT WORKLOAD BACKEND ID RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000900
901 // Output layer - Output workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000902 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
903 EmptyOptional(),
904 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100905 outputWorkloadGuid,
906 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000907 readableData,
908 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100909 MESSAGE("OUTPUT LAYER - OUTPUT WORKLOAD CHILD RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000910
911 bufferManager.MarkRead(outputReadableBuffer);
David Monahan6198fe02019-12-02 08:35:43 +0000912
913 // Validate inference data
914 size = inferenceReadableBuffer->GetSize();
Jan Eilersa10e2a22020-03-26 12:04:54 +0000915
Sadik Armagan1625efc2021-06-10 18:24:34 +0100916 CHECK(size == 1228 + 10 * ThreadIdSize);
David Monahan6198fe02019-12-02 08:35:43 +0000917
918 readableData = inferenceReadableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100919 CHECK(readableData != nullptr);
David Monahan6198fe02019-12-02 08:35:43 +0000920
921 offset = 0;
922
Keith Davis97da5e22020-03-05 16:25:28 +0000923 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100924 VerifyTimelineHeaderBinary(readableData, offset, 1220 + 10 * ThreadIdSize);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100925 MESSAGE("INFERENCE HEADER OK");
Keith Davis97da5e22020-03-05 16:25:28 +0000926
David Monahan6198fe02019-12-02 08:35:43 +0000927 // Inference timeline trace
928 // Inference entity
Jim Flynn6398a982020-05-27 17:05:21 +0100929 ProfilingGuid inferenceGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100930 MESSAGE("INFERENCE ENTITY OK");
David Monahan6198fe02019-12-02 08:35:43 +0000931
932 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000933 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
934 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100935 inferenceGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000936 LabelsAndEventClasses::INFERENCE_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000937 LabelsAndEventClasses::TYPE_GUID,
938 readableData,
939 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100940 MESSAGE("INFERENCE TYPE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000941
942 // Network - Inference relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000943 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
944 EmptyOptional(),
945 optNetGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100946 inferenceGuid,
947 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000948 readableData,
949 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100950 MESSAGE("NETWORK - INFERENCE EXECUTION_OF RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000951
952 // Start Inference life
953 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100954 ProfilingGuid inferenceEventGuid = VerifyTimelineEventBinaryPacket(
955 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100956 MESSAGE("INFERENCE START OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +0000957
958 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000959 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
960 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100961 inferenceGuid,
962 inferenceEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000963 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
964 readableData,
965 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100966 MESSAGE("INFERENCE START OF LIFE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000967
968 // Execution
969 // Input workload execution
970 // Input workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +0100971 ProfilingGuid inputWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
972 EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100973 MESSAGE("INPUT WORKLOAD EXECUTION ENTITY OK");
David Monahan6198fe02019-12-02 08:35:43 +0000974
975 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000976 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
977 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100978 inputWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000979 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000980 LabelsAndEventClasses::TYPE_GUID,
981 readableData,
982 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100983 MESSAGE("INPUT WORKLOAD EXECUTION TYPE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000984
985 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000986 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
987 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100988 inferenceGuid,
989 inputWorkloadExecutionGuid,
990 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000991 readableData,
992 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100993 MESSAGE("INPUT WORKLOAD - INPUT WORKLOAD EXECUTION RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000994
995 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000996 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
997 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100998 inputWorkloadGuid,
999 inputWorkloadExecutionGuid,
1000 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001001 readableData,
1002 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001003 MESSAGE("INPUT WORKLOAD - INPUT WORKLOAD EXECUTION RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001004
1005 // Start Input workload execution life
1006 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001007 ProfilingGuid inputWorkloadExecutionSOLEventId = VerifyTimelineEventBinaryPacket(
1008 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001009 MESSAGE("INPUT WORKLOAD EXECUTION - START OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001010
1011 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001012 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1013 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001014 inputWorkloadExecutionGuid,
1015 inputWorkloadExecutionSOLEventId,
Keith Davis97da5e22020-03-05 16:25:28 +00001016 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1017 readableData,
1018 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001019 MESSAGE("INPUT WORKLOAD EXECUTION - START OF LIFE EVENT RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001020
1021 // End of Input workload execution life
1022 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001023 ProfilingGuid inputWorkloadExecutionEOLEventId = VerifyTimelineEventBinaryPacket(
1024 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001025 MESSAGE("INPUT WORKLOAD EXECUTION - END OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001026
1027 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001028 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1029 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001030 inputWorkloadExecutionGuid,
1031 inputWorkloadExecutionEOLEventId,
Keith Davis97da5e22020-03-05 16:25:28 +00001032 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1033 readableData,
1034 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001035 MESSAGE("INPUT WORKLOAD EXECUTION - END OF LIFE EVENT RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001036
1037 // Conv2d workload execution
1038 // Conv2d workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +01001039 ProfilingGuid conv2DWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
1040 EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001041 MESSAGE("CONV2D WORKLOAD EXECUTION ENTITY OK");
David Monahan6198fe02019-12-02 08:35:43 +00001042
1043 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001044 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1045 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001046 conv2DWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001047 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001048 LabelsAndEventClasses::TYPE_GUID,
1049 readableData,
1050 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001051 MESSAGE("CONV2D WORKLOAD EXECUTION TYPE RELATIONSHIP OK");
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,
1057 conv2DWorkloadExecutionGuid,
1058 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001059 readableData,
1060 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001061 MESSAGE("INFERENCE - CONV2D WORKLOAD EXECUTION CHILD RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001062
1063 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001064 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1065 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001066 conv2DWorkloadGuid,
1067 conv2DWorkloadExecutionGuid,
1068 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001069 readableData,
1070 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001071 MESSAGE("CONV2D WORKLOAD - CONV2D WORKLOAD EXECUTION RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001072
1073 // Start Conv2d workload execution life
1074 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001075 ProfilingGuid conv2DWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
1076 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001077 MESSAGE("CONV2D WORKLOAD EXECUTION START OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001078
1079 // Conv2d workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001080 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1081 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001082 conv2DWorkloadExecutionGuid,
1083 conv2DWorkloadExecutionSOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001084 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1085 readableData,
1086 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001087 MESSAGE("CONV2D WORKLOAD EXECUTION START OF LIFE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001088
1089 // End of Conv2d workload execution life
1090 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001091 ProfilingGuid conv2DWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
1092 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001093 MESSAGE("CONV2D WORKLOAD EXECUTION END OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001094
1095 // Conv2d workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001096 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1097 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001098 conv2DWorkloadExecutionGuid,
1099 conv2DWorkloadExecutionEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001100 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1101 readableData,
1102 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001103 MESSAGE("CONV2D WORKLOAD EXECUTION END OF LIFE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001104
Mike Kelly07810fc2020-11-12 10:58:48 +00001105 // Abs workload execution
1106 // Abs workload execution entity
1107 ProfilingGuid absWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
Jim Flynn6398a982020-05-27 17:05:21 +01001108 EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001109 MESSAGE("ABS WORKLOAD EXECUTION ENTITY OK");
David Monahan6198fe02019-12-02 08:35:43 +00001110
1111 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001112 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1113 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +00001114 absWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001115 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001116 LabelsAndEventClasses::TYPE_GUID,
1117 readableData,
1118 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001119 MESSAGE("ABS WORKLOAD EXECUTION TYPE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001120
1121 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001122 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1123 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001124 inferenceGuid,
Mike Kelly07810fc2020-11-12 10:58:48 +00001125 absWorkloadExecutionGuid,
Jim Flynn6398a982020-05-27 17:05:21 +01001126 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001127 readableData,
1128 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001129 MESSAGE("INFERENCE - ABS WORKLOAD EXECUTION CHILD RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001130
1131 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001132 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1133 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +00001134 absWorkloadGuid,
1135 absWorkloadExecutionGuid,
Jim Flynn6398a982020-05-27 17:05:21 +01001136 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001137 readableData,
1138 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001139 MESSAGE("ABS WORKLOAD - ABS WORKLOAD EXECUTION RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001140
Mike Kelly07810fc2020-11-12 10:58:48 +00001141 // Start Abs workload execution life
David Monahan6198fe02019-12-02 08:35:43 +00001142 // Event packet - timeline, threadId, eventGuid
Mike Kelly07810fc2020-11-12 10:58:48 +00001143 ProfilingGuid absWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
Jim Flynn6398a982020-05-27 17:05:21 +01001144 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001145 MESSAGE("ABS WORKLOAD EXECUTION START OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001146
Mike Kelly07810fc2020-11-12 10:58:48 +00001147 // Abs workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001148 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1149 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +00001150 absWorkloadExecutionGuid,
1151 absWorkloadExecutionSOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001152 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1153 readableData,
1154 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001155 MESSAGE("ABS WORKLOAD EXECUTION START OF LIFE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001156
Mike Kelly07810fc2020-11-12 10:58:48 +00001157 // End of Abs workload execution life
David Monahan6198fe02019-12-02 08:35:43 +00001158 // Event packet - timeline, threadId, eventGuid
Mike Kelly07810fc2020-11-12 10:58:48 +00001159 ProfilingGuid absWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
Jim Flynn6398a982020-05-27 17:05:21 +01001160 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001161 MESSAGE("ABS WORKLOAD EXECUTION END OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001162
Mike Kelly07810fc2020-11-12 10:58:48 +00001163 // Abs workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001164 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1165 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +00001166 absWorkloadExecutionGuid,
1167 absWorkloadExecutionEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001168 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1169 readableData,
1170 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001171 MESSAGE("ABS WORKLOAD EXECUTION END OF LIFE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001172
1173 // Output workload execution
1174 // Output workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +01001175 ProfilingGuid outputWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
1176 EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001177 MESSAGE("OUTPUT WORKLOAD EXECUTION ENTITY OK");
David Monahan6198fe02019-12-02 08:35:43 +00001178
1179 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001180 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1181 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001182 outputWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001183 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001184 LabelsAndEventClasses::TYPE_GUID,
1185 readableData,
1186 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001187 MESSAGE("OUTPUT WORKLOAD EXECUTION TYPE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001188
1189 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001190 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1191 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001192 inferenceGuid,
1193 outputWorkloadExecutionGuid,
1194 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001195 readableData,
1196 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001197 MESSAGE("INFERENCE - OUTPUT WORKLOAD EXECUTION CHILD RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001198
1199 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001200 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1201 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001202 outputWorkloadGuid,
1203 outputWorkloadExecutionGuid,
1204 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001205 readableData,
1206 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001207 MESSAGE("OUTPUT WORKLOAD - OUTPUT WORKLOAD EXECUTION EXECUTION_OF RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001208
1209 // Start Output workload execution life
1210 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001211 ProfilingGuid outputWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
1212 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001213 MESSAGE("OUTPUT WORKLOAD EXECUTION START OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001214
1215 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001216 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1217 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001218 outputWorkloadExecutionGuid,
1219 outputWorkloadExecutionSOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001220 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1221 readableData,
1222 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001223 MESSAGE("OUTPUT WORKLOAD EXECUTION - START OF LIFE EVENT RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001224
1225 // End of Normalize workload execution life
1226 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001227 ProfilingGuid outputWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
1228 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001229 MESSAGE("OUTPUT WORKLOAD EXECUTION END OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001230
1231 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001232 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1233 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001234 outputWorkloadExecutionGuid,
1235 outputWorkloadExecutionEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001236 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1237 readableData,
1238 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001239 MESSAGE("OUTPUT WORKLOAD EXECUTION - END OF LIFE EVENT RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001240
1241 // End of Inference life
1242 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001243 ProfilingGuid inferenceEOLEventGuid = VerifyTimelineEventBinaryPacket(
1244 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001245 MESSAGE("INFERENCE END OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001246
1247 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001248 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1249 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001250 inferenceGuid,
1251 inferenceEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001252 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1253 readableData,
1254 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001255 MESSAGE("INFERENCE - END OF LIFE EVENT RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001256
1257 bufferManager.MarkRead(inferenceReadableBuffer);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +00001258}
Jim Flynn6398a982020-05-27 17:05:21 +01001259
Jim Flynn6398a982020-05-27 17:05:21 +01001260bool CompareOutput(std::vector<std::string> output, std::vector<std::string> expectedOutput)
1261{
1262 if (output.size() != expectedOutput.size())
1263 {
1264 std::cerr << "output has [" << output.size() << "] lines, expected was ["
1265 << expectedOutput.size() << "] lines" << std::endl;
1266 std::cerr << std::endl << "actual" << std::endl << std::endl;
1267 for (auto line : output)
1268 {
1269 std::cerr << line << std::endl;
1270 }
1271 std::cerr << std::endl << "expected" << std::endl << std::endl;
1272 for (auto line : expectedOutput)
1273 {
1274 std::cerr << line << std::endl;
1275 }
1276 return false;
1277 }
1278 bool bRet = true;
1279 for (unsigned long i = 0; i < output.size(); ++i)
1280 {
1281 if (output[i] != expectedOutput[i])
1282 {
1283 bRet = false;
1284 std::cerr << i << ": actual [" << output[i] << "] expected [" << expectedOutput[i] << "]" << std::endl;
1285 }
1286 }
1287 return bRet;
1288}