blob: 0d8e9ef7bca90f1561f07b0bf07226d8875cb451 [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
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000013#include <LabelsAndEventClasses.hpp>
Jim Flynnf7713212020-07-14 09:50:59 +010014#include <Processes.hpp>
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000015#include <ProfilingService.hpp>
Jim Flynnf7713212020-07-14 09:50:59 +010016#include <Threads.hpp>
Sadik Armaganea41b572020-03-19 18:16:46 +000017
18#include <test/TestUtils.hpp>
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000019
Sadik Armagan1625efc2021-06-10 18:24:34 +010020#include <doctest/doctest.h>
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000021
Finn Williamsa0de0562020-04-22 12:27:37 +010022uint32_t GetStreamMetaDataPacketSize()
23{
24 uint32_t sizeUint32 = sizeof(uint32_t);
25 uint32_t payloadSize = 0;
Matthew Sloyan371b70e2020-09-11 10:14:57 +010026 payloadSize += armnn::numeric_cast<uint32_t>(GetSoftwareInfo().size()) + 1;
27 payloadSize += armnn::numeric_cast<uint32_t>(GetHardwareVersion().size()) + 1;
28 payloadSize += armnn::numeric_cast<uint32_t>(GetSoftwareVersion().size()) + 1;
29 payloadSize += armnn::numeric_cast<uint32_t>(GetProcessName().size()) + 1;
Finn Williamsa0de0562020-04-22 12:27:37 +010030
31 // Add packetVersionEntries
Jim Flynn83d08a92020-07-09 13:48:16 +010032 payloadSize += 13 * 2 * sizeUint32;
Finn Williamsa0de0562020-04-22 12:27:37 +010033 // Add packetVersionCountSize
34 payloadSize += sizeUint32;
35
36 uint32_t headerSize = 2 * sizeUint32;
37 uint32_t bodySize = 10 * sizeUint32;
38
39 return headerSize + bodySize + payloadSize;
40}
41
Jan Eilersf78c7672020-07-01 18:09:39 +010042std::vector<BackendId> GetSuitableBackendRegistered()
43{
44 std::vector<BackendId> suitableBackends;
45 if (BackendRegistryInstance().IsBackendRegistered(GetComputeDeviceAsCString(armnn::Compute::CpuRef)))
46 {
47 suitableBackends.push_back(armnn::Compute::CpuRef);
48 }
49 if (BackendRegistryInstance().IsBackendRegistered(GetComputeDeviceAsCString(armnn::Compute::CpuAcc)))
50 {
51 suitableBackends.push_back(armnn::Compute::CpuAcc);
52 }
53 if (BackendRegistryInstance().IsBackendRegistered(GetComputeDeviceAsCString(armnn::Compute::GpuAcc)))
54 {
55 suitableBackends.push_back(armnn::Compute::GpuAcc);
56 }
57 return suitableBackends;
58}
59
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000060inline unsigned int OffsetToNextWord(unsigned int numberOfBytes)
61{
62 unsigned int uint32_t_size = sizeof(uint32_t);
63
64 unsigned int remainder = numberOfBytes % uint32_t_size;
65 if (remainder == 0)
66 {
67 return numberOfBytes;
68 }
69
70 return numberOfBytes + uint32_t_size - remainder;
71}
72
Keith Davis97da5e22020-03-05 16:25:28 +000073void VerifyTimelineHeaderBinary(const unsigned char* readableData,
74 unsigned int& offset,
75 uint32_t packetDataLength)
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000076{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010077 ARMNN_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000078
79 // Utils
80 unsigned int uint32_t_size = sizeof(uint32_t);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000081
Keith Davis97da5e22020-03-05 16:25:28 +000082 // Check the TimelineEventClassBinaryPacket header
Finn Williams0a336dc2020-05-11 15:39:58 +010083 uint32_t timelineBinaryPacketHeaderWord0 = ReadUint32(readableData, offset);
84 uint32_t timelineBinaryPacketFamily = (timelineBinaryPacketHeaderWord0 >> 26) & 0x0000003F;
85 uint32_t timelineBinaryPacketClass = (timelineBinaryPacketHeaderWord0 >> 19) & 0x0000007F;
86 uint32_t timelineBinaryPacketType = (timelineBinaryPacketHeaderWord0 >> 16) & 0x00000007;
87 uint32_t timelineBinaryPacketStreamId = (timelineBinaryPacketHeaderWord0 >> 0) & 0x00000007;
Sadik Armagan1625efc2021-06-10 18:24:34 +010088 CHECK(timelineBinaryPacketFamily == 1);
89 CHECK(timelineBinaryPacketClass == 0);
90 CHECK(timelineBinaryPacketType == 1);
91 CHECK(timelineBinaryPacketStreamId == 0);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000092 offset += uint32_t_size;
Finn Williams0a336dc2020-05-11 15:39:58 +010093 uint32_t timelineBinaryPacketHeaderWord1 = ReadUint32(readableData, offset);
94 uint32_t timelineBinaryPacketSequenceNumber = (timelineBinaryPacketHeaderWord1 >> 24) & 0x00000001;
95 uint32_t timelineBinaryPacketDataLength = (timelineBinaryPacketHeaderWord1 >> 0) & 0x00FFFFFF;
Sadik Armagan1625efc2021-06-10 18:24:34 +010096 CHECK(timelineBinaryPacketSequenceNumber == 0);
97 CHECK(timelineBinaryPacketDataLength == packetDataLength);
Keith Davis97da5e22020-03-05 16:25:28 +000098 offset += uint32_t_size;
99}
100
Jim Flynn6398a982020-05-27 17:05:21 +0100101ProfilingGuid VerifyTimelineLabelBinaryPacketData(Optional<ProfilingGuid> guid,
102 const std::string& label,
103 const unsigned char* readableData,
104 unsigned int& offset)
Keith Davis97da5e22020-03-05 16:25:28 +0000105{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100106 ARMNN_ASSERT(readableData);
Keith Davis97da5e22020-03-05 16:25:28 +0000107
108 // Utils
109 unsigned int uint32_t_size = sizeof(uint32_t);
110 unsigned int uint64_t_size = sizeof(uint64_t);
Matthew Sloyan371b70e2020-09-11 10:14:57 +0100111 unsigned int label_size = armnn::numeric_cast<unsigned int>(label.size());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000112
113 // Check the decl id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000114 uint32_t eventClassDeclId = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100115 CHECK(eventClassDeclId == 0);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000116
117 // Check the profiling GUID
118 offset += uint32_t_size;
119 uint64_t readProfilingGuid = ReadUint64(readableData, offset);
120 if (guid.has_value())
121 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100122 CHECK(readProfilingGuid == guid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000123 }
124 else
125 {
Sadik Armagan3184c902020-03-18 10:57:30 +0000126 armnn::profiling::ProfilingService profilingService;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100127 CHECK(readProfilingGuid == profilingService.GetStaticId(label));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000128 }
129
130 // Check the SWTrace label
131 offset += uint64_t_size;
132 uint32_t swTraceLabelLength = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100133 CHECK(swTraceLabelLength == label_size + 1); // Label length including the null-terminator
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000134 offset += uint32_t_size;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100135 CHECK(std::memcmp(readableData + offset, // Offset to the label in the buffer
Keith Davis97da5e22020-03-05 16:25:28 +0000136 label.data(), // The original label
137 swTraceLabelLength - 1) == 0); // The length of the label
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000138
139 // SWTrace strings are written in blocks of words, so the offset has to be updated to the next whole word
140 offset += OffsetToNextWord(swTraceLabelLength);
Jim Flynn6398a982020-05-27 17:05:21 +0100141
142 ProfilingGuid labelGuid(readProfilingGuid);
143 return labelGuid;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000144}
145
Keith Davis97da5e22020-03-05 16:25:28 +0000146void VerifyTimelineEventClassBinaryPacketData(ProfilingGuid guid,
Jim Flynn1892d212020-05-26 21:10:49 +0100147 ProfilingGuid nameGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000148 const unsigned char* readableData,
149 unsigned int& offset)
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000150{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100151 ARMNN_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000152
153 // Utils
154 unsigned int uint32_t_size = sizeof(uint32_t);
155 unsigned int uint64_t_size = sizeof(uint64_t);
156
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000157 // Check the decl id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000158 uint32_t eventClassDeclId = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100159 CHECK(eventClassDeclId == 2);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000160
161 // Check the profiling GUID
162 offset += uint32_t_size;
163 uint64_t readProfilingGuid = ReadUint64(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100164 CHECK(readProfilingGuid == guid);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000165
Jim Flynn1892d212020-05-26 21:10:49 +0100166 offset += uint64_t_size;
167 uint64_t readProfiilngNameGuid = ReadUint64(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100168 CHECK(readProfiilngNameGuid == nameGuid);
Jim Flynn1892d212020-05-26 21:10:49 +0100169
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000170 // Update the offset to allow parsing to be continued after this function returns
171 offset += uint64_t_size;
172}
173
Keith Davis97da5e22020-03-05 16:25:28 +0000174void VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType relationshipType,
Jim Flynn6398a982020-05-27 17:05:21 +0100175 Optional<ProfilingGuid> relationshipGuid,
176 Optional<ProfilingGuid> headGuid,
177 Optional<ProfilingGuid> tailGuid,
178 Optional<ProfilingGuid> attributeGuid,
179 const unsigned char* readableData,
180 unsigned int& offset)
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000181{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100182 ARMNN_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000183
184 uint32_t relationshipTypeUint = 0;
185 switch (relationshipType)
186 {
187 case ProfilingRelationshipType::RetentionLink:
188 relationshipTypeUint = 0;
189 break;
190 case ProfilingRelationshipType::ExecutionLink:
191 relationshipTypeUint = 1;
192 break;
193 case ProfilingRelationshipType::DataLink:
194 relationshipTypeUint = 2;
195 break;
196 case ProfilingRelationshipType::LabelLink:
197 relationshipTypeUint = 3;
198 break;
199 default:
Sadik Armagan1625efc2021-06-10 18:24:34 +0100200 FAIL("Unknown relationship type");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000201 }
202
203 // Utils
204 unsigned int uint32_t_size = sizeof(uint32_t);
205 unsigned int uint64_t_size = sizeof(uint64_t);
206
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000207 // Check the decl id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000208 uint32_t eventClassDeclId = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100209 CHECK(eventClassDeclId == 3);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000210
211 // Check the relationship type
212 offset += uint32_t_size;
213 uint32_t readRelationshipTypeUint = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100214 CHECK(readRelationshipTypeUint == relationshipTypeUint);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000215
216 // Check the relationship GUID
217 offset += uint32_t_size;
218 uint64_t readRelationshipGuid = ReadUint64(readableData, offset);
219 if (relationshipGuid.has_value())
220 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100221 CHECK(readRelationshipGuid == relationshipGuid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000222 }
223 else
224 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100225 CHECK(readRelationshipGuid != ProfilingGuid(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000226 }
227
Jim Flynn6398a982020-05-27 17:05:21 +0100228 // Check the head GUID of the relationship
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000229 offset += uint64_t_size;
230 uint64_t readHeadRelationshipGuid = ReadUint64(readableData, offset);
231 if (headGuid.has_value())
232 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100233 CHECK(readHeadRelationshipGuid == headGuid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000234 }
235 else
236 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100237 CHECK(readHeadRelationshipGuid != ProfilingGuid(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000238 }
239
Jim Flynn6398a982020-05-27 17:05:21 +0100240 // Check the tail GUID of the relationship
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000241 offset += uint64_t_size;
242 uint64_t readTailRelationshipGuid = ReadUint64(readableData, offset);
243 if (tailGuid.has_value())
244 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100245 CHECK(readTailRelationshipGuid == tailGuid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000246 }
247 else
248 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100249 CHECK(readTailRelationshipGuid != ProfilingGuid(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000250 }
251
Jim Flynn6398a982020-05-27 17:05:21 +0100252 // Check the attribute GUID of the relationship
Finn Williams0a336dc2020-05-11 15:39:58 +0100253 offset += uint64_t_size;
254 uint64_t readAttributeRelationshipGuid = ReadUint64(readableData, offset);
255 if (attributeGuid.has_value())
256 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100257 CHECK(readAttributeRelationshipGuid == attributeGuid.value());
Finn Williams0a336dc2020-05-11 15:39:58 +0100258 }
259 else
260 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100261 CHECK(readAttributeRelationshipGuid == ProfilingGuid(0));
Finn Williams0a336dc2020-05-11 15:39:58 +0100262 }
263
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000264 // Update the offset to allow parsing to be continued after this function returns
265 offset += uint64_t_size;
266}
267
Jim Flynn6398a982020-05-27 17:05:21 +0100268ProfilingGuid VerifyTimelineEntityBinaryPacketData(Optional<ProfilingGuid> guid,
269 const unsigned char* readableData,
270 unsigned int& offset)
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000271{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100272 ARMNN_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000273
274 // Utils
275 unsigned int uint32_t_size = sizeof(uint32_t);
276 unsigned int uint64_t_size = sizeof(uint64_t);
277
278 // Reading TimelineEntityClassBinaryPacket
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000279 // Check the decl_id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000280 uint32_t entityDeclId = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100281 CHECK(entityDeclId == 1);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000282
283 // Check the profiling GUID
284 offset += uint32_t_size;
285 uint64_t readProfilingGuid = ReadUint64(readableData, offset);
286
287 if (guid.has_value())
288 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100289 CHECK(readProfilingGuid == guid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000290 }
291 else
292 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100293 CHECK(readProfilingGuid != ProfilingGuid(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000294 }
295
296 offset += uint64_t_size;
Jim Flynn6398a982020-05-27 17:05:21 +0100297
298 ProfilingGuid entityGuid(readProfilingGuid);
299 return entityGuid;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000300}
301
Jim Flynn6398a982020-05-27 17:05:21 +0100302ProfilingGuid VerifyTimelineEventBinaryPacket(Optional<uint64_t> timestamp,
Jim Flynn1fdeb992020-07-09 07:28:37 +0100303 Optional<int> threadId,
Jim Flynn6398a982020-05-27 17:05:21 +0100304 Optional<ProfilingGuid> eventGuid,
305 const unsigned char* readableData,
306 unsigned int& offset)
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000307{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100308 ARMNN_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000309
310 // Utils
311 unsigned int uint32_t_size = sizeof(uint32_t);
312 unsigned int uint64_t_size = sizeof(uint64_t);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000313
314 // Reading TimelineEventBinaryPacket
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000315 // Check the decl_id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000316 uint32_t entityDeclId = ReadUint32(readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100317 CHECK(entityDeclId == 4);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000318
319 // Check the timestamp
320 offset += uint32_t_size;
321 uint64_t readTimestamp = ReadUint64(readableData, offset);
322 if (timestamp.has_value())
323 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100324 CHECK(readTimestamp == timestamp.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000325 }
326 else
327 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100328 CHECK(readTimestamp != 0);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000329 }
330
331 // Check the thread id
332 offset += uint64_t_size;
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100333 std::vector<uint8_t> readThreadId(ThreadIdSize, 0);
334 ReadBytes(readableData, offset, ThreadIdSize, readThreadId.data());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000335 if (threadId.has_value())
336 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100337 CHECK(readThreadId == threadId.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000338 }
339 else
340 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100341 CHECK(readThreadId == armnnUtils::Threads::GetCurrentThreadId());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000342 }
343
344 // Check the event GUID
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100345 offset += ThreadIdSize;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000346 uint64_t readEventGuid = ReadUint64(readableData, offset);
347 if (eventGuid.has_value())
348 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100349 CHECK(readEventGuid == eventGuid.value());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000350 }
351 else
352 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100353 CHECK(readEventGuid != ProfilingGuid(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000354 }
355
356 offset += uint64_t_size;
Jim Flynn6398a982020-05-27 17:05:21 +0100357
358 ProfilingGuid eventid(readEventGuid);
359 return eventid;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000360}
361
362void VerifyPostOptimisationStructureTestImpl(armnn::BackendId backendId)
363{
364 using namespace armnn;
365
366 // Create runtime in which test will run
367 armnn::IRuntime::CreationOptions options;
368 options.m_ProfilingOptions.m_EnableProfiling = true;
Keith Davis33ed2212020-03-30 10:43:41 +0100369 options.m_ProfilingOptions.m_TimelineEnabled = true;
Kevin Mayd92a6e42021-02-04 10:27:41 +0000370 armnn::RuntimeImpl runtime(options);
Keith Davis33ed2212020-03-30 10:43:41 +0100371 GetProfilingService(&runtime).ResetExternalProfilingOptions(options.m_ProfilingOptions, false);
372
373 profiling::ProfilingServiceRuntimeHelper profilingServiceHelper(GetProfilingService(&runtime));
374 profilingServiceHelper.ForceTransitionToState(ProfilingState::NotConnected);
375 profilingServiceHelper.ForceTransitionToState(ProfilingState::WaitingForAck);
376 profilingServiceHelper.ForceTransitionToState(ProfilingState::Active);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000377
378 // build up the structure of the network
379 INetworkPtr net(INetwork::Create());
380
381 // Convolution details
382 TensorInfo inputInfo({ 1, 2, 5, 1 }, DataType::Float32);
Keith Davis97da5e22020-03-05 16:25:28 +0000383 TensorInfo weightInfo({ 3, 2, 3, 1 }, DataType::Float32);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000384 TensorInfo biasInfo({ 3 }, DataType::Float32);
Keith Davis97da5e22020-03-05 16:25:28 +0000385 TensorInfo outputInfo({ 1, 3, 7, 1 }, DataType::Float32);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000386 std::vector<float> weightsData{
Keith Davis97da5e22020-03-05 16:25:28 +0000387 1.0f, 0.0f, 0.0f,
388 0.0f, 2.0f, -1.5f,
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000389
Keith Davis97da5e22020-03-05 16:25:28 +0000390 0.0f, 0.0f, 0.0f,
391 0.2f, 0.2f, 0.2f,
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000392
Keith Davis97da5e22020-03-05 16:25:28 +0000393 0.5f, 0.0f, 0.5f,
394 0.0f, -1.0f, 0.0f
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000395 };
396 ConstTensor weights(weightInfo, weightsData);
397
398 Optional<ConstTensor> optionalBiases;
399 std::vector<float> biasesData{ 1.0f, 0.0f, 0.0f };
400 ConstTensor biases(biasInfo, biasesData);
401 optionalBiases = Optional<ConstTensor>(biases);
402
403 // Input layer
404 IConnectableLayer* input = net->AddInputLayer(0, "input");
405
406 // Convolution2d layer
407 Convolution2dDescriptor conv2dDesc;
Keith Davis97da5e22020-03-05 16:25:28 +0000408 conv2dDesc.m_StrideX = 1;
409 conv2dDesc.m_StrideY = 1;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000410 conv2dDesc.m_PadLeft = 0;
411 conv2dDesc.m_PadRight = 0;
412 conv2dDesc.m_PadTop = 2;
413 conv2dDesc.m_PadBottom = 2;
414 conv2dDesc.m_BiasEnabled = true;
415 IConnectableLayer* conv2d = net->AddConvolution2dLayer(conv2dDesc, weights, optionalBiases);
416
Mike Kelly07810fc2020-11-12 10:58:48 +0000417 // Abs layer
418 armnn::ElementwiseUnaryDescriptor absDesc;
419 armnn::IConnectableLayer* const abs = net->AddElementwiseUnaryLayer(absDesc, "abs");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000420
421 // Output layer
422 IConnectableLayer* output = net->AddOutputLayer(0, "output");
423
424 input->GetOutputSlot(0).Connect(conv2d->GetInputSlot(0));
Mike Kelly07810fc2020-11-12 10:58:48 +0000425 conv2d->GetOutputSlot(0).Connect(abs->GetInputSlot(0));
426 abs->GetOutputSlot(0).Connect(output->GetInputSlot(0));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000427
428 input->GetOutputSlot(0).SetTensorInfo(inputInfo);
429 conv2d->GetOutputSlot(0).SetTensorInfo(outputInfo);
Mike Kelly07810fc2020-11-12 10:58:48 +0000430 abs->GetOutputSlot(0).SetTensorInfo(outputInfo);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000431
432 // optimize the network
433 std::vector<armnn::BackendId> backends = { backendId };
Sadik Armagan3184c902020-03-18 10:57:30 +0000434 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime.GetDeviceSpec());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000435
436 ProfilingGuid optNetGuid = optNet->GetGuid();
437
438 // Load it into the runtime. It should success.
439 armnn::NetworkId netId;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100440 CHECK(runtime.LoadNetwork(netId, std::move(optNet)) == Status::Success);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000441
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000442 profiling::BufferManager& bufferManager = profilingServiceHelper.GetProfilingBufferManager();
443 auto readableBuffer = bufferManager.GetReadableBuffer();
444
Jim Flynnf7713212020-07-14 09:50:59 +0100445 // Profiling is enabled, the post-optimisation structure should be created
Sadik Armagan1625efc2021-06-10 18:24:34 +0100446 CHECK(readableBuffer != nullptr);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000447 unsigned int size = readableBuffer->GetSize();
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000448
449 const unsigned char* readableData = readableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100450 CHECK(readableData != nullptr);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000451
452 unsigned int offset = 0;
453
Keith Davis97da5e22020-03-05 16:25:28 +0000454 // Verify Header
Jim Flynnf7713212020-07-14 09:50:59 +0100455 VerifyTimelineHeaderBinary(readableData, offset, size - 8);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100456 MESSAGE("HEADER OK");
Keith Davis97da5e22020-03-05 16:25:28 +0000457
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000458 // Post-optimisation network
459 // Network entity
Keith Davis97da5e22020-03-05 16:25:28 +0000460 VerifyTimelineEntityBinaryPacketData(optNetGuid, readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100461 MESSAGE("NETWORK ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000462
463 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000464 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
465 EmptyOptional(),
466 optNetGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100467 LabelsAndEventClasses::NETWORK_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000468 LabelsAndEventClasses::TYPE_GUID,
469 readableData,
470 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100471 MESSAGE("NETWORK TYPE RELATIONSHIP OK");
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);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100479 MESSAGE("NETWORK START OF LIFE EVENT OK");
Jim Flynnf7713212020-07-14 09:50:59 +0100480
481 // Network - START OF LIFE event relationship
482 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
483 EmptyOptional(),
484 optNetGuid,
485 networkSolEventGuid,
486 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
487 readableData,
488 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100489 MESSAGE("NETWORK START OF LIFE RELATIONSHIP OK");
Jim Flynnf7713212020-07-14 09:50:59 +0100490
491 // Process ID Label
492 int processID = armnnUtils::Processes::GetCurrentId();
493 std::stringstream ss;
494 ss << processID;
495 std::string processIdLabel = ss.str();
496 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), processIdLabel, readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100497 MESSAGE("PROCESS ID LABEL OK");
Jim Flynnf7713212020-07-14 09:50:59 +0100498
499 // Entity - Process ID relationship
500 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
501 EmptyOptional(),
502 optNetGuid,
503 EmptyOptional(),
504 LabelsAndEventClasses::PROCESS_ID_GUID,
505 readableData,
506 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100507 MESSAGE("NETWORK PROCESS ID RELATIONSHIP OK");
Jim Flynnf7713212020-07-14 09:50:59 +0100508
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000509 // Input layer
510 // Input layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000511 VerifyTimelineEntityBinaryPacketData(input->GetGuid(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100512 MESSAGE("INPUT ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000513
514 // Name Entity
Jim Flynn6398a982020-05-27 17:05:21 +0100515 ProfilingGuid inputLabelGuid = VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "input", readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100516 MESSAGE("INPUT NAME LABEL OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000517
518 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000519 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
520 EmptyOptional(),
521 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100522 inputLabelGuid,
Finn Williams0a336dc2020-05-11 15:39:58 +0100523 LabelsAndEventClasses::NAME_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000524 readableData,
525 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100526 MESSAGE("INPUT NAME RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000527
528 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000529 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
530 EmptyOptional(),
531 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100532 LabelsAndEventClasses::LAYER_GUID,
Finn Williams0a336dc2020-05-11 15:39:58 +0100533 LabelsAndEventClasses::TYPE_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000534 readableData,
535 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100536 MESSAGE("INPUT TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000537
538 // Network - Input layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000539 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
540 EmptyOptional(),
541 optNetGuid,
542 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100543 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000544 readableData,
545 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100546 MESSAGE("NETWORK - INPUT CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000547
548 // Conv2d layer
549 // Conv2d layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000550 VerifyTimelineEntityBinaryPacketData(conv2d->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000551
552 // Name entity
Jim Flynn6398a982020-05-27 17:05:21 +0100553 ProfilingGuid conv2dNameLabelGuid = VerifyTimelineLabelBinaryPacketData(
554 EmptyOptional(), "<Unnamed>", readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100555 MESSAGE("CONV2D NAME LABEL OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000556
557 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000558 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
559 EmptyOptional(),
560 conv2d->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100561 conv2dNameLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000562 LabelsAndEventClasses::NAME_GUID,
563 readableData,
564 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100565 MESSAGE("CONV2D NAME RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000566
567 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000568 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
569 EmptyOptional(),
570 conv2d->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100571 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000572 LabelsAndEventClasses::TYPE_GUID,
573 readableData,
574 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100575 MESSAGE("CONV2D TYPE RELATIONSHIP OK");
Finn Williams0a336dc2020-05-11 15:39:58 +0100576
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000577 // Network - Conv2d layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000578 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
579 EmptyOptional(),
580 optNetGuid,
581 conv2d->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100582 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000583 readableData,
584 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100585 MESSAGE("NETWORK - CONV2D CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000586
587 // Input layer - Conv2d layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000588 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
589 EmptyOptional(),
590 input->GetGuid(),
591 conv2d->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000592 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000593 readableData,
594 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100595 MESSAGE("INPUT - CONV2D LAYER CONNECTION OK");
Finn Williams0a336dc2020-05-11 15:39:58 +0100596
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000597 // Conv2d workload
598 // Conv2d workload entity
Jim Flynn6398a982020-05-27 17:05:21 +0100599 ProfilingGuid conv2DWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100600 MESSAGE("CONV2D WORKLOAD ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000601
602 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000603 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
604 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100605 conv2DWorkloadGuid,
606 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000607 LabelsAndEventClasses::TYPE_GUID,
608 readableData,
609 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100610 MESSAGE("CONV2D WORKLOAD TYPE RELATIONSHIP OK");
Finn Williams0a336dc2020-05-11 15:39:58 +0100611
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000612 // BackendId entity
Jim Flynn6398a982020-05-27 17:05:21 +0100613 ProfilingGuid backendIdLabelGuid = VerifyTimelineLabelBinaryPacketData(
614 EmptyOptional(), backendId.Get(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000615
616 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000617 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
618 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100619 conv2DWorkloadGuid,
620 backendIdLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000621 LabelsAndEventClasses::BACKENDID_GUID,
622 readableData,
623 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100624 MESSAGE("CONV2D WORKLOAD BACKEND ID RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000625
Finn Williams0a336dc2020-05-11 15:39:58 +0100626
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000627 // Conv2d layer - Conv2d workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000628 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
629 EmptyOptional(),
630 conv2d->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100631 conv2DWorkloadGuid,
632 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000633 readableData,
634 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100635 MESSAGE("CONV2D LAYER - WORKLOAD CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000636
Mike Kelly07810fc2020-11-12 10:58:48 +0000637 // Abs layer
638 // Abs layer entity
639 VerifyTimelineEntityBinaryPacketData(abs->GetGuid(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100640 MESSAGE("ABS ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000641
642 // Name entity
Mike Kelly07810fc2020-11-12 10:58:48 +0000643 ProfilingGuid absLabelGuid = VerifyTimelineLabelBinaryPacketData(
644 EmptyOptional(), "abs", readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100645 MESSAGE("ABS NAME LABEL OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000646
647 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000648 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
649 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000650 abs->GetGuid(),
651 absLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000652 LabelsAndEventClasses::NAME_GUID,
653 readableData,
654 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100655 MESSAGE("ABS LAYER - NAME RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000656
657 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000658 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
659 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000660 abs->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100661 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000662 LabelsAndEventClasses::TYPE_GUID,
663 readableData,
664 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100665 MESSAGE("ABS LAYER TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000666
Mike Kelly07810fc2020-11-12 10:58:48 +0000667 // Network - Abs layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000668 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
669 EmptyOptional(),
670 optNetGuid,
Mike Kelly07810fc2020-11-12 10:58:48 +0000671 abs->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100672 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000673 readableData,
674 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100675 MESSAGE("NETWORK - ABS LAYER CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000676
Mike Kelly07810fc2020-11-12 10:58:48 +0000677 // Conv2d layer - Abs layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000678 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
679 EmptyOptional(),
680 conv2d->GetGuid(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000681 abs->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000682 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000683 readableData,
684 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100685 MESSAGE("CONV2D LAYER - ABS LAYER CONNECTION OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000686
Mike Kelly07810fc2020-11-12 10:58:48 +0000687 // Abs workload
688 // Abs workload entity
689 ProfilingGuid absWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100690 MESSAGE("ABS WORKLOAD ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000691
692 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000693 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
694 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000695 absWorkloadGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100696 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000697 LabelsAndEventClasses::TYPE_GUID,
698 readableData,
699 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100700 MESSAGE("ABS WORKLAD TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000701
702 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000703 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), backendId.Get(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100704 MESSAGE("BACKEND ID LABEL OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000705
706 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000707 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
708 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000709 absWorkloadGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100710 backendIdLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000711 LabelsAndEventClasses::BACKENDID_GUID,
712 readableData,
713 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100714 MESSAGE("ABS WORKLOAD BACKEND ID RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000715
Mike Kelly07810fc2020-11-12 10:58:48 +0000716 // Abs layer - Abs workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000717 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
718 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000719 abs->GetGuid(),
720 absWorkloadGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100721 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000722 readableData,
723 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100724 MESSAGE("ABS LAYER - WORKLOAD CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000725
726 // Output layer
727 // Output layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000728 VerifyTimelineEntityBinaryPacketData(output->GetGuid(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100729 MESSAGE("OUTPUT LAYER ENTITY OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000730
731 // Name entity
Jim Flynn6398a982020-05-27 17:05:21 +0100732 ProfilingGuid outputLabelGuid = VerifyTimelineLabelBinaryPacketData(
733 EmptyOptional(), "output", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000734
735 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000736 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
737 EmptyOptional(),
738 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100739 outputLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000740 LabelsAndEventClasses::NAME_GUID,
741 readableData,
742 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100743 MESSAGE("OUTPUT LAYER NAME RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000744
745 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000746 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
747 EmptyOptional(),
748 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100749 LabelsAndEventClasses::LAYER_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000750 LabelsAndEventClasses::TYPE_GUID,
751 readableData,
752 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100753 MESSAGE("OUTPUT LAYER TYPE RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000754
755 // Network - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000756 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
757 EmptyOptional(),
758 optNetGuid,
759 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100760 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000761 readableData,
762 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100763 MESSAGE("NETWORK - OUTPUT LAYER CHILD RELATIONSHIP OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000764
Mike Kelly07810fc2020-11-12 10:58:48 +0000765 // Abs layer - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000766 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
767 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +0000768 abs->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000769 output->GetGuid(),
Keith Davis97da5e22020-03-05 16:25:28 +0000770 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000771 readableData,
772 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100773 MESSAGE("ABS LAYER - OUTPUT LAYER CONNECTION OK");
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000774
775 bufferManager.MarkRead(readableBuffer);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000776
777 // Creates structures for input & output.
778 std::vector<float> inputData(inputInfo.GetNumElements());
779 std::vector<float> outputData(outputInfo.GetNumElements());
780
781 InputTensors inputTensors
Keith Davis97da5e22020-03-05 16:25:28 +0000782 {
Sadik Armagan3184c902020-03-18 10:57:30 +0000783 {0, ConstTensor(runtime.GetInputTensorInfo(netId, 0), inputData.data())}
Keith Davis97da5e22020-03-05 16:25:28 +0000784 };
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000785 OutputTensors outputTensors
Keith Davis97da5e22020-03-05 16:25:28 +0000786 {
Sadik Armagan3184c902020-03-18 10:57:30 +0000787 {0, Tensor(runtime.GetOutputTensorInfo(netId, 0), outputData.data())}
Keith Davis97da5e22020-03-05 16:25:28 +0000788 };
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000789
790 // Does the inference.
Sadik Armagan3184c902020-03-18 10:57:30 +0000791 runtime.EnqueueWorkload(netId, inputTensors, outputTensors);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000792
Finn Williamsb6a402f2020-03-24 13:46:22 +0000793 // Get readable buffer for input workload
794 auto inputReadableBuffer = bufferManager.GetReadableBuffer();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100795 CHECK(inputReadableBuffer != nullptr);
David Monahan6198fe02019-12-02 08:35:43 +0000796
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000797 // Get readable buffer for output workload
798 auto outputReadableBuffer = bufferManager.GetReadableBuffer();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100799 CHECK(outputReadableBuffer != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000800
Finn Williamsb6a402f2020-03-24 13:46:22 +0000801 // Get readable buffer for inference timeline
802 auto inferenceReadableBuffer = bufferManager.GetReadableBuffer();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100803 CHECK(inferenceReadableBuffer != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000804
805 // Validate input workload data
806 size = inputReadableBuffer->GetSize();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100807 CHECK(size == 164);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000808
809 readableData = inputReadableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100810 CHECK(readableData != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000811
812 offset = 0;
813
Keith Davis97da5e22020-03-05 16:25:28 +0000814 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100815 VerifyTimelineHeaderBinary(readableData, offset, 156);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100816 MESSAGE("INPUT WORKLOAD HEADER OK");
Keith Davis97da5e22020-03-05 16:25:28 +0000817
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000818 // Input workload
819 // Input workload entity
Jim Flynn6398a982020-05-27 17:05:21 +0100820 ProfilingGuid inputWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100821 MESSAGE("INPUT WORKLOAD TYPE RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000822
823 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000824 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
825 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100826 inputWorkloadGuid,
827 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000828 LabelsAndEventClasses::TYPE_GUID,
829 readableData,
830 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100831 MESSAGE("INPUT WORKLOAD TYPE RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000832
833 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000834 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), backendId.Get(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000835
836 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000837 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
838 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100839 inputWorkloadGuid,
840 backendIdLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000841 LabelsAndEventClasses::BACKENDID_GUID,
842 readableData,
843 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100844 MESSAGE("INPUT WORKLOAD BACKEND ID RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000845
846 // Input layer - Input workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000847 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
848 EmptyOptional(),
849 input->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100850 inputWorkloadGuid,
851 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000852 readableData,
853 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100854 MESSAGE("INPUT LAYER - INPUT WORKLOAD CHILD RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000855
856 bufferManager.MarkRead(inputReadableBuffer);
857
858 // Validate output workload data
859 size = outputReadableBuffer->GetSize();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100860 CHECK(size == 164);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000861
862 readableData = outputReadableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100863 CHECK(readableData != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000864
865 offset = 0;
866
Keith Davis97da5e22020-03-05 16:25:28 +0000867 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100868 VerifyTimelineHeaderBinary(readableData, offset, 156);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100869 MESSAGE("OUTPUT WORKLOAD HEADER OK");
Keith Davis97da5e22020-03-05 16:25:28 +0000870
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000871 // Output workload
872 // Output workload entity
Jim Flynn6398a982020-05-27 17:05:21 +0100873 ProfilingGuid outputWorkloadGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100874 MESSAGE("OUTPUT WORKLOAD ENTITY OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000875
876 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000877 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
878 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100879 outputWorkloadGuid,
880 LabelsAndEventClasses::WORKLOAD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000881 LabelsAndEventClasses::TYPE_GUID,
882 readableData,
883 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100884 MESSAGE("OUTPUT WORKLOAD TYPE RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000885
886 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000887 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), backendId.Get(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100888 MESSAGE("OUTPUT WORKLOAD LABEL OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000889
890 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000891 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
892 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100893 outputWorkloadGuid,
894 backendIdLabelGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000895 LabelsAndEventClasses::BACKENDID_GUID,
896 readableData,
897 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100898 MESSAGE("OUTPUT WORKLOAD BACKEND ID RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000899
900 // Output layer - Output workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000901 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
902 EmptyOptional(),
903 output->GetGuid(),
Jim Flynn6398a982020-05-27 17:05:21 +0100904 outputWorkloadGuid,
905 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000906 readableData,
907 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100908 MESSAGE("OUTPUT LAYER - OUTPUT WORKLOAD CHILD RELATIONSHIP OK");
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000909
910 bufferManager.MarkRead(outputReadableBuffer);
David Monahan6198fe02019-12-02 08:35:43 +0000911
912 // Validate inference data
913 size = inferenceReadableBuffer->GetSize();
Jan Eilersa10e2a22020-03-26 12:04:54 +0000914
Sadik Armagan1625efc2021-06-10 18:24:34 +0100915 CHECK(size == 1228 + 10 * ThreadIdSize);
David Monahan6198fe02019-12-02 08:35:43 +0000916
917 readableData = inferenceReadableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100918 CHECK(readableData != nullptr);
David Monahan6198fe02019-12-02 08:35:43 +0000919
920 offset = 0;
921
Keith Davis97da5e22020-03-05 16:25:28 +0000922 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100923 VerifyTimelineHeaderBinary(readableData, offset, 1220 + 10 * ThreadIdSize);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100924 MESSAGE("INFERENCE HEADER OK");
Keith Davis97da5e22020-03-05 16:25:28 +0000925
David Monahan6198fe02019-12-02 08:35:43 +0000926 // Inference timeline trace
927 // Inference entity
Jim Flynn6398a982020-05-27 17:05:21 +0100928 ProfilingGuid inferenceGuid = VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100929 MESSAGE("INFERENCE ENTITY OK");
David Monahan6198fe02019-12-02 08:35:43 +0000930
931 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000932 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
933 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100934 inferenceGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000935 LabelsAndEventClasses::INFERENCE_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000936 LabelsAndEventClasses::TYPE_GUID,
937 readableData,
938 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100939 MESSAGE("INFERENCE TYPE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000940
941 // Network - Inference relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000942 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
943 EmptyOptional(),
944 optNetGuid,
Jim Flynn6398a982020-05-27 17:05:21 +0100945 inferenceGuid,
946 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000947 readableData,
948 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100949 MESSAGE("NETWORK - INFERENCE EXECUTION_OF RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000950
951 // Start Inference life
952 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +0100953 ProfilingGuid inferenceEventGuid = VerifyTimelineEventBinaryPacket(
954 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100955 MESSAGE("INFERENCE START OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +0000956
957 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000958 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
959 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100960 inferenceGuid,
961 inferenceEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000962 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
963 readableData,
964 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100965 MESSAGE("INFERENCE START OF LIFE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000966
967 // Execution
968 // Input workload execution
969 // Input workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +0100970 ProfilingGuid inputWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
971 EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100972 MESSAGE("INPUT WORKLOAD EXECUTION ENTITY OK");
David Monahan6198fe02019-12-02 08:35:43 +0000973
974 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000975 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
976 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100977 inputWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000978 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000979 LabelsAndEventClasses::TYPE_GUID,
980 readableData,
981 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100982 MESSAGE("INPUT WORKLOAD EXECUTION TYPE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000983
984 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000985 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
986 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100987 inferenceGuid,
988 inputWorkloadExecutionGuid,
989 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000990 readableData,
991 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100992 MESSAGE("INPUT WORKLOAD - INPUT WORKLOAD EXECUTION RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +0000993
994 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000995 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
996 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +0100997 inputWorkloadGuid,
998 inputWorkloadExecutionGuid,
999 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001000 readableData,
1001 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001002 MESSAGE("INPUT WORKLOAD - INPUT WORKLOAD EXECUTION RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001003
1004 // Start Input workload execution life
1005 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001006 ProfilingGuid inputWorkloadExecutionSOLEventId = VerifyTimelineEventBinaryPacket(
1007 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001008 MESSAGE("INPUT WORKLOAD EXECUTION - START OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001009
1010 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001011 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1012 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001013 inputWorkloadExecutionGuid,
1014 inputWorkloadExecutionSOLEventId,
Keith Davis97da5e22020-03-05 16:25:28 +00001015 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1016 readableData,
1017 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001018 MESSAGE("INPUT WORKLOAD EXECUTION - START OF LIFE EVENT RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001019
1020 // End of Input workload execution life
1021 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001022 ProfilingGuid inputWorkloadExecutionEOLEventId = VerifyTimelineEventBinaryPacket(
1023 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001024 MESSAGE("INPUT WORKLOAD EXECUTION - END OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001025
1026 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001027 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1028 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001029 inputWorkloadExecutionGuid,
1030 inputWorkloadExecutionEOLEventId,
Keith Davis97da5e22020-03-05 16:25:28 +00001031 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1032 readableData,
1033 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001034 MESSAGE("INPUT WORKLOAD EXECUTION - END OF LIFE EVENT RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001035
1036 // Conv2d workload execution
1037 // Conv2d workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +01001038 ProfilingGuid conv2DWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
1039 EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001040 MESSAGE("CONV2D WORKLOAD EXECUTION ENTITY OK");
David Monahan6198fe02019-12-02 08:35:43 +00001041
1042 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001043 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1044 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001045 conv2DWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001046 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001047 LabelsAndEventClasses::TYPE_GUID,
1048 readableData,
1049 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001050 MESSAGE("CONV2D WORKLOAD EXECUTION TYPE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001051
1052 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001053 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1054 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001055 inferenceGuid,
1056 conv2DWorkloadExecutionGuid,
1057 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001058 readableData,
1059 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001060 MESSAGE("INFERENCE - CONV2D WORKLOAD EXECUTION CHILD RELATIONSHIP OK");
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(),
Jim Flynn6398a982020-05-27 17:05:21 +01001065 conv2DWorkloadGuid,
1066 conv2DWorkloadExecutionGuid,
1067 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001068 readableData,
1069 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001070 MESSAGE("CONV2D WORKLOAD - CONV2D WORKLOAD EXECUTION RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001071
1072 // Start Conv2d workload execution life
1073 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001074 ProfilingGuid conv2DWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
1075 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001076 MESSAGE("CONV2D WORKLOAD EXECUTION START OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001077
1078 // Conv2d workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001079 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1080 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001081 conv2DWorkloadExecutionGuid,
1082 conv2DWorkloadExecutionSOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001083 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1084 readableData,
1085 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001086 MESSAGE("CONV2D WORKLOAD EXECUTION START OF LIFE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001087
1088 // End of Conv2d workload execution life
1089 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001090 ProfilingGuid conv2DWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
1091 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001092 MESSAGE("CONV2D WORKLOAD EXECUTION END OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001093
1094 // Conv2d workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001095 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1096 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001097 conv2DWorkloadExecutionGuid,
1098 conv2DWorkloadExecutionEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001099 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1100 readableData,
1101 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001102 MESSAGE("CONV2D WORKLOAD EXECUTION END OF LIFE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001103
Mike Kelly07810fc2020-11-12 10:58:48 +00001104 // Abs workload execution
1105 // Abs workload execution entity
1106 ProfilingGuid absWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
Jim Flynn6398a982020-05-27 17:05:21 +01001107 EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001108 MESSAGE("ABS WORKLOAD EXECUTION ENTITY OK");
David Monahan6198fe02019-12-02 08:35:43 +00001109
1110 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001111 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1112 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +00001113 absWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001114 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001115 LabelsAndEventClasses::TYPE_GUID,
1116 readableData,
1117 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001118 MESSAGE("ABS WORKLOAD EXECUTION TYPE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001119
1120 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001121 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1122 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001123 inferenceGuid,
Mike Kelly07810fc2020-11-12 10:58:48 +00001124 absWorkloadExecutionGuid,
Jim Flynn6398a982020-05-27 17:05:21 +01001125 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001126 readableData,
1127 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001128 MESSAGE("INFERENCE - ABS WORKLOAD EXECUTION CHILD RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001129
1130 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001131 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1132 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +00001133 absWorkloadGuid,
1134 absWorkloadExecutionGuid,
Jim Flynn6398a982020-05-27 17:05:21 +01001135 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001136 readableData,
1137 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001138 MESSAGE("ABS WORKLOAD - ABS WORKLOAD EXECUTION RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001139
Mike Kelly07810fc2020-11-12 10:58:48 +00001140 // Start Abs workload execution life
David Monahan6198fe02019-12-02 08:35:43 +00001141 // Event packet - timeline, threadId, eventGuid
Mike Kelly07810fc2020-11-12 10:58:48 +00001142 ProfilingGuid absWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
Jim Flynn6398a982020-05-27 17:05:21 +01001143 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001144 MESSAGE("ABS WORKLOAD EXECUTION START OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001145
Mike Kelly07810fc2020-11-12 10:58:48 +00001146 // Abs workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001147 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1148 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +00001149 absWorkloadExecutionGuid,
1150 absWorkloadExecutionSOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001151 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1152 readableData,
1153 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001154 MESSAGE("ABS WORKLOAD EXECUTION START OF LIFE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001155
Mike Kelly07810fc2020-11-12 10:58:48 +00001156 // End of Abs workload execution life
David Monahan6198fe02019-12-02 08:35:43 +00001157 // Event packet - timeline, threadId, eventGuid
Mike Kelly07810fc2020-11-12 10:58:48 +00001158 ProfilingGuid absWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
Jim Flynn6398a982020-05-27 17:05:21 +01001159 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001160 MESSAGE("ABS WORKLOAD EXECUTION END OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001161
Mike Kelly07810fc2020-11-12 10:58:48 +00001162 // Abs workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001163 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1164 EmptyOptional(),
Mike Kelly07810fc2020-11-12 10:58:48 +00001165 absWorkloadExecutionGuid,
1166 absWorkloadExecutionEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001167 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1168 readableData,
1169 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001170 MESSAGE("ABS WORKLOAD EXECUTION END OF LIFE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001171
1172 // Output workload execution
1173 // Output workload execution entity
Jim Flynn6398a982020-05-27 17:05:21 +01001174 ProfilingGuid outputWorkloadExecutionGuid = VerifyTimelineEntityBinaryPacketData(
1175 EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001176 MESSAGE("OUTPUT WORKLOAD EXECUTION ENTITY OK");
David Monahan6198fe02019-12-02 08:35:43 +00001177
1178 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001179 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1180 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001181 outputWorkloadExecutionGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001182 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001183 LabelsAndEventClasses::TYPE_GUID,
1184 readableData,
1185 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001186 MESSAGE("OUTPUT WORKLOAD EXECUTION TYPE RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001187
1188 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001189 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1190 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001191 inferenceGuid,
1192 outputWorkloadExecutionGuid,
1193 LabelsAndEventClasses::CHILD_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001194 readableData,
1195 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001196 MESSAGE("INFERENCE - OUTPUT WORKLOAD EXECUTION CHILD RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001197
1198 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001199 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1200 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001201 outputWorkloadGuid,
1202 outputWorkloadExecutionGuid,
1203 LabelsAndEventClasses::EXECUTION_OF_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001204 readableData,
1205 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001206 MESSAGE("OUTPUT WORKLOAD - OUTPUT WORKLOAD EXECUTION EXECUTION_OF RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001207
1208 // Start Output workload execution life
1209 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001210 ProfilingGuid outputWorkloadExecutionSOLEventGuid = VerifyTimelineEventBinaryPacket(
1211 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001212 MESSAGE("OUTPUT WORKLOAD EXECUTION START OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001213
1214 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001215 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1216 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001217 outputWorkloadExecutionGuid,
1218 outputWorkloadExecutionSOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001219 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1220 readableData,
1221 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001222 MESSAGE("OUTPUT WORKLOAD EXECUTION - START OF LIFE EVENT RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001223
1224 // End of Normalize workload execution life
1225 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001226 ProfilingGuid outputWorkloadExecutionEOLEventGuid = VerifyTimelineEventBinaryPacket(
1227 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001228 MESSAGE("OUTPUT WORKLOAD EXECUTION END OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001229
1230 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001231 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1232 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001233 outputWorkloadExecutionGuid,
1234 outputWorkloadExecutionEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001235 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1236 readableData,
1237 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001238 MESSAGE("OUTPUT WORKLOAD EXECUTION - END OF LIFE EVENT RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001239
1240 // End of Inference life
1241 // Event packet - timeline, threadId, eventGuid
Jim Flynn6398a982020-05-27 17:05:21 +01001242 ProfilingGuid inferenceEOLEventGuid = VerifyTimelineEventBinaryPacket(
1243 EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001244 MESSAGE("INFERENCE END OF LIFE EVENT OK");
David Monahan6198fe02019-12-02 08:35:43 +00001245
1246 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001247 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1248 EmptyOptional(),
Jim Flynn6398a982020-05-27 17:05:21 +01001249 inferenceGuid,
1250 inferenceEOLEventGuid,
Keith Davis97da5e22020-03-05 16:25:28 +00001251 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1252 readableData,
1253 offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001254 MESSAGE("INFERENCE - END OF LIFE EVENT RELATIONSHIP OK");
David Monahan6198fe02019-12-02 08:35:43 +00001255
1256 bufferManager.MarkRead(inferenceReadableBuffer);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +00001257}
Jim Flynn6398a982020-05-27 17:05:21 +01001258
Jim Flynn6398a982020-05-27 17:05:21 +01001259bool CompareOutput(std::vector<std::string> output, std::vector<std::string> expectedOutput)
1260{
1261 if (output.size() != expectedOutput.size())
1262 {
1263 std::cerr << "output has [" << output.size() << "] lines, expected was ["
1264 << expectedOutput.size() << "] lines" << std::endl;
1265 std::cerr << std::endl << "actual" << std::endl << std::endl;
1266 for (auto line : output)
1267 {
1268 std::cerr << line << std::endl;
1269 }
1270 std::cerr << std::endl << "expected" << std::endl << std::endl;
1271 for (auto line : expectedOutput)
1272 {
1273 std::cerr << line << std::endl;
1274 }
1275 return false;
1276 }
1277 bool bRet = true;
1278 for (unsigned long i = 0; i < output.size(); ++i)
1279 {
1280 if (output[i] != expectedOutput[i])
1281 {
1282 bRet = false;
1283 std::cerr << i << ": actual [" << output[i] << "] expected [" << expectedOutput[i] << "]" << std::endl;
1284 }
1285 }
1286 return bRet;
1287}