blob: fac813979d240e27b7d1045426faf6914e4c730b [file] [log] [blame]
//
// 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