23 void DirectoryCaptureCommandHandler::ParseData(
const armnn::profiling::Packet& packet)
25 uint16_t categoryRecordCount;
26 uint16_t counterSetRecordCount;
27 uint16_t deviceRecordCount;
31 if (packet.GetLength() < 8)
33 std::cout <<
"Counter directory packet received." << std::endl;
37 const unsigned char* data = packet.GetData();
75 std::vector<uint32_t> deviceRecordOffsets(deviceRecordCount);
76 std::vector<uint32_t> counterSetOffsets(counterSetRecordCount);
77 std::vector<uint32_t> categoryOffsets(categoryRecordCount);
79 offset = deviceRecordsPointerTableOffset;
80 for (uint32_t i = 0; i < deviceRecordCount; ++i)
86 offset = counterPointerTableSetOffset;
87 for (uint32_t i = 0; i < counterSetRecordCount; ++i)
93 offset = categoriesPointerTableOffset;
94 for (uint32_t i = 0; i < categoryRecordCount; ++i)
100 offset = deviceRecordsPointerTableOffset;
101 for (uint32_t deviceIndex = 0; deviceIndex < deviceRecordCount; ++deviceIndex)
103 uint32_t deviceRecordOffset = offset + deviceRecordOffsets[deviceIndex];
116 deviceRecordOffset = deviceRecordsPointerTableOffset + nameOffset;
118 const std::string& deviceName = GetStringNameFromBuffer(data, deviceRecordOffset);
120 m_UidTranslation[registeredDevice->
m_Uid] = deviceUid;
123 offset = counterPointerTableSetOffset;
124 for (uint32_t counterSetIndex = 0; counterSetIndex < counterSetRecordCount; ++counterSetIndex)
126 uint32_t counterSetOffset = offset + counterSetOffsets[counterSetIndex];
144 m_CounterDirectory.
RegisterCounterSet(GetStringNameFromBuffer(data, counterSetOffset), counterSetCount);
145 m_UidTranslation[counterSet->m_Uid] = counterSetUid;
147 ReadCategoryRecords(data, categoriesPointerTableOffset, categoryOffsets);
150 void DirectoryCaptureCommandHandler::ReadCategoryRecords(
const unsigned char*
const data,
152 std::vector<uint32_t> categoryOffsets)
154 uint32_t categoryRecordCount =
static_cast<uint32_t
>(categoryOffsets.size());
156 for (uint32_t categoryIndex = 0; categoryIndex < categoryRecordCount; ++categoryIndex)
158 uint32_t categoryRecordOffset = offset + categoryOffsets[categoryIndex];
177 std::vector<uint32_t> eventRecordsOffsets(eventCount);
179 eventPointerTableOffset += offset + categoryOffsets[categoryIndex];
181 for (uint32_t eventIndex = 0; eventIndex < eventCount; ++eventIndex)
183 eventRecordsOffsets[eventIndex] =
187 const std::vector<CounterDirectoryEventRecord>& eventRecords =
188 ReadEventRecords(data, eventPointerTableOffset, eventRecordsOffsets);
191 GetStringNameFromBuffer(data, offset + categoryOffsets[categoryIndex] + nameOffset + uint32_t_size));
192 for (
auto& counter : eventRecords)
195 counter.m_CounterUid,
197 counter.m_CounterClass,
198 counter.m_CounterInterpolation,
199 counter.m_CounterMultiplier,
200 counter.m_CounterName,
201 counter.m_CounterDescription,
202 counter.m_CounterUnits);
203 m_UidTranslation[registeredCounter->
m_Uid] = counter.m_CounterUid;
208 std::vector<CounterDirectoryEventRecord> DirectoryCaptureCommandHandler::ReadEventRecords(
209 const unsigned char* data, uint32_t offset, std::vector<uint32_t> eventRecordsOffsets)
211 uint32_t eventCount =
static_cast<uint32_t
>(eventRecordsOffsets.size());
213 std::vector<CounterDirectoryEventRecord> eventRecords(eventCount);
214 for (
unsigned long i = 0; i < eventCount; ++i)
216 uint32_t eventRecordOffset = eventRecordsOffsets[i] + offset;
253 uint32_t multiplier[2] = { 0u, 0u };
260 std::memcpy(&eventRecords[i].m_CounterMultiplier, &multiplier,
sizeof(multiplier));
282 eventRecords[i].m_CounterName = GetStringNameFromBuffer(data, offset +
283 eventRecordsOffsets[i] +
287 eventRecords[i].m_CounterDescription = GetStringNameFromBuffer(data, offset +
288 eventRecordsOffsets[i] +
293 GetStringNameFromBuffer(data, eventRecordsOffsets[i] + offset + unitsOffset + uint32_t_size);
301 if (!m_QuietOperation)
303 std::cout <<
"Counter directory packet received." << std::endl;
310 m_AlreadyParsed =
true;
313 if (!m_QuietOperation)
321 return m_CounterDirectory;
324 std::string DirectoryCaptureCommandHandler::GetStringNameFromBuffer(
const unsigned char*
const data, uint32_t offset)
326 std::string deviceName;
329 while (isprint(nextChar))
331 deviceName +=
static_cast<char>(nextChar);
const Category * RegisterCategory(const std::string &categoryName) override
const Counter * RegisterCounter(const BackendId &backendId, const uint16_t uid, const std::string &parentCategoryName, uint16_t counterClass, uint16_t interpolation, double multiplier, const std::string &name, const std::string &description, const Optional< std::string > &units=EmptyOptional(), const Optional< uint16_t > &numberOfCores=EmptyOptional(), const Optional< uint16_t > &deviceUid=EmptyOptional(), const Optional< uint16_t > &counterSetUid=EmptyOptional()) override
void operator()(const armnn::profiling::Packet &packet) override
uint16_t ReadUint16(const IPacketBufferPtr &packetBuffer, unsigned int offset)
uint8_t ReadUint8(const IPacketBufferPtr &packetBuffer, unsigned int offset)
Copyright (c) 2020 ARM Limited.
bool ParsedCounterDirectory()
uint32_t ReadUint32(const IPacketBufferPtr &packetBuffer, unsigned int offset)
const Device * RegisterDevice(const std::string &deviceName, uint16_t cores=0, const Optional< std::string > &parentCategoryName=EmptyOptional()) override
const CounterSet * RegisterCounterSet(const std::string &counterSetName, uint16_t count=0, const Optional< std::string > &parentCategoryName=EmptyOptional()) override
const ICounterDirectory & GetCounterDirectory() const
void PrintCounterDirectory(ICounterDirectory &counterDirectory)