diff options
Diffstat (limited to 'profiling/common/include')
-rw-r--r-- | profiling/common/include/CommonProfilingUtils.hpp | 10 | ||||
-rw-r--r-- | profiling/common/include/Counter.hpp | 62 | ||||
-rw-r--r-- | profiling/common/include/CounterDirectory.hpp | 103 | ||||
-rw-r--r-- | profiling/common/include/ICounterDirectory.hpp | 118 | ||||
-rw-r--r-- | profiling/common/include/ICounterRegistry.hpp | 49 |
5 files changed, 341 insertions, 1 deletions
diff --git a/profiling/common/include/CommonProfilingUtils.hpp b/profiling/common/include/CommonProfilingUtils.hpp index 68fe6bb8ca..c07beafedf 100644 --- a/profiling/common/include/CommonProfilingUtils.hpp +++ b/profiling/common/include/CommonProfilingUtils.hpp @@ -4,6 +4,8 @@ // #pragma once +#include "ICounterDirectory.hpp" + #include <cstdint> #include <string> @@ -34,5 +36,11 @@ void WriteUint8(unsigned char* buffer, unsigned int offset, uint8_t value); std::string CentreAlignFormatting(const std::string& stringToPass, const int spacingWidth); +void PrintCounterDirectory(ICounterDirectory& counterDirectory); + +uint16_t GetNextUid(bool peekOnly = false); + + std::vector<uint16_t> GetNextCounterUids(uint16_t firstUid, uint16_t cores); + } // namespace pipe -} // namespace arm
\ No newline at end of file +} // namespace arm diff --git a/profiling/common/include/Counter.hpp b/profiling/common/include/Counter.hpp new file mode 100644 index 0000000000..ff96d257e7 --- /dev/null +++ b/profiling/common/include/Counter.hpp @@ -0,0 +1,62 @@ +// +// Copyright © 2022 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include <string> + +namespace arm +{ + +namespace pipe +{ + +class Counter final +{ +public: + // Constructors + Counter(const std::string& backendId, + uint16_t counterUid, + uint16_t maxCounterUid, + uint16_t counterClass, + uint16_t interpolation, + double multiplier, + const std::string& name, + const std::string& description, + const std::string& units, + uint16_t deviceUid, + uint16_t counterSetUid) + : m_BackendId(backendId) + , m_Uid(counterUid) + , m_MaxCounterUid(maxCounterUid) + , m_Class(counterClass) + , m_Interpolation(interpolation) + , m_Multiplier(multiplier) + , m_Name(name) + , m_Description(description) + , m_Units(units) + , m_DeviceUid(deviceUid) + , m_CounterSetUid(counterSetUid) + {} + + // Fields + std::string m_BackendId; + uint16_t m_Uid; + uint16_t m_MaxCounterUid; + uint16_t m_Class; + uint16_t m_Interpolation; + double m_Multiplier; + std::string m_Name; + std::string m_Description; + std::string m_Units; // Optional, leave empty if the counter does not need units + + // Connections + uint16_t m_DeviceUid; // Optional, set to zero if the counter is not associated with a device + uint16_t m_CounterSetUid; // Optional, set to zero if the counter is not associated with a counter set +}; + +} // namespace pipe + +} // namespace arm diff --git a/profiling/common/include/CounterDirectory.hpp b/profiling/common/include/CounterDirectory.hpp new file mode 100644 index 0000000000..ecc349edff --- /dev/null +++ b/profiling/common/include/CounterDirectory.hpp @@ -0,0 +1,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 diff --git a/profiling/common/include/ICounterDirectory.hpp b/profiling/common/include/ICounterDirectory.hpp new file mode 100644 index 0000000000..d024516ab8 --- /dev/null +++ b/profiling/common/include/ICounterDirectory.hpp @@ -0,0 +1,118 @@ +// +// Copyright © 2019 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include "Counter.hpp" + +#include <string> +#include <vector> +#include <memory> +#include <unordered_set> +#include <unordered_map> + +namespace arm +{ + +namespace pipe +{ + +// Forward declarations +class Category; +class Device; +class CounterSet; + +// Profiling objects smart pointer types +using CategoryPtr = std::unique_ptr<Category>; +using DevicePtr = std::unique_ptr<Device>; +using CounterSetPtr = std::unique_ptr<CounterSet>; +using CounterPtr = std::shared_ptr<Counter>; + +// Profiling objects collection types +using Categories = std::unordered_set<CategoryPtr>; +using Devices = std::unordered_map<uint16_t, DevicePtr>; +using CounterSets = std::unordered_map<uint16_t, CounterSetPtr>; +using Counters = std::unordered_map<uint16_t, CounterPtr>; + +// Profiling objects collection iterator types +using CategoriesIt = Categories::const_iterator; +using DevicesIt = Devices::const_iterator; +using CounterSetsIt = CounterSets::const_iterator; +using CountersIt = Counters::const_iterator; + +class Category final +{ +public: + // Constructors + Category(const std::string& name) + : m_Name(name) + {} + + // Fields + std::string m_Name; + + // Connections + std::vector<uint16_t> m_Counters; // The UIDs of the counters associated with this category +}; + +class Device final +{ +public: + // Constructors + Device(uint16_t deviceUid, const std::string& name, uint16_t cores) + : m_Uid(deviceUid) + , m_Name(name) + , m_Cores(cores) + {} + + // Fields + uint16_t m_Uid; + std::string m_Name; + uint16_t m_Cores; +}; + +class CounterSet final +{ +public: + // Constructors + CounterSet(uint16_t counterSetUid, const std::string& name, uint16_t count) + : m_Uid(counterSetUid) + , m_Name(name) + , m_Count(count) + {} + + // Fields + uint16_t m_Uid; + std::string m_Name; + uint16_t m_Count; +}; + +class ICounterDirectory +{ +public: + virtual ~ICounterDirectory() {} + + // Getters for counts + virtual uint16_t GetCategoryCount() const = 0; + virtual uint16_t GetDeviceCount() const = 0; + virtual uint16_t GetCounterSetCount() const = 0; + virtual uint16_t GetCounterCount() const = 0; + + // Getters for collections + virtual const Categories& GetCategories() const = 0; + virtual const Devices& GetDevices() const = 0; + virtual const CounterSets& GetCounterSets() const = 0; + virtual const Counters& GetCounters() const = 0; + + // Getters for profiling objects + virtual const Category* GetCategory(const std::string& name) const = 0; + virtual const Device* GetDevice(uint16_t uid) const = 0; + virtual const CounterSet* GetCounterSet(uint16_t uid) const = 0; + virtual const Counter* GetCounter(uint16_t uid) const = 0; +}; + +} // namespace pipe + +} // namespace arm diff --git a/profiling/common/include/ICounterRegistry.hpp b/profiling/common/include/ICounterRegistry.hpp new file mode 100644 index 0000000000..5c34e7a3de --- /dev/null +++ b/profiling/common/include/ICounterRegistry.hpp @@ -0,0 +1,49 @@ +// +// Copyright © 2020 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include <common/include/Optional.hpp> + +namespace arm +{ + +namespace pipe +{ + +class ICounterRegistry +{ +public: + virtual ~ICounterRegistry() {} + + // Register profiling objects + virtual const Category* RegisterCategory (const std::string& categoryName) = 0; + + virtual const Device* RegisterDevice (const std::string& deviceName, + uint16_t cores, + const arm::pipe::Optional<std::string>& parentCategoryName) = 0; + + virtual const CounterSet* RegisterCounterSet(const std::string& counterSetName, + uint16_t count, + const arm::pipe::Optional<std::string>& parentCategoryName) = 0; + + virtual 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()) = 0; + +}; + +} // namespace pipe + +} // namespace arm |