blob: ff256047be7088314b558c7ab4b607cafb9a467d [file] [log] [blame]
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +00001//
2// Copyright © 2019 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "ProfilingTestUtils.hpp"
7#include "ProfilingUtils.hpp"
8
9#include <armnn/Descriptors.hpp>
10#include <LabelsAndEventClasses.hpp>
11#include <ProfilingService.hpp>
Sadik Armaganea41b572020-03-19 18:16:46 +000012
13#include <test/TestUtils.hpp>
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000014
15#include <boost/test/unit_test.hpp>
16
Finn Williamsa0de0562020-04-22 12:27:37 +010017uint32_t GetStreamMetaDataPacketSize()
18{
19 uint32_t sizeUint32 = sizeof(uint32_t);
20 uint32_t payloadSize = 0;
21 payloadSize += boost::numeric_cast<uint32_t>(GetSoftwareInfo().size()) + 1;
22 payloadSize += boost::numeric_cast<uint32_t>(GetHardwareVersion().size()) + 1;
23 payloadSize += boost::numeric_cast<uint32_t>(GetSoftwareVersion().size()) + 1;
24 payloadSize += boost::numeric_cast<uint32_t>(GetProcessName().size()) + 1;
25
26 // Add packetVersionEntries
27 payloadSize += 6 * 2 * sizeUint32;
28 // Add packetVersionCountSize
29 payloadSize += sizeUint32;
30
31 uint32_t headerSize = 2 * sizeUint32;
32 uint32_t bodySize = 10 * sizeUint32;
33
34 return headerSize + bodySize + payloadSize;
35}
36
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000037inline unsigned int OffsetToNextWord(unsigned int numberOfBytes)
38{
39 unsigned int uint32_t_size = sizeof(uint32_t);
40
41 unsigned int remainder = numberOfBytes % uint32_t_size;
42 if (remainder == 0)
43 {
44 return numberOfBytes;
45 }
46
47 return numberOfBytes + uint32_t_size - remainder;
48}
49
Keith Davis97da5e22020-03-05 16:25:28 +000050void VerifyTimelineHeaderBinary(const unsigned char* readableData,
51 unsigned int& offset,
52 uint32_t packetDataLength)
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000053{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010054 ARMNN_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000055
56 // Utils
57 unsigned int uint32_t_size = sizeof(uint32_t);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000058
Keith Davis97da5e22020-03-05 16:25:28 +000059 // Check the TimelineEventClassBinaryPacket header
Finn Williams0a336dc2020-05-11 15:39:58 +010060 uint32_t timelineBinaryPacketHeaderWord0 = ReadUint32(readableData, offset);
61 uint32_t timelineBinaryPacketFamily = (timelineBinaryPacketHeaderWord0 >> 26) & 0x0000003F;
62 uint32_t timelineBinaryPacketClass = (timelineBinaryPacketHeaderWord0 >> 19) & 0x0000007F;
63 uint32_t timelineBinaryPacketType = (timelineBinaryPacketHeaderWord0 >> 16) & 0x00000007;
64 uint32_t timelineBinaryPacketStreamId = (timelineBinaryPacketHeaderWord0 >> 0) & 0x00000007;
65 BOOST_CHECK(timelineBinaryPacketFamily == 1);
66 BOOST_CHECK(timelineBinaryPacketClass == 0);
67 BOOST_CHECK(timelineBinaryPacketType == 1);
68 BOOST_CHECK(timelineBinaryPacketStreamId == 0);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000069 offset += uint32_t_size;
Finn Williams0a336dc2020-05-11 15:39:58 +010070 uint32_t timelineBinaryPacketHeaderWord1 = ReadUint32(readableData, offset);
71 uint32_t timelineBinaryPacketSequenceNumber = (timelineBinaryPacketHeaderWord1 >> 24) & 0x00000001;
72 uint32_t timelineBinaryPacketDataLength = (timelineBinaryPacketHeaderWord1 >> 0) & 0x00FFFFFF;
73 BOOST_CHECK(timelineBinaryPacketSequenceNumber == 0);
74 BOOST_CHECK(timelineBinaryPacketDataLength == packetDataLength);
Keith Davis97da5e22020-03-05 16:25:28 +000075 offset += uint32_t_size;
76}
77
78void VerifyTimelineLabelBinaryPacketData(Optional<ProfilingGuid> guid,
79 const std::string& label,
80 const unsigned char* readableData,
81 unsigned int& offset)
82{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010083 ARMNN_ASSERT(readableData);
Keith Davis97da5e22020-03-05 16:25:28 +000084
85 // Utils
86 unsigned int uint32_t_size = sizeof(uint32_t);
87 unsigned int uint64_t_size = sizeof(uint64_t);
88 unsigned int label_size = boost::numeric_cast<unsigned int>(label.size());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000089
90 // Check the decl id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000091 uint32_t eventClassDeclId = ReadUint32(readableData, offset);
92 BOOST_CHECK(eventClassDeclId == 0);
93
94 // Check the profiling GUID
95 offset += uint32_t_size;
96 uint64_t readProfilingGuid = ReadUint64(readableData, offset);
97 if (guid.has_value())
98 {
99 BOOST_CHECK(readProfilingGuid == guid.value());
100 }
101 else
102 {
Sadik Armagan3184c902020-03-18 10:57:30 +0000103 armnn::profiling::ProfilingService profilingService;
104 BOOST_CHECK(readProfilingGuid == profilingService.GetStaticId(label));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000105 }
106
107 // Check the SWTrace label
108 offset += uint64_t_size;
109 uint32_t swTraceLabelLength = ReadUint32(readableData, offset);
Keith Davis97da5e22020-03-05 16:25:28 +0000110 BOOST_CHECK(swTraceLabelLength == label_size + 1); // Label length including the null-terminator
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000111 offset += uint32_t_size;
112 BOOST_CHECK(std::memcmp(readableData + offset, // Offset to the label in the buffer
Keith Davis97da5e22020-03-05 16:25:28 +0000113 label.data(), // The original label
114 swTraceLabelLength - 1) == 0); // The length of the label
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000115
116 // SWTrace strings are written in blocks of words, so the offset has to be updated to the next whole word
117 offset += OffsetToNextWord(swTraceLabelLength);
118}
119
Keith Davis97da5e22020-03-05 16:25:28 +0000120void VerifyTimelineEventClassBinaryPacketData(ProfilingGuid guid,
121 const unsigned char* readableData,
122 unsigned int& offset)
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000123{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100124 ARMNN_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000125
126 // Utils
127 unsigned int uint32_t_size = sizeof(uint32_t);
128 unsigned int uint64_t_size = sizeof(uint64_t);
129
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000130 // Check the decl id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000131 uint32_t eventClassDeclId = ReadUint32(readableData, offset);
132 BOOST_CHECK(eventClassDeclId == 2);
133
134 // Check the profiling GUID
135 offset += uint32_t_size;
136 uint64_t readProfilingGuid = ReadUint64(readableData, offset);
137 BOOST_CHECK(readProfilingGuid == guid);
138
139 // Update the offset to allow parsing to be continued after this function returns
140 offset += uint64_t_size;
141}
142
Keith Davis97da5e22020-03-05 16:25:28 +0000143void VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType relationshipType,
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000144 Optional<ProfilingGuid> relationshipGuid,
145 Optional<ProfilingGuid> headGuid,
146 Optional<ProfilingGuid> tailGuid,
Finn Williams0a336dc2020-05-11 15:39:58 +0100147 Optional<ProfilingGuid> attributeGuid,
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000148 const unsigned char* readableData,
149 unsigned int& offset)
150{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100151 ARMNN_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000152
153 uint32_t relationshipTypeUint = 0;
154 switch (relationshipType)
155 {
156 case ProfilingRelationshipType::RetentionLink:
157 relationshipTypeUint = 0;
158 break;
159 case ProfilingRelationshipType::ExecutionLink:
160 relationshipTypeUint = 1;
161 break;
162 case ProfilingRelationshipType::DataLink:
163 relationshipTypeUint = 2;
164 break;
165 case ProfilingRelationshipType::LabelLink:
166 relationshipTypeUint = 3;
167 break;
168 default:
169 BOOST_ERROR("Unknown relationship type");
170 }
171
172 // Utils
173 unsigned int uint32_t_size = sizeof(uint32_t);
174 unsigned int uint64_t_size = sizeof(uint64_t);
175
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000176 // Check the decl id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000177 uint32_t eventClassDeclId = ReadUint32(readableData, offset);
178 BOOST_CHECK(eventClassDeclId == 3);
179
180 // Check the relationship type
181 offset += uint32_t_size;
182 uint32_t readRelationshipTypeUint = ReadUint32(readableData, offset);
183 BOOST_CHECK(readRelationshipTypeUint == relationshipTypeUint);
184
185 // Check the relationship GUID
186 offset += uint32_t_size;
187 uint64_t readRelationshipGuid = ReadUint64(readableData, offset);
188 if (relationshipGuid.has_value())
189 {
190 BOOST_CHECK(readRelationshipGuid == relationshipGuid.value());
191 }
192 else
193 {
194 BOOST_CHECK(readRelationshipGuid != ProfilingGuid(0));
195 }
196
197 // Check the head of relationship GUID
198 offset += uint64_t_size;
199 uint64_t readHeadRelationshipGuid = ReadUint64(readableData, offset);
200 if (headGuid.has_value())
201 {
202 BOOST_CHECK(readHeadRelationshipGuid == headGuid.value());
203 }
204 else
205 {
206 BOOST_CHECK(readHeadRelationshipGuid != ProfilingGuid(0));
207 }
208
209 // Check the tail of relationship GUID
210 offset += uint64_t_size;
211 uint64_t readTailRelationshipGuid = ReadUint64(readableData, offset);
212 if (tailGuid.has_value())
213 {
214 BOOST_CHECK(readTailRelationshipGuid == tailGuid.value());
215 }
216 else
217 {
218 BOOST_CHECK(readTailRelationshipGuid != ProfilingGuid(0));
219 }
220
Finn Williams0a336dc2020-05-11 15:39:58 +0100221 // Check the tail of relationship GUID
222 offset += uint64_t_size;
223 uint64_t readAttributeRelationshipGuid = ReadUint64(readableData, offset);
224 if (attributeGuid.has_value())
225 {
226 BOOST_CHECK(readAttributeRelationshipGuid == attributeGuid.value());
227 }
228 else
229 {
230 BOOST_CHECK(readAttributeRelationshipGuid == ProfilingGuid(0));
231 }
232
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000233 // Update the offset to allow parsing to be continued after this function returns
234 offset += uint64_t_size;
235}
236
Keith Davis97da5e22020-03-05 16:25:28 +0000237void VerifyTimelineEntityBinaryPacketData(Optional<ProfilingGuid> guid,
238 const unsigned char* readableData,
239 unsigned int& offset)
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000240{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100241 ARMNN_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000242
243 // Utils
244 unsigned int uint32_t_size = sizeof(uint32_t);
245 unsigned int uint64_t_size = sizeof(uint64_t);
246
247 // Reading TimelineEntityClassBinaryPacket
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000248 // Check the decl_id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000249 uint32_t entityDeclId = ReadUint32(readableData, offset);
250 BOOST_CHECK(entityDeclId == 1);
251
252 // Check the profiling GUID
253 offset += uint32_t_size;
254 uint64_t readProfilingGuid = ReadUint64(readableData, offset);
255
256 if (guid.has_value())
257 {
258 BOOST_CHECK(readProfilingGuid == guid.value());
259 }
260 else
261 {
262 BOOST_CHECK(readProfilingGuid != ProfilingGuid(0));
263 }
264
265 offset += uint64_t_size;
266}
267
268void VerifyTimelineEventBinaryPacket(Optional<uint64_t> timestamp,
269 Optional<std::thread::id> threadId,
270 Optional<ProfilingGuid> eventGuid,
271 const unsigned char* readableData,
272 unsigned int& offset)
273{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100274 ARMNN_ASSERT(readableData);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000275
276 // Utils
277 unsigned int uint32_t_size = sizeof(uint32_t);
278 unsigned int uint64_t_size = sizeof(uint64_t);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000279
280 // Reading TimelineEventBinaryPacket
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000281 // Check the decl_id
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000282 uint32_t entityDeclId = ReadUint32(readableData, offset);
283 BOOST_CHECK(entityDeclId == 4);
284
285 // Check the timestamp
286 offset += uint32_t_size;
287 uint64_t readTimestamp = ReadUint64(readableData, offset);
288 if (timestamp.has_value())
289 {
290 BOOST_CHECK(readTimestamp == timestamp.value());
291 }
292 else
293 {
294 BOOST_CHECK(readTimestamp != 0);
295 }
296
297 // Check the thread id
298 offset += uint64_t_size;
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100299 std::vector<uint8_t> readThreadId(ThreadIdSize, 0);
300 ReadBytes(readableData, offset, ThreadIdSize, readThreadId.data());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000301 if (threadId.has_value())
302 {
303 BOOST_CHECK(readThreadId == threadId.value());
304 }
305 else
306 {
307 BOOST_CHECK(readThreadId == std::this_thread::get_id());
308 }
309
310 // Check the event GUID
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100311 offset += ThreadIdSize;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000312 uint64_t readEventGuid = ReadUint64(readableData, offset);
313 if (eventGuid.has_value())
314 {
315 BOOST_CHECK(readEventGuid == eventGuid.value());
316 }
317 else
318 {
319 BOOST_CHECK(readEventGuid != ProfilingGuid(0));
320 }
321
322 offset += uint64_t_size;
323}
324
325void VerifyPostOptimisationStructureTestImpl(armnn::BackendId backendId)
326{
327 using namespace armnn;
328
329 // Create runtime in which test will run
330 armnn::IRuntime::CreationOptions options;
331 options.m_ProfilingOptions.m_EnableProfiling = true;
Keith Davis33ed2212020-03-30 10:43:41 +0100332 options.m_ProfilingOptions.m_TimelineEnabled = true;
Sadik Armagan3184c902020-03-18 10:57:30 +0000333 armnn::Runtime runtime(options);
Keith Davis33ed2212020-03-30 10:43:41 +0100334 GetProfilingService(&runtime).ResetExternalProfilingOptions(options.m_ProfilingOptions, false);
335
336 profiling::ProfilingServiceRuntimeHelper profilingServiceHelper(GetProfilingService(&runtime));
337 profilingServiceHelper.ForceTransitionToState(ProfilingState::NotConnected);
338 profilingServiceHelper.ForceTransitionToState(ProfilingState::WaitingForAck);
339 profilingServiceHelper.ForceTransitionToState(ProfilingState::Active);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000340
341 // build up the structure of the network
342 INetworkPtr net(INetwork::Create());
343
344 // Convolution details
345 TensorInfo inputInfo({ 1, 2, 5, 1 }, DataType::Float32);
Keith Davis97da5e22020-03-05 16:25:28 +0000346 TensorInfo weightInfo({ 3, 2, 3, 1 }, DataType::Float32);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000347 TensorInfo biasInfo({ 3 }, DataType::Float32);
Keith Davis97da5e22020-03-05 16:25:28 +0000348 TensorInfo outputInfo({ 1, 3, 7, 1 }, DataType::Float32);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000349 std::vector<float> weightsData{
Keith Davis97da5e22020-03-05 16:25:28 +0000350 1.0f, 0.0f, 0.0f,
351 0.0f, 2.0f, -1.5f,
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000352
Keith Davis97da5e22020-03-05 16:25:28 +0000353 0.0f, 0.0f, 0.0f,
354 0.2f, 0.2f, 0.2f,
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000355
Keith Davis97da5e22020-03-05 16:25:28 +0000356 0.5f, 0.0f, 0.5f,
357 0.0f, -1.0f, 0.0f
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000358 };
359 ConstTensor weights(weightInfo, weightsData);
360
361 Optional<ConstTensor> optionalBiases;
362 std::vector<float> biasesData{ 1.0f, 0.0f, 0.0f };
363 ConstTensor biases(biasInfo, biasesData);
364 optionalBiases = Optional<ConstTensor>(biases);
365
366 // Input layer
367 IConnectableLayer* input = net->AddInputLayer(0, "input");
368
369 // Convolution2d layer
370 Convolution2dDescriptor conv2dDesc;
Keith Davis97da5e22020-03-05 16:25:28 +0000371 conv2dDesc.m_StrideX = 1;
372 conv2dDesc.m_StrideY = 1;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000373 conv2dDesc.m_PadLeft = 0;
374 conv2dDesc.m_PadRight = 0;
375 conv2dDesc.m_PadTop = 2;
376 conv2dDesc.m_PadBottom = 2;
377 conv2dDesc.m_BiasEnabled = true;
378 IConnectableLayer* conv2d = net->AddConvolution2dLayer(conv2dDesc, weights, optionalBiases);
379
380 // Activation layer
381 armnn::ActivationDescriptor activationDesc;
382 armnn::IConnectableLayer* const activation = net->AddActivationLayer(activationDesc, "activation");
383
384 // Output layer
385 IConnectableLayer* output = net->AddOutputLayer(0, "output");
386
387 input->GetOutputSlot(0).Connect(conv2d->GetInputSlot(0));
388 conv2d->GetOutputSlot(0).Connect(activation->GetInputSlot(0));
389 activation->GetOutputSlot(0).Connect(output->GetInputSlot(0));
390
391 input->GetOutputSlot(0).SetTensorInfo(inputInfo);
392 conv2d->GetOutputSlot(0).SetTensorInfo(outputInfo);
393 activation->GetOutputSlot(0).SetTensorInfo(outputInfo);
394
395 // optimize the network
396 std::vector<armnn::BackendId> backends = { backendId };
Sadik Armagan3184c902020-03-18 10:57:30 +0000397 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime.GetDeviceSpec());
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000398
399 ProfilingGuid optNetGuid = optNet->GetGuid();
400
401 // Load it into the runtime. It should success.
402 armnn::NetworkId netId;
Sadik Armagan3184c902020-03-18 10:57:30 +0000403 BOOST_TEST(runtime.LoadNetwork(netId, std::move(optNet)) == Status::Success);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000404
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000405 profiling::BufferManager& bufferManager = profilingServiceHelper.GetProfilingBufferManager();
406 auto readableBuffer = bufferManager.GetReadableBuffer();
407
408 // Profiling is enable, the post-optimisation structure should be created
409 BOOST_CHECK(readableBuffer != nullptr);
410
411 unsigned int size = readableBuffer->GetSize();
Finn Williams0a336dc2020-05-11 15:39:58 +0100412 BOOST_CHECK(size == 1244);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000413
414 const unsigned char* readableData = readableBuffer->GetReadableData();
415 BOOST_CHECK(readableData != nullptr);
416
417 unsigned int offset = 0;
418
Keith Davis97da5e22020-03-05 16:25:28 +0000419 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100420 VerifyTimelineHeaderBinary(readableData, offset, 1236);
Keith Davis97da5e22020-03-05 16:25:28 +0000421
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000422 // Post-optimisation network
423 // Network entity
Keith Davis97da5e22020-03-05 16:25:28 +0000424 VerifyTimelineEntityBinaryPacketData(optNetGuid, readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000425
426 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000427 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
428 EmptyOptional(),
429 optNetGuid,
430 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000431 LabelsAndEventClasses::TYPE_GUID,
432 readableData,
433 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000434
435 // Input layer
436 // Input layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000437 VerifyTimelineEntityBinaryPacketData(input->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000438
439 // Name Entity
Keith Davis97da5e22020-03-05 16:25:28 +0000440 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "input", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000441
442 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000443 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
444 EmptyOptional(),
445 input->GetGuid(),
446 EmptyOptional(),
Finn Williams0a336dc2020-05-11 15:39:58 +0100447 LabelsAndEventClasses::NAME_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000448 readableData,
449 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000450
451 // Name label relationship
Finn Williams0a336dc2020-05-11 15:39:58 +0100452
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000453
454 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000455 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
456 EmptyOptional(),
457 input->GetGuid(),
458 EmptyOptional(),
Finn Williams0a336dc2020-05-11 15:39:58 +0100459 LabelsAndEventClasses::TYPE_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000460 readableData,
461 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000462
463 // Type label relationship
Finn Williams0a336dc2020-05-11 15:39:58 +0100464
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000465
466 // Network - Input layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000467 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
468 EmptyOptional(),
469 optNetGuid,
470 input->GetGuid(),
Finn Williams0a336dc2020-05-11 15:39:58 +0100471 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000472 readableData,
473 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000474
475 // Conv2d layer
476 // Conv2d layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000477 VerifyTimelineEntityBinaryPacketData(conv2d->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000478
479 // Name entity
Keith Davis97da5e22020-03-05 16:25:28 +0000480 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "<Unnamed>", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000481
482 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000483 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
484 EmptyOptional(),
485 conv2d->GetGuid(),
486 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000487 LabelsAndEventClasses::NAME_GUID,
488 readableData,
489 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000490
491 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000492 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
493 EmptyOptional(),
494 conv2d->GetGuid(),
495 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000496 LabelsAndEventClasses::TYPE_GUID,
497 readableData,
498 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000499
Finn Williams0a336dc2020-05-11 15:39:58 +0100500
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000501 // Network - Conv2d layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000502 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
503 EmptyOptional(),
504 optNetGuid,
505 conv2d->GetGuid(),
Finn Williams0a336dc2020-05-11 15:39:58 +0100506 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000507 readableData,
508 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000509
510 // Input layer - Conv2d layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000511 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
512 EmptyOptional(),
513 input->GetGuid(),
514 conv2d->GetGuid(),
Finn Williams0a336dc2020-05-11 15:39:58 +0100515 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000516 readableData,
517 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000518
519 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000520 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
521 EmptyOptional(),
522 EmptyOptional(),
523 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000524 LabelsAndEventClasses::TYPE_GUID,
525 readableData,
526 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000527
Finn Williams0a336dc2020-05-11 15:39:58 +0100528
529
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000530 // Conv2d workload
531 // Conv2d workload entity
Keith Davis97da5e22020-03-05 16:25:28 +0000532 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000533
534 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000535 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
536 EmptyOptional(),
537 EmptyOptional(),
538 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000539 LabelsAndEventClasses::TYPE_GUID,
540 readableData,
541 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000542
Finn Williams0a336dc2020-05-11 15:39:58 +0100543
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000544 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000545 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), backendId.Get(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000546
547 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000548 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
549 EmptyOptional(),
550 EmptyOptional(),
551 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000552 LabelsAndEventClasses::BACKENDID_GUID,
553 readableData,
554 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000555
Finn Williams0a336dc2020-05-11 15:39:58 +0100556
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000557 // Conv2d layer - Conv2d workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000558 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
559 EmptyOptional(),
560 conv2d->GetGuid(),
561 EmptyOptional(),
Finn Williams0a336dc2020-05-11 15:39:58 +0100562 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000563 readableData,
564 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000565
566 // Activation layer
567 // Activation layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000568 VerifyTimelineEntityBinaryPacketData(activation->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000569
570 // Name entity
Keith Davis97da5e22020-03-05 16:25:28 +0000571 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "activation", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000572
573 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000574 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
575 EmptyOptional(),
576 activation->GetGuid(),
577 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000578 LabelsAndEventClasses::NAME_GUID,
579 readableData,
580 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000581
582 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000583 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
584 EmptyOptional(),
585 activation->GetGuid(),
586 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000587 LabelsAndEventClasses::TYPE_GUID,
588 readableData,
589 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000590
591 // Network - Activation layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000592 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
593 EmptyOptional(),
594 optNetGuid,
595 activation->GetGuid(),
Finn Williams0a336dc2020-05-11 15:39:58 +0100596 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000597 readableData,
598 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000599
600 // Conv2d layer - Activation layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000601 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
602 EmptyOptional(),
603 conv2d->GetGuid(),
604 activation->GetGuid(),
Finn Williams0a336dc2020-05-11 15:39:58 +0100605 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000606 readableData,
607 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000608
609 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000610 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
611 EmptyOptional(),
612 EmptyOptional(),
613 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000614 LabelsAndEventClasses::TYPE_GUID,
615 readableData,
616 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000617
618 // Activation workload
619 // Activation workload entity
Keith Davis97da5e22020-03-05 16:25:28 +0000620 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000621
622 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000623 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
624 EmptyOptional(),
625 EmptyOptional(),
626 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000627 LabelsAndEventClasses::TYPE_GUID,
628 readableData,
629 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000630
631 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000632 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), backendId.Get(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000633
634 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000635 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
636 EmptyOptional(),
637 EmptyOptional(),
638 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000639 LabelsAndEventClasses::BACKENDID_GUID,
640 readableData,
641 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000642
643 // Activation layer - Activation workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000644 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
645 EmptyOptional(),
646 activation->GetGuid(),
647 EmptyOptional(),
Finn Williams0a336dc2020-05-11 15:39:58 +0100648 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000649 readableData,
650 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000651
652 // Output layer
653 // Output layer entity
Keith Davis97da5e22020-03-05 16:25:28 +0000654 VerifyTimelineEntityBinaryPacketData(output->GetGuid(), readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000655
656 // Name entity
Keith Davis97da5e22020-03-05 16:25:28 +0000657 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), "output", readableData, offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000658
659 // Entity - Name relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000660 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
661 EmptyOptional(),
662 output->GetGuid(),
663 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000664 LabelsAndEventClasses::NAME_GUID,
665 readableData,
666 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000667
668 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000669 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
670 EmptyOptional(),
671 output->GetGuid(),
672 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000673 LabelsAndEventClasses::TYPE_GUID,
674 readableData,
675 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000676
677 // Network - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000678 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
679 EmptyOptional(),
680 optNetGuid,
681 output->GetGuid(),
Finn Williams0a336dc2020-05-11 15:39:58 +0100682 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000683 readableData,
684 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000685
686 // Activation layer - Output layer relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000687 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
688 EmptyOptional(),
689 activation->GetGuid(),
690 output->GetGuid(),
Finn Williams0a336dc2020-05-11 15:39:58 +0100691 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000692 readableData,
693 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000694
695 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000696 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
697 EmptyOptional(),
698 EmptyOptional(),
699 LabelsAndEventClasses::CONNECTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000700 LabelsAndEventClasses::TYPE_GUID,
701 readableData,
702 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000703
704 bufferManager.MarkRead(readableBuffer);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000705
706 // Creates structures for input & output.
707 std::vector<float> inputData(inputInfo.GetNumElements());
708 std::vector<float> outputData(outputInfo.GetNumElements());
709
710 InputTensors inputTensors
Keith Davis97da5e22020-03-05 16:25:28 +0000711 {
Sadik Armagan3184c902020-03-18 10:57:30 +0000712 {0, ConstTensor(runtime.GetInputTensorInfo(netId, 0), inputData.data())}
Keith Davis97da5e22020-03-05 16:25:28 +0000713 };
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000714 OutputTensors outputTensors
Keith Davis97da5e22020-03-05 16:25:28 +0000715 {
Sadik Armagan3184c902020-03-18 10:57:30 +0000716 {0, Tensor(runtime.GetOutputTensorInfo(netId, 0), outputData.data())}
Keith Davis97da5e22020-03-05 16:25:28 +0000717 };
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000718
719 // Does the inference.
Sadik Armagan3184c902020-03-18 10:57:30 +0000720 runtime.EnqueueWorkload(netId, inputTensors, outputTensors);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000721
Finn Williamsb6a402f2020-03-24 13:46:22 +0000722 // Get readable buffer for input workload
723 auto inputReadableBuffer = bufferManager.GetReadableBuffer();
724 BOOST_CHECK(inputReadableBuffer != nullptr);
David Monahan6198fe02019-12-02 08:35:43 +0000725
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000726 // Get readable buffer for output workload
727 auto outputReadableBuffer = bufferManager.GetReadableBuffer();
728 BOOST_CHECK(outputReadableBuffer != nullptr);
729
Finn Williamsb6a402f2020-03-24 13:46:22 +0000730 // Get readable buffer for inference timeline
731 auto inferenceReadableBuffer = bufferManager.GetReadableBuffer();
732 BOOST_CHECK(inferenceReadableBuffer != nullptr);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000733
734 // Validate input workload data
735 size = inputReadableBuffer->GetSize();
Finn Williams0a336dc2020-05-11 15:39:58 +0100736 BOOST_CHECK(size == 164);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000737
738 readableData = inputReadableBuffer->GetReadableData();
739 BOOST_CHECK(readableData != nullptr);
740
741 offset = 0;
742
Keith Davis97da5e22020-03-05 16:25:28 +0000743 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100744 VerifyTimelineHeaderBinary(readableData, offset, 156);
Keith Davis97da5e22020-03-05 16:25:28 +0000745
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000746 // Input workload
747 // Input workload entity
Keith Davis97da5e22020-03-05 16:25:28 +0000748 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000749
750 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000751 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
752 EmptyOptional(),
753 EmptyOptional(),
754 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000755 LabelsAndEventClasses::TYPE_GUID,
756 readableData,
757 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000758
759 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000760 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), backendId.Get(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000761
762 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000763 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
764 EmptyOptional(),
765 EmptyOptional(),
766 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000767 LabelsAndEventClasses::BACKENDID_GUID,
768 readableData,
769 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000770
771 // Input layer - Input workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000772 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
773 EmptyOptional(),
774 input->GetGuid(),
775 EmptyOptional(),
Finn Williams0a336dc2020-05-11 15:39:58 +0100776 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000777 readableData,
778 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000779
780 bufferManager.MarkRead(inputReadableBuffer);
781
782 // Validate output workload data
783 size = outputReadableBuffer->GetSize();
Finn Williams0a336dc2020-05-11 15:39:58 +0100784 BOOST_CHECK(size == 164);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000785
786 readableData = outputReadableBuffer->GetReadableData();
787 BOOST_CHECK(readableData != nullptr);
788
789 offset = 0;
790
Keith Davis97da5e22020-03-05 16:25:28 +0000791 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100792 VerifyTimelineHeaderBinary(readableData, offset, 156);
Keith Davis97da5e22020-03-05 16:25:28 +0000793
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000794 // Output workload
795 // Output workload entity
Keith Davis97da5e22020-03-05 16:25:28 +0000796 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000797
798 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000799 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
800 EmptyOptional(),
801 EmptyOptional(),
802 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000803 LabelsAndEventClasses::TYPE_GUID,
804 readableData,
805 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000806
807 // BackendId entity
Keith Davis97da5e22020-03-05 16:25:28 +0000808 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), backendId.Get(), readableData, offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000809
810 // Entity - BackendId relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000811 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
812 EmptyOptional(),
813 EmptyOptional(),
814 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000815 LabelsAndEventClasses::BACKENDID_GUID,
816 readableData,
817 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000818
819 // Output layer - Output workload relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000820 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
821 EmptyOptional(),
822 output->GetGuid(),
823 EmptyOptional(),
Finn Williams0a336dc2020-05-11 15:39:58 +0100824 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000825 readableData,
826 offset);
Narumol Prangnawarataa68e012019-11-29 17:17:43 +0000827
828 bufferManager.MarkRead(outputReadableBuffer);
David Monahan6198fe02019-12-02 08:35:43 +0000829
830 // Validate inference data
831 size = inferenceReadableBuffer->GetSize();
Jan Eilersa10e2a22020-03-26 12:04:54 +0000832
Finn Williams0a336dc2020-05-11 15:39:58 +0100833 BOOST_CHECK(size == 1228 + 10 * ThreadIdSize);
David Monahan6198fe02019-12-02 08:35:43 +0000834
835 readableData = inferenceReadableBuffer->GetReadableData();
836 BOOST_CHECK(readableData != nullptr);
837
838 offset = 0;
839
Keith Davis97da5e22020-03-05 16:25:28 +0000840 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100841 VerifyTimelineHeaderBinary(readableData, offset, 1220 + 10 * ThreadIdSize);
Keith Davis97da5e22020-03-05 16:25:28 +0000842
David Monahan6198fe02019-12-02 08:35:43 +0000843 // Inference timeline trace
844 // Inference entity
Keith Davis97da5e22020-03-05 16:25:28 +0000845 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000846
847 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000848 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
849 EmptyOptional(),
850 EmptyOptional(),
851 LabelsAndEventClasses::INFERENCE_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000852 LabelsAndEventClasses::TYPE_GUID,
853 readableData,
854 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000855
856 // Network - Inference relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000857 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
858 EmptyOptional(),
859 optNetGuid,
860 EmptyOptional(),
Finn Williams0a336dc2020-05-11 15:39:58 +0100861 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000862 readableData,
863 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000864
865 // Start Inference life
866 // Event packet - timeline, threadId, eventGuid
867 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
868
869 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000870 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
871 EmptyOptional(),
872 EmptyOptional(),
873 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000874 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
875 readableData,
876 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000877
878 // Execution
879 // Input workload execution
880 // Input workload execution entity
Keith Davis97da5e22020-03-05 16:25:28 +0000881 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000882
883 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000884 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
885 EmptyOptional(),
886 EmptyOptional(),
887 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000888 LabelsAndEventClasses::TYPE_GUID,
889 readableData,
890 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000891
892 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000893 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
894 EmptyOptional(),
895 EmptyOptional(),
896 EmptyOptional(),
Finn Williams0a336dc2020-05-11 15:39:58 +0100897 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000898 readableData,
899 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000900
901 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000902 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
903 EmptyOptional(),
904 EmptyOptional(),
905 EmptyOptional(),
Finn Williams0a336dc2020-05-11 15:39:58 +0100906 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000907 readableData,
908 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000909
910 // Start Input workload execution life
911 // Event packet - timeline, threadId, eventGuid
912 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
913
914 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000915 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
916 EmptyOptional(),
917 EmptyOptional(),
918 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000919 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
920 readableData,
921 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000922
923 // End of Input workload execution life
924 // Event packet - timeline, threadId, eventGuid
925 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
926
927 // Input workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000928 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
929 EmptyOptional(),
930 EmptyOptional(),
931 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000932 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
933 readableData,
934 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000935
936 // Conv2d workload execution
937 // Conv2d workload execution entity
Keith Davis97da5e22020-03-05 16:25:28 +0000938 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000939
940 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000941 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
942 EmptyOptional(),
943 EmptyOptional(),
944 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000945 LabelsAndEventClasses::TYPE_GUID,
946 readableData,
947 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000948
949 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000950 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
951 EmptyOptional(),
952 EmptyOptional(),
953 EmptyOptional(),
Finn Williams0a336dc2020-05-11 15:39:58 +0100954 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000955 readableData,
956 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000957
958 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000959 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
960 EmptyOptional(),
961 EmptyOptional(),
962 EmptyOptional(),
Finn Williams0a336dc2020-05-11 15:39:58 +0100963 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000964 readableData,
965 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000966
967 // Start Conv2d workload execution life
968 // Event packet - timeline, threadId, eventGuid
969 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
970
971 // Conv2d workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000972 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
973 EmptyOptional(),
974 EmptyOptional(),
975 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000976 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
977 readableData,
978 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000979
980 // End of Conv2d workload execution life
981 // Event packet - timeline, threadId, eventGuid
982 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
983
984 // Conv2d workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000985 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
986 EmptyOptional(),
987 EmptyOptional(),
988 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000989 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
990 readableData,
991 offset);
David Monahan6198fe02019-12-02 08:35:43 +0000992
993 // Activation workload execution
994 // Activation workload execution entity
Keith Davis97da5e22020-03-05 16:25:28 +0000995 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +0000996
997 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +0000998 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
999 EmptyOptional(),
1000 EmptyOptional(),
1001 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001002 LabelsAndEventClasses::TYPE_GUID,
1003 readableData,
1004 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001005
1006 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001007 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1008 EmptyOptional(),
1009 EmptyOptional(),
1010 EmptyOptional(),
Finn Williams0a336dc2020-05-11 15:39:58 +01001011 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +00001012 readableData,
1013 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001014
1015 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001016 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1017 EmptyOptional(),
1018 EmptyOptional(),
1019 EmptyOptional(),
Finn Williams0a336dc2020-05-11 15:39:58 +01001020 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +00001021 readableData,
1022 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001023
1024 // Start Activation workload execution life
1025 // Event packet - timeline, threadId, eventGuid
1026 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1027
1028 // Activation workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001029 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1030 EmptyOptional(),
1031 EmptyOptional(),
1032 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +00001033 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1034 readableData,
1035 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001036
1037 // End of Activation workload execution life
1038 // Event packet - timeline, threadId, eventGuid
1039 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1040
1041 // Activation workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001042 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1043 EmptyOptional(),
1044 EmptyOptional(),
1045 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +00001046 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1047 readableData,
1048 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001049
1050 // Output workload execution
1051 // Output workload execution entity
Keith Davis97da5e22020-03-05 16:25:28 +00001052 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
David Monahan6198fe02019-12-02 08:35:43 +00001053
1054 // Entity - Type relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001055 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
1056 EmptyOptional(),
1057 EmptyOptional(),
1058 LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +00001059 LabelsAndEventClasses::TYPE_GUID,
1060 readableData,
1061 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001062
1063 // Inference - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001064 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1065 EmptyOptional(),
1066 EmptyOptional(),
1067 EmptyOptional(),
Finn Williams0a336dc2020-05-11 15:39:58 +01001068 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +00001069 readableData,
1070 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001071
1072 // Workload - Workload execution relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001073 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
1074 EmptyOptional(),
1075 EmptyOptional(),
1076 EmptyOptional(),
Finn Williams0a336dc2020-05-11 15:39:58 +01001077 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +00001078 readableData,
1079 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001080
1081 // Start Output workload execution life
1082 // Event packet - timeline, threadId, eventGuid
1083 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1084
1085 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001086 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1087 EmptyOptional(),
1088 EmptyOptional(),
1089 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +00001090 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
1091 readableData,
1092 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001093
1094 // End of Normalize workload execution life
1095 // Event packet - timeline, threadId, eventGuid
1096 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1097
1098 // Output workload execution - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001099 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1100 EmptyOptional(),
1101 EmptyOptional(),
1102 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +00001103 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1104 readableData,
1105 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001106
1107 // End of Inference life
1108 // Event packet - timeline, threadId, eventGuid
1109 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
1110
1111 // Inference - event relationship
Keith Davis97da5e22020-03-05 16:25:28 +00001112 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
1113 EmptyOptional(),
1114 EmptyOptional(),
1115 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +00001116 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
1117 readableData,
1118 offset);
David Monahan6198fe02019-12-02 08:35:43 +00001119
1120 bufferManager.MarkRead(inferenceReadableBuffer);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +00001121}