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