1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
|
//
// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
// SPDX-License-Identifier: MIT
//
#pragma once
#include "ICounterDirectory.hpp"
#include "ICounterRegistry.hpp"
#include <string>
#include <unordered_set>
#include <unordered_map>
#include <common/include/NumericCast.hpp>
namespace arm
{
namespace pipe
{
class CounterDirectory final : public ICounterDirectory, public ICounterRegistry
{
public:
CounterDirectory() = default;
~CounterDirectory() = default;
// Register profiling objects
const Category* RegisterCategory (const std::string& categoryName) override;
const Device* RegisterDevice (const std::string& deviceName,
uint16_t cores = 0,
const arm::pipe::Optional<std::string>& parentCategoryName
= arm::pipe::EmptyOptional()) override;
const CounterSet* RegisterCounterSet(const std::string& counterSetName,
uint16_t count = 0,
const arm::pipe::Optional<std::string>& parentCategoryName
= arm::pipe::EmptyOptional()) override;
const Counter* RegisterCounter(const std::string& 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 arm::pipe::Optional<std::string>& units = arm::pipe::EmptyOptional(),
const arm::pipe::Optional<uint16_t>& numberOfCores = arm::pipe::EmptyOptional(),
const arm::pipe::Optional<uint16_t>& deviceUid = arm::pipe::EmptyOptional(),
const arm::pipe::Optional<uint16_t>& counterSetUid = arm::pipe::EmptyOptional()) override;
// Getters for counts
uint16_t GetCategoryCount() const override { return arm::pipe::numeric_cast<uint16_t>(m_Categories.size()); }
uint16_t GetDeviceCount() const override { return arm::pipe::numeric_cast<uint16_t>(m_Devices.size()); }
uint16_t GetCounterSetCount() const override { return arm::pipe::numeric_cast<uint16_t>(m_CounterSets.size()); }
uint16_t GetCounterCount() const override { return arm::pipe::numeric_cast<uint16_t>(m_Counters.size()); }
// Getters for collections
const Categories& GetCategories() const override { return m_Categories; }
const Devices& GetDevices() const override { return m_Devices; }
const CounterSets& GetCounterSets() const override { return m_CounterSets; }
const Counters& GetCounters() const override { return m_Counters; }
// Getters for profiling objects
const Category* GetCategory(const std::string& name) const override;
const Device* GetDevice(uint16_t uid) const override;
const CounterSet* GetCounterSet(uint16_t uid) const override;
const Counter* GetCounter(uint16_t uid) const override;
// Queries for profiling objects
bool IsCategoryRegistered(const std::string& categoryName) const;
bool IsDeviceRegistered(uint16_t deviceUid) const;
bool IsDeviceRegistered(const std::string& deviceName) const;
bool IsCounterSetRegistered(uint16_t counterSetUid) const;
bool IsCounterSetRegistered(const std::string& counterSetName) const;
bool IsCounterRegistered(uint16_t counterUid) const;
bool IsCounterRegistered(const std::string& counterName) const;
// Clears all the counter directory contents
void Clear();
private:
// The profiling collections owned by the counter directory
Categories m_Categories;
Devices m_Devices;
CounterSets m_CounterSets;
Counters m_Counters;
// Helper functions
CategoriesIt FindCategory(const std::string& categoryName) const;
DevicesIt FindDevice(uint16_t deviceUid) const;
DevicesIt FindDevice(const std::string& deviceName) const;
CounterSetsIt FindCounterSet(uint16_t counterSetUid) const;
CounterSetsIt FindCounterSet(const std::string& counterSetName) const;
CountersIt FindCounter(uint16_t counterUid) const;
CountersIt FindCounter(const std::string& counterName) const;
uint16_t GetNumberOfCores(const arm::pipe::Optional<uint16_t>& numberOfCores,
uint16_t deviceUid);
};
} // namespace pipe
} // namespace arm
|