blob: dda37dddf2dbabf7764f6112f1adec19ee94f94f [file] [log] [blame]
Keith Davis02356de2019-08-26 18:28:17 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
8#include "ProfilingStateMachine.hpp"
9#include "ProfilingConnectionFactory.hpp"
FinnWilliamsArmce2d9d12019-09-18 10:28:16 +010010#include "CounterDirectory.hpp"
Matteo Martincighe0e6efc2019-10-04 17:17:42 +010011#include "ICounterValues.hpp"
Matteo Martincigh54fb9572019-10-02 12:50:57 +010012#include "CommandHandler.hpp"
13#include "BufferManager.hpp"
14#include "SendCounterPacket.hpp"
Matteo Martincighe8485382019-10-10 14:08:21 +010015#include "PeriodicCounterCapture.hpp"
Matteo Martincigh54fb9572019-10-02 12:50:57 +010016#include "ConnectionAcknowledgedCommandHandler.hpp"
Matteo Martincigh8efc5002019-10-10 14:30:29 +010017#include "RequestCounterDirectoryCommandHandler.hpp"
Matteo Martincighe8485382019-10-10 14:08:21 +010018#include "PeriodicCounterSelectionCommandHandler.hpp"
Matteo Martincigh994b5342019-10-11 17:19:56 +010019#include "PerJobCounterSelectionCommandHandler.hpp"
Keith Davis02356de2019-08-26 18:28:17 +010020
21namespace armnn
22{
23
24namespace profiling
25{
26
Matteo Martincigh54fb9572019-10-02 12:50:57 +010027class ProfilingService : public IReadWriteCounterValues
Keith Davis02356de2019-08-26 18:28:17 +010028{
29public:
Matteo Martincigha84edee2019-10-02 12:50:57 +010030 using ExternalProfilingOptions = Runtime::CreationOptions::ExternalProfilingOptions;
Matteo Martincigh54fb9572019-10-02 12:50:57 +010031 using IProfilingConnectionFactoryPtr = std::unique_ptr<IProfilingConnectionFactory>;
Matteo Martincigha84edee2019-10-02 12:50:57 +010032 using IProfilingConnectionPtr = std::unique_ptr<IProfilingConnection>;
33 using CounterIndices = std::vector<std::atomic<uint32_t>*>;
34 using CounterValues = std::list<std::atomic<uint32_t>>;
Keith Davis02356de2019-08-26 18:28:17 +010035
Matteo Martincigha84edee2019-10-02 12:50:57 +010036 // Getter for the singleton instance
37 static ProfilingService& Instance()
38 {
39 static ProfilingService instance;
40 return instance;
41 }
42
43 // Resets the profiling options, optionally clears the profiling service entirely
44 void ResetExternalProfilingOptions(const ExternalProfilingOptions& options, bool resetProfilingService = false);
Jim Flynn672d06e2019-10-15 10:18:11 +010045 ProfilingState ConfigureProfilingService(const ExternalProfilingOptions& options,
46 bool resetProfilingService = false);
47
Matteo Martincigha84edee2019-10-02 12:50:57 +010048
Matteo Martincigh54fb9572019-10-02 12:50:57 +010049 // Updates the profiling service, making it transition to a new state if necessary
50 void Update();
Keith Davis02356de2019-08-26 18:28:17 +010051
Jim Flynn53e46992019-10-14 12:31:10 +010052 // Disconnects the profiling service from the external server
53 void Disconnect();
54
Matteo Martincigha84edee2019-10-02 12:50:57 +010055 // Getters for the profiling service state
FinnWilliamsArmce2d9d12019-09-18 10:28:16 +010056 const ICounterDirectory& GetCounterDirectory() const;
Keith Davis02356de2019-08-26 18:28:17 +010057 ProfilingState GetCurrentState() const;
Matteo Martincighe8485382019-10-10 14:08:21 +010058 bool IsCounterRegistered(uint16_t counterUid) const override;
Matteo Martincigha84edee2019-10-02 12:50:57 +010059 uint16_t GetCounterCount() const override;
60 uint32_t GetCounterValue(uint16_t counterUid) const override;
Keith Davis02356de2019-08-26 18:28:17 +010061
Matteo Martincigha84edee2019-10-02 12:50:57 +010062 // Setters for the profiling service state
63 void SetCounterValue(uint16_t counterUid, uint32_t value) override;
64 uint32_t AddCounterValue(uint16_t counterUid, uint32_t value) override;
65 uint32_t SubtractCounterValue(uint16_t counterUid, uint32_t value) override;
66 uint32_t IncrementCounterValue(uint16_t counterUid) override;
67 uint32_t DecrementCounterValue(uint16_t counterUid) override;
FinnWilliamsArmf6e534a2019-09-16 15:45:42 +010068
Keith Davis02356de2019-08-26 18:28:17 +010069private:
Matteo Martincigh54fb9572019-10-02 12:50:57 +010070 // Copy/move constructors/destructors and copy/move assignment operators are deleted
Matteo Martincigha84edee2019-10-02 12:50:57 +010071 ProfilingService(const ProfilingService&) = delete;
72 ProfilingService(ProfilingService&&) = delete;
73 ProfilingService& operator=(const ProfilingService&) = delete;
74 ProfilingService& operator=(ProfilingService&&) = delete;
Keith Davis02356de2019-08-26 18:28:17 +010075
Matteo Martincigh54fb9572019-10-02 12:50:57 +010076 // Initialization/reset functions
Matteo Martincigha84edee2019-10-02 12:50:57 +010077 void Initialize();
78 void InitializeCounterValue(uint16_t counterUid);
Matteo Martincigh54fb9572019-10-02 12:50:57 +010079 void Reset();
Jim Flynn53e46992019-10-14 12:31:10 +010080 void Stop();
Matteo Martincigha84edee2019-10-02 12:50:57 +010081
Matteo Martincighe8485382019-10-10 14:08:21 +010082 // Helper function
83 void CheckCounterUid(uint16_t counterUid) const;
84
Matteo Martincigh54fb9572019-10-02 12:50:57 +010085 // Profiling service components
Matteo Martincigha84edee2019-10-02 12:50:57 +010086 ExternalProfilingOptions m_Options;
FinnWilliamsArmce2d9d12019-09-18 10:28:16 +010087 CounterDirectory m_CounterDirectory;
Matteo Martincigh54fb9572019-10-02 12:50:57 +010088 IProfilingConnectionFactoryPtr m_ProfilingConnectionFactory;
Matteo Martincigha84edee2019-10-02 12:50:57 +010089 IProfilingConnectionPtr m_ProfilingConnection;
90 ProfilingStateMachine m_StateMachine;
91 CounterIndices m_CounterIndex;
92 CounterValues m_CounterValues;
Matteo Martincigh54fb9572019-10-02 12:50:57 +010093 CommandHandlerRegistry m_CommandHandlerRegistry;
94 PacketVersionResolver m_PacketVersionResolver;
95 CommandHandler m_CommandHandler;
96 BufferManager m_BufferManager;
97 SendCounterPacket m_SendCounterPacket;
Matteo Martincighe8485382019-10-10 14:08:21 +010098 Holder m_Holder;
99 PeriodicCounterCapture m_PeriodicCounterCapture;
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100100 ConnectionAcknowledgedCommandHandler m_ConnectionAcknowledgedCommandHandler;
Matteo Martincigh8efc5002019-10-10 14:30:29 +0100101 RequestCounterDirectoryCommandHandler m_RequestCounterDirectoryCommandHandler;
Matteo Martincighe8485382019-10-10 14:08:21 +0100102 PeriodicCounterSelectionCommandHandler m_PeriodicCounterSelectionCommandHandler;
Matteo Martincigh994b5342019-10-11 17:19:56 +0100103 PerJobCounterSelectionCommandHandler m_PerJobCounterSelectionCommandHandler;
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100104
105protected:
106 // Default constructor/destructor kept protected for testing
107 ProfilingService()
108 : m_Options()
109 , m_CounterDirectory()
110 , m_ProfilingConnectionFactory(new ProfilingConnectionFactory())
111 , m_ProfilingConnection()
112 , m_StateMachine()
113 , m_CounterIndex()
114 , m_CounterValues()
115 , m_CommandHandlerRegistry()
116 , m_PacketVersionResolver()
117 , m_CommandHandler(1000,
118 false,
119 m_CommandHandlerRegistry,
120 m_PacketVersionResolver)
121 , m_BufferManager()
122 , m_SendCounterPacket(m_StateMachine, m_BufferManager)
Matteo Martincighe8485382019-10-10 14:08:21 +0100123 , m_PeriodicCounterCapture(m_Holder, m_SendCounterPacket, *this)
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100124 , m_ConnectionAcknowledgedCommandHandler(1,
125 m_PacketVersionResolver.ResolvePacketVersion(1).GetEncodedValue(),
126 m_StateMachine)
Matteo Martincigh8efc5002019-10-10 14:30:29 +0100127 , m_RequestCounterDirectoryCommandHandler(3,
128 m_PacketVersionResolver.ResolvePacketVersion(3).GetEncodedValue(),
129 m_CounterDirectory,
130 m_SendCounterPacket,
131 m_StateMachine)
Matteo Martincighe8485382019-10-10 14:08:21 +0100132 , m_PeriodicCounterSelectionCommandHandler(4,
133 m_PacketVersionResolver.ResolvePacketVersion(4).GetEncodedValue(),
134 m_Holder,
135 m_PeriodicCounterCapture,
136 *this,
137 m_SendCounterPacket,
138 m_StateMachine)
Matteo Martincigh994b5342019-10-11 17:19:56 +0100139 , m_PerJobCounterSelectionCommandHandler(5,
140 m_PacketVersionResolver.ResolvePacketVersion(4).GetEncodedValue(),
141 m_StateMachine)
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100142 {
143 // Register the "Connection Acknowledged" command handler
144 m_CommandHandlerRegistry.RegisterFunctor(&m_ConnectionAcknowledgedCommandHandler);
Matteo Martincigh8efc5002019-10-10 14:30:29 +0100145
146 // Register the "Request Counter Directory" command handler
147 m_CommandHandlerRegistry.RegisterFunctor(&m_RequestCounterDirectoryCommandHandler);
Matteo Martincighe8485382019-10-10 14:08:21 +0100148
149 // Register the "Periodic Counter Selection" command handler
150 m_CommandHandlerRegistry.RegisterFunctor(&m_PeriodicCounterSelectionCommandHandler);
Matteo Martincigh994b5342019-10-11 17:19:56 +0100151
152 // Register the "Per-Job Counter Selection" command handler
153 m_CommandHandlerRegistry.RegisterFunctor(&m_PerJobCounterSelectionCommandHandler);
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100154 }
155 ~ProfilingService() = default;
156
Matteo Martincighd0613b52019-10-09 16:47:04 +0100157 // Protected methods for testing
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100158 void SwapProfilingConnectionFactory(ProfilingService& instance,
159 IProfilingConnectionFactory* other,
160 IProfilingConnectionFactory*& backup)
161 {
162 BOOST_ASSERT(instance.m_ProfilingConnectionFactory);
163 BOOST_ASSERT(other);
164
165 backup = instance.m_ProfilingConnectionFactory.release();
166 instance.m_ProfilingConnectionFactory.reset(other);
167 }
Matteo Martincighd0613b52019-10-09 16:47:04 +0100168 IProfilingConnection* GetProfilingConnection(ProfilingService& instance)
169 {
170 return instance.m_ProfilingConnection.get();
171 }
Matteo Martincigh8efc5002019-10-10 14:30:29 +0100172 void TransitionToState(ProfilingService& instance, ProfilingState newState)
173 {
174 instance.m_StateMachine.TransitionToState(newState);
175 }
Matteo Martincighe8485382019-10-10 14:08:21 +0100176 void WaitForPacketSent(ProfilingService& instance)
177 {
178 return instance.m_SendCounterPacket.WaitForPacketSent();
179 }
Keith Davis02356de2019-08-26 18:28:17 +0100180};
181
182} // namespace profiling
183
Matteo Martincigha84edee2019-10-02 12:50:57 +0100184} // namespace armnn