blob: fac813979d240e27b7d1045426faf6914e4c730b [file] [log] [blame]
Colm Donelana21620d2019-10-11 13:09:49 +01001//
Jim Flynnbbfe6032020-07-20 16:57:44 +01002// Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
Colm Donelana21620d2019-10-11 13:09:49 +01003// SPDX-License-Identifier: MIT
4//
5
Colm Donelana21620d2019-10-11 13:09:49 +01006#include "PeriodicCounterCaptureCommandHandler.hpp"
7
Jim Flynnbbfe6032020-07-20 16:57:44 +01008#include <common/include/CommonProfilingUtils.hpp>
Matteo Martincigh65984272019-10-17 13:26:21 +01009
Jim Flynnbbfe6032020-07-20 16:57:44 +010010#include <armnn/utility/NumericCast.hpp>
Colm Donelana21620d2019-10-11 13:09:49 +010011
Matteo Martincigh65984272019-10-17 13:26:21 +010012#include <iostream>
13
Colm Donelana21620d2019-10-11 13:09:49 +010014namespace armnn
15{
16
17namespace gatordmock
18{
19
Jim Flynnbbfe6032020-07-20 16:57:44 +010020void PeriodicCounterCaptureCommandHandler::ParseData(const arm::pipe::Packet& packet)
Colm Donelana21620d2019-10-11 13:09:49 +010021{
22 std::vector<uint16_t> counterIds;
23 std::vector<uint32_t> counterValues;
24
Jim Flynnbbfe6032020-07-20 16:57:44 +010025 uint32_t sizeOfUint64 = armnn::numeric_cast<uint32_t>(sizeof(uint64_t));
26 uint32_t sizeOfUint32 = armnn::numeric_cast<uint32_t>(sizeof(uint32_t));
27 uint32_t sizeOfUint16 = armnn::numeric_cast<uint32_t>(sizeof(uint16_t));
Colm Donelana21620d2019-10-11 13:09:49 +010028
29 uint32_t offset = 0;
30
31 if (packet.GetLength() >= 8)
32 {
33 offset = 0;
34
Jim Flynnbbfe6032020-07-20 16:57:44 +010035 uint64_t timestamp = arm::pipe::ReadUint64(reinterpret_cast<const unsigned char*>(packet.GetData()), offset);
Colm Donelana21620d2019-10-11 13:09:49 +010036
37 if (m_FirstTimestamp == 0) // detect the first timestamp we receive.
38 {
39 m_FirstTimestamp = timestamp;
40 }
41 else
42 {
43 m_SecondTimestamp = timestamp;
44 m_CurrentPeriodValue = m_SecondTimestamp - m_FirstTimestamp;
45 m_FirstTimestamp = m_SecondTimestamp;
46 }
47
48 // Length minus timestamp and header divided by the length of an indexPair
49 unsigned int counters = (packet.GetLength() - 8) / 6;
50
51 if (counters > 0)
52 {
53 counterIds.reserve(counters);
54 counterValues.reserve(counters);
55 // Move offset over timestamp area
56 offset += sizeOfUint64;
57 for (unsigned int pos = 0; pos < counters; ++pos)
58 {
59 counterIds.emplace_back(
Jim Flynnbbfe6032020-07-20 16:57:44 +010060 arm::pipe::ReadUint16(reinterpret_cast<const unsigned char*>(packet.GetData()), offset));
Colm Donelana21620d2019-10-11 13:09:49 +010061 offset += sizeOfUint16;
62
63 counterValues.emplace_back(
Jim Flynnbbfe6032020-07-20 16:57:44 +010064 arm::pipe::ReadUint32(reinterpret_cast<const unsigned char*>(packet.GetData()), offset));
Colm Donelana21620d2019-10-11 13:09:49 +010065 offset += sizeOfUint32;
66 }
67 }
68
69 m_CounterCaptureValues.m_Timestamp = timestamp;
70 m_CounterCaptureValues.m_Uids = counterIds;
71 m_CounterCaptureValues.m_Values = counterValues;
72 }
73}
74
Jim Flynnbbfe6032020-07-20 16:57:44 +010075void PeriodicCounterCaptureCommandHandler::operator()(const arm::pipe::Packet& packet)
Colm Donelana21620d2019-10-11 13:09:49 +010076{
77 ParseData(packet);
Colm Donelanb682d842019-10-16 12:24:20 +010078 if (!m_QuietOperation) // Are we supposed to print to stdout?
Colm Donelana21620d2019-10-11 13:09:49 +010079 {
80 std::string header, body, uidString, valueString;
81
82 for (uint16_t uid : m_CounterCaptureValues.m_Uids)
83 {
84 uidString.append(std::to_string(uid));
85 uidString.append(", ");
86 }
87
88 for (uint32_t val : m_CounterCaptureValues.m_Values)
89 {
90 valueString.append(std::to_string(val));
91 valueString.append(", ");
92 }
93
Jim Flynnbbfe6032020-07-20 16:57:44 +010094 body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_CounterCaptureValues.m_Timestamp), 10));
Colm Donelana21620d2019-10-11 13:09:49 +010095 body.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +010096 body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_CurrentPeriodValue), 13));
Colm Donelana21620d2019-10-11 13:09:49 +010097 body.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +010098 body.append(arm::pipe::CentreAlignFormatting(uidString, 10));
Colm Donelana21620d2019-10-11 13:09:49 +010099 body.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +0100100 body.append(arm::pipe::CentreAlignFormatting(valueString, 10));
Colm Donelana21620d2019-10-11 13:09:49 +0100101 body.append("\n");
102
103 if (!m_HeaderPrinted)
104 {
Jim Flynnbbfe6032020-07-20 16:57:44 +0100105 header.append(arm::pipe::CentreAlignFormatting(" Timestamp", 11));
Colm Donelana21620d2019-10-11 13:09:49 +0100106 header.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +0100107 header.append(arm::pipe::CentreAlignFormatting("Period (us)", 13));
Colm Donelana21620d2019-10-11 13:09:49 +0100108 header.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +0100109 header.append(arm::pipe::CentreAlignFormatting("UID's", static_cast<int>(uidString.size())));
Colm Donelana21620d2019-10-11 13:09:49 +0100110 header.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +0100111 header.append(arm::pipe::CentreAlignFormatting("Values", 10));
Colm Donelana21620d2019-10-11 13:09:49 +0100112 header.append("\n");
113
114 std::cout << header;
115 m_HeaderPrinted = true;
116 }
117
118 std::cout << std::string(body.size(), '-') << "\n";
119
120 std::cout << body;
121 }
122}
123
124} // namespace gatordmock
125
Matteo Martincigh65984272019-10-17 13:26:21 +0100126} // namespace armnn