blob: b0ddbcea3fd8b259c5f01e04fcc7ef839cd63ecb [file] [log] [blame]
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
Matteo Martincigh6db5f202019-09-05 12:02:04 +01008#include "ICounterDirectory.hpp"
9
10#include <armnn/Optional.hpp>
Keith Davise394bd92019-12-02 15:12:19 +000011#include <armnn/BackendId.hpp>
Matteo Martincigh6db5f202019-09-05 12:02:04 +010012
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010013#include <string>
Matteo Martincigh6db5f202019-09-05 12:02:04 +010014#include <unordered_set>
15#include <unordered_map>
16
17#include <boost/numeric/conversion/cast.hpp>
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010018
19namespace armnn
20{
21
22namespace profiling
23{
24
Matteo Martincigh6db5f202019-09-05 12:02:04 +010025class CounterDirectory final : public ICounterDirectory
Matteo Martincigh149528e2019-09-05 12:02:04 +010026{
27public:
Matteo Martincigh6db5f202019-09-05 12:02:04 +010028 CounterDirectory() = default;
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010029 ~CounterDirectory() = default;
30
Matteo Martincigh6db5f202019-09-05 12:02:04 +010031 // Register profiling objects
32 const Category* RegisterCategory (const std::string& categoryName,
33 const Optional<uint16_t>& deviceUid = EmptyOptional(),
34 const Optional<uint16_t>& counterSetUid = EmptyOptional());
35 const Device* RegisterDevice (const std::string& deviceName,
36 uint16_t cores = 0,
37 const Optional<std::string>& parentCategoryName = EmptyOptional());
38 const CounterSet* RegisterCounterSet(const std::string& counterSetName,
39 uint16_t count = 0,
40 const Optional<std::string>& parentCategoryName = EmptyOptional());
Keith Davise394bd92019-12-02 15:12:19 +000041 const Counter* RegisterCounter(const BackendId& backendId,
42 const uint16_t uid,
43 const std::string& parentCategoryName,
44 uint16_t counterClass,
45 uint16_t interpolation,
46 double multiplier,
47 const std::string& name,
48 const std::string& description,
49 const Optional<std::string>& units = EmptyOptional(),
50 const Optional<uint16_t>& numberOfCores = EmptyOptional(),
51 const Optional<uint16_t>& deviceUid = EmptyOptional(),
52 const Optional<uint16_t>& counterSetUid = EmptyOptional());
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010053
Matteo Martincigh6db5f202019-09-05 12:02:04 +010054 // Getters for counts
55 uint16_t GetCategoryCount() const override { return boost::numeric_cast<uint16_t>(m_Categories.size()); }
56 uint16_t GetDeviceCount() const override { return boost::numeric_cast<uint16_t>(m_Devices.size()); }
57 uint16_t GetCounterSetCount() const override { return boost::numeric_cast<uint16_t>(m_CounterSets.size()); }
58 uint16_t GetCounterCount() const override { return boost::numeric_cast<uint16_t>(m_Counters.size()); }
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010059
Matteo Martincigh6db5f202019-09-05 12:02:04 +010060 // Getters for collections
61 const Categories& GetCategories() const override { return m_Categories; }
62 const Devices& GetDevices() const override { return m_Devices; }
63 const CounterSets& GetCounterSets() const override { return m_CounterSets; }
64 const Counters& GetCounters() const override { return m_Counters; }
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010065
Matteo Martincigh6db5f202019-09-05 12:02:04 +010066 // Getters for profiling objects
67 const Category* GetCategory(const std::string& name) const override;
68 const Device* GetDevice(uint16_t uid) const override;
69 const CounterSet* GetCounterSet(uint16_t uid) const override;
70 const Counter* GetCounter(uint16_t uid) const override;
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010071
Matteo Martincigha84edee2019-10-02 12:50:57 +010072 // Queries for profiling objects
73 bool IsCategoryRegistered(const std::string& categoryName) const;
74 bool IsDeviceRegistered(uint16_t deviceUid) const;
75 bool IsDeviceRegistered(const std::string& deviceName) const;
76 bool IsCounterSetRegistered(uint16_t counterSetUid) const;
77 bool IsCounterSetRegistered(const std::string& counterSetName) const;
78 bool IsCounterRegistered(uint16_t counterUid) const;
79 bool IsCounterRegistered(const std::string& counterName) const;
80
81 // Clears all the counter directory contents
82 void Clear();
83
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010084private:
Matteo Martincigh6db5f202019-09-05 12:02:04 +010085 // The profiling collections owned by the counter directory
86 Categories m_Categories;
87 Devices m_Devices;
88 CounterSets m_CounterSets;
89 Counters m_Counters;
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010090
Matteo Martincigh6db5f202019-09-05 12:02:04 +010091 // Helper functions
92 CategoriesIt FindCategory(const std::string& categoryName) const;
93 DevicesIt FindDevice(uint16_t deviceUid) const;
94 DevicesIt FindDevice(const std::string& deviceName) const;
95 CounterSetsIt FindCounterSet(uint16_t counterSetUid) const;
96 CounterSetsIt FindCounterSet(const std::string& counterSetName) const;
97 CountersIt FindCounter(uint16_t counterUid) const;
Matteo Martincigha84edee2019-10-02 12:50:57 +010098 CountersIt FindCounter(const std::string& counterName) const;
99 uint16_t GetNumberOfCores(const Optional<uint16_t>& numberOfCores,
100 uint16_t deviceUid,
101 const CategoryPtr& parentCategory);
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +0100102};
103
104} // namespace profiling
105
106} // namespace armnn