blob: a756a9a7bd08d0177fcf86e9dced96938f6e2833 [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>
11
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010012#include <string>
Matteo Martincigh6db5f202019-09-05 12:02:04 +010013#include <unordered_set>
14#include <unordered_map>
15
16#include <boost/numeric/conversion/cast.hpp>
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010017
18namespace armnn
19{
20
21namespace profiling
22{
23
Matteo Martincigh6db5f202019-09-05 12:02:04 +010024class CounterDirectory final : public ICounterDirectory
Matteo Martincigh149528e2019-09-05 12:02:04 +010025{
26public:
Matteo Martincigh6db5f202019-09-05 12:02:04 +010027 CounterDirectory() = default;
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010028 ~CounterDirectory() = default;
29
Matteo Martincigh6db5f202019-09-05 12:02:04 +010030 // Register profiling objects
31 const Category* RegisterCategory (const std::string& categoryName,
32 const Optional<uint16_t>& deviceUid = EmptyOptional(),
33 const Optional<uint16_t>& counterSetUid = EmptyOptional());
34 const Device* RegisterDevice (const std::string& deviceName,
35 uint16_t cores = 0,
36 const Optional<std::string>& parentCategoryName = EmptyOptional());
37 const CounterSet* RegisterCounterSet(const std::string& counterSetName,
38 uint16_t count = 0,
39 const Optional<std::string>& parentCategoryName = EmptyOptional());
40 const Counter* RegisterCounter (const std::string& parentCategoryName,
41 uint16_t counterClass,
42 uint16_t interpolation,
43 double multiplier,
44 const std::string& name,
45 const std::string& description,
46 const Optional<std::string>& units = EmptyOptional(),
47 const Optional<uint16_t>& numberOfCores = EmptyOptional(),
48 const Optional<uint16_t>& deviceUid = EmptyOptional(),
49 const Optional<uint16_t>& counterSetUid = EmptyOptional());
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010050
Matteo Martincigh6db5f202019-09-05 12:02:04 +010051 // Getters for counts
52 uint16_t GetCategoryCount() const override { return boost::numeric_cast<uint16_t>(m_Categories.size()); }
53 uint16_t GetDeviceCount() const override { return boost::numeric_cast<uint16_t>(m_Devices.size()); }
54 uint16_t GetCounterSetCount() const override { return boost::numeric_cast<uint16_t>(m_CounterSets.size()); }
55 uint16_t GetCounterCount() const override { return boost::numeric_cast<uint16_t>(m_Counters.size()); }
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010056
Matteo Martincigh6db5f202019-09-05 12:02:04 +010057 // Getters for collections
58 const Categories& GetCategories() const override { return m_Categories; }
59 const Devices& GetDevices() const override { return m_Devices; }
60 const CounterSets& GetCounterSets() const override { return m_CounterSets; }
61 const Counters& GetCounters() const override { return m_Counters; }
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010062
Matteo Martincigh6db5f202019-09-05 12:02:04 +010063 // Getters for profiling objects
64 const Category* GetCategory(const std::string& name) const override;
65 const Device* GetDevice(uint16_t uid) const override;
66 const CounterSet* GetCounterSet(uint16_t uid) const override;
67 const Counter* GetCounter(uint16_t uid) const override;
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010068
69private:
Matteo Martincigh6db5f202019-09-05 12:02:04 +010070 // The profiling collections owned by the counter directory
71 Categories m_Categories;
72 Devices m_Devices;
73 CounterSets m_CounterSets;
74 Counters m_Counters;
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010075
Matteo Martincigh6db5f202019-09-05 12:02:04 +010076 // Helper functions
77 CategoriesIt FindCategory(const std::string& categoryName) const;
78 DevicesIt FindDevice(uint16_t deviceUid) const;
79 DevicesIt FindDevice(const std::string& deviceName) const;
80 CounterSetsIt FindCounterSet(uint16_t counterSetUid) const;
81 CounterSetsIt FindCounterSet(const std::string& counterSetName) const;
82 CountersIt FindCounter(uint16_t counterUid) const;
83 bool CheckIfCategoryIsRegistered(const std::string& categoryName) const;
84 bool CheckIfDeviceIsRegistered(uint16_t deviceUid) const;
85 bool CheckIfDeviceIsRegistered(const std::string& deviceName) const;
86 bool CheckIfCounterSetIsRegistered(uint16_t counterSetUid) const;
87 bool CheckIfCounterSetIsRegistered(const std::string& counterSetName) const;
88 uint16_t GetNumberOfCores(const Optional<uint16_t>& numberOfCores,
89 uint16_t deviceUid,
90 const CategoryPtr& parentCategory);
Aron Virginas-Tar4e5fc1f2019-08-22 18:10:52 +010091};
92
93} // namespace profiling
94
95} // namespace armnn