127 lines
4.0 KiB
C++
127 lines
4.0 KiB
C++
//
|
|
// Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
//
|
|
|
|
#include "PeriodicCounterCaptureCommandHandler.hpp"
|
|
|
|
#include <common/include/CommonProfilingUtils.hpp>
|
|
|
|
#include <armnn/utility/NumericCast.hpp>
|
|
|
|
#include <iostream>
|
|
|
|
namespace armnn
|
|
{
|
|
|
|
namespace gatordmock
|
|
{
|
|
|
|
void PeriodicCounterCaptureCommandHandler::ParseData(const arm::pipe::Packet& packet)
|
|
{
|
|
std::vector<uint16_t> counterIds;
|
|
std::vector<uint32_t> counterValues;
|
|
|
|
uint32_t sizeOfUint64 = armnn::numeric_cast<uint32_t>(sizeof(uint64_t));
|
|
uint32_t sizeOfUint32 = armnn::numeric_cast<uint32_t>(sizeof(uint32_t));
|
|
uint32_t sizeOfUint16 = armnn::numeric_cast<uint32_t>(sizeof(uint16_t));
|
|
|
|
uint32_t offset = 0;
|
|
|
|
if (packet.GetLength() >= 8)
|
|
{
|
|
offset = 0;
|
|
|
|
uint64_t timestamp = arm::pipe::ReadUint64(reinterpret_cast<const unsigned char*>(packet.GetData()), offset);
|
|
|
|
if (m_FirstTimestamp == 0) // detect the first timestamp we receive.
|
|
{
|
|
m_FirstTimestamp = timestamp;
|
|
}
|
|
else
|
|
{
|
|
m_SecondTimestamp = timestamp;
|
|
m_CurrentPeriodValue = m_SecondTimestamp - m_FirstTimestamp;
|
|
m_FirstTimestamp = m_SecondTimestamp;
|
|
}
|
|
|
|
// Length minus timestamp and header divided by the length of an indexPair
|
|
unsigned int counters = (packet.GetLength() - 8) / 6;
|
|
|
|
if (counters > 0)
|
|
{
|
|
counterIds.reserve(counters);
|
|
counterValues.reserve(counters);
|
|
// Move offset over timestamp area
|
|
offset += sizeOfUint64;
|
|
for (unsigned int pos = 0; pos < counters; ++pos)
|
|
{
|
|
counterIds.emplace_back(
|
|
arm::pipe::ReadUint16(reinterpret_cast<const unsigned char*>(packet.GetData()), offset));
|
|
offset += sizeOfUint16;
|
|
|
|
counterValues.emplace_back(
|
|
arm::pipe::ReadUint32(reinterpret_cast<const unsigned char*>(packet.GetData()), offset));
|
|
offset += sizeOfUint32;
|
|
}
|
|
}
|
|
|
|
m_CounterCaptureValues.m_Timestamp = timestamp;
|
|
m_CounterCaptureValues.m_Uids = counterIds;
|
|
m_CounterCaptureValues.m_Values = counterValues;
|
|
}
|
|
}
|
|
|
|
void PeriodicCounterCaptureCommandHandler::operator()(const arm::pipe::Packet& packet)
|
|
{
|
|
ParseData(packet);
|
|
if (!m_QuietOperation) // Are we supposed to print to stdout?
|
|
{
|
|
std::string header, body, uidString, valueString;
|
|
|
|
for (uint16_t uid : m_CounterCaptureValues.m_Uids)
|
|
{
|
|
uidString.append(std::to_string(uid));
|
|
uidString.append(", ");
|
|
}
|
|
|
|
for (uint32_t val : m_CounterCaptureValues.m_Values)
|
|
{
|
|
valueString.append(std::to_string(val));
|
|
valueString.append(", ");
|
|
}
|
|
|
|
body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_CounterCaptureValues.m_Timestamp), 10));
|
|
body.append(" | ");
|
|
body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_CurrentPeriodValue), 13));
|
|
body.append(" | ");
|
|
body.append(arm::pipe::CentreAlignFormatting(uidString, 10));
|
|
body.append(" | ");
|
|
body.append(arm::pipe::CentreAlignFormatting(valueString, 10));
|
|
body.append("\n");
|
|
|
|
if (!m_HeaderPrinted)
|
|
{
|
|
header.append(arm::pipe::CentreAlignFormatting(" Timestamp", 11));
|
|
header.append(" | ");
|
|
header.append(arm::pipe::CentreAlignFormatting("Period (us)", 13));
|
|
header.append(" | ");
|
|
header.append(arm::pipe::CentreAlignFormatting("UID's", static_cast<int>(uidString.size())));
|
|
header.append(" | ");
|
|
header.append(arm::pipe::CentreAlignFormatting("Values", 10));
|
|
header.append("\n");
|
|
|
|
std::cout << header;
|
|
m_HeaderPrinted = true;
|
|
}
|
|
|
|
std::cout << std::string(body.size(), '-') << "\n";
|
|
|
|
std::cout << body;
|
|
}
|
|
}
|
|
|
|
} // namespace gatordmock
|
|
|
|
} // namespace armnn
|