blob: c70c670a8786da42279cc1bf2d241b8e60f52229 [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"
Jim Flynn00f3aaf2019-10-24 11:58:06 +010020#include "ProfilingGuidGenerator.hpp"
Keith Davis02356de2019-08-26 18:28:17 +010021
22namespace armnn
23{
24
25namespace profiling
26{
27
Jim Flynn00f3aaf2019-10-24 11:58:06 +010028class ProfilingService : public IReadWriteCounterValues, public IProfilingGuidGenerator
Keith Davis02356de2019-08-26 18:28:17 +010029{
30public:
Matteo Martincigha84edee2019-10-02 12:50:57 +010031 using ExternalProfilingOptions = Runtime::CreationOptions::ExternalProfilingOptions;
Matteo Martincigh54fb9572019-10-02 12:50:57 +010032 using IProfilingConnectionFactoryPtr = std::unique_ptr<IProfilingConnectionFactory>;
Matteo Martincigha84edee2019-10-02 12:50:57 +010033 using IProfilingConnectionPtr = std::unique_ptr<IProfilingConnection>;
34 using CounterIndices = std::vector<std::atomic<uint32_t>*>;
35 using CounterValues = std::list<std::atomic<uint32_t>>;
Keith Davis02356de2019-08-26 18:28:17 +010036
Matteo Martincigha84edee2019-10-02 12:50:57 +010037 // Getter for the singleton instance
38 static ProfilingService& Instance()
39 {
40 static ProfilingService instance;
41 return instance;
42 }
43
44 // Resets the profiling options, optionally clears the profiling service entirely
45 void ResetExternalProfilingOptions(const ExternalProfilingOptions& options, bool resetProfilingService = false);
Jim Flynn672d06e2019-10-15 10:18:11 +010046 ProfilingState ConfigureProfilingService(const ExternalProfilingOptions& options,
47 bool resetProfilingService = false);
48
Matteo Martincigha84edee2019-10-02 12:50:57 +010049
Matteo Martincigh54fb9572019-10-02 12:50:57 +010050 // Updates the profiling service, making it transition to a new state if necessary
51 void Update();
Keith Davis02356de2019-08-26 18:28:17 +010052
Jim Flynn53e46992019-10-14 12:31:10 +010053 // Disconnects the profiling service from the external server
54 void Disconnect();
55
Matteo Martincigha84edee2019-10-02 12:50:57 +010056 // Getters for the profiling service state
FinnWilliamsArmce2d9d12019-09-18 10:28:16 +010057 const ICounterDirectory& GetCounterDirectory() const;
Keith Davis02356de2019-08-26 18:28:17 +010058 ProfilingState GetCurrentState() const;
Matteo Martincighe8485382019-10-10 14:08:21 +010059 bool IsCounterRegistered(uint16_t counterUid) const override;
Matteo Martincigha84edee2019-10-02 12:50:57 +010060 uint16_t GetCounterCount() const override;
61 uint32_t GetCounterValue(uint16_t counterUid) const override;
Keith Davis02356de2019-08-26 18:28:17 +010062
Matteo Martincigha84edee2019-10-02 12:50:57 +010063 // Setters for the profiling service state
64 void SetCounterValue(uint16_t counterUid, uint32_t value) override;
65 uint32_t AddCounterValue(uint16_t counterUid, uint32_t value) override;
66 uint32_t SubtractCounterValue(uint16_t counterUid, uint32_t value) override;
67 uint32_t IncrementCounterValue(uint16_t counterUid) override;
68 uint32_t DecrementCounterValue(uint16_t counterUid) override;
FinnWilliamsArmf6e534a2019-09-16 15:45:42 +010069
Jim Flynn00f3aaf2019-10-24 11:58:06 +010070 // IProfilingGuidGenerator functions
71 /// Return the next random Guid in the sequence
72 ProfilingDynamicGuid NextGuid() override;
73 /// Create a ProfilingStaticGuid based on a hash of the string
74 ProfilingStaticGuid GenerateStaticId(const std::string& str) override;
75
Keith Davis02356de2019-08-26 18:28:17 +010076private:
Matteo Martincigh54fb9572019-10-02 12:50:57 +010077 // Copy/move constructors/destructors and copy/move assignment operators are deleted
Matteo Martincigha84edee2019-10-02 12:50:57 +010078 ProfilingService(const ProfilingService&) = delete;
79 ProfilingService(ProfilingService&&) = delete;
80 ProfilingService& operator=(const ProfilingService&) = delete;
81 ProfilingService& operator=(ProfilingService&&) = delete;
Keith Davis02356de2019-08-26 18:28:17 +010082
Matteo Martincigh54fb9572019-10-02 12:50:57 +010083 // Initialization/reset functions
Matteo Martincigha84edee2019-10-02 12:50:57 +010084 void Initialize();
85 void InitializeCounterValue(uint16_t counterUid);
Matteo Martincigh54fb9572019-10-02 12:50:57 +010086 void Reset();
Jim Flynn53e46992019-10-14 12:31:10 +010087 void Stop();
Matteo Martincigha84edee2019-10-02 12:50:57 +010088
Matteo Martincighe8485382019-10-10 14:08:21 +010089 // Helper function
90 void CheckCounterUid(uint16_t counterUid) const;
91
Matteo Martincigh54fb9572019-10-02 12:50:57 +010092 // Profiling service components
Matteo Martincigha84edee2019-10-02 12:50:57 +010093 ExternalProfilingOptions m_Options;
FinnWilliamsArmce2d9d12019-09-18 10:28:16 +010094 CounterDirectory m_CounterDirectory;
Matteo Martincigh54fb9572019-10-02 12:50:57 +010095 IProfilingConnectionFactoryPtr m_ProfilingConnectionFactory;
Matteo Martincigha84edee2019-10-02 12:50:57 +010096 IProfilingConnectionPtr m_ProfilingConnection;
97 ProfilingStateMachine m_StateMachine;
98 CounterIndices m_CounterIndex;
99 CounterValues m_CounterValues;
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100100 CommandHandlerRegistry m_CommandHandlerRegistry;
101 PacketVersionResolver m_PacketVersionResolver;
102 CommandHandler m_CommandHandler;
103 BufferManager m_BufferManager;
104 SendCounterPacket m_SendCounterPacket;
Matteo Martincighe8485382019-10-10 14:08:21 +0100105 Holder m_Holder;
106 PeriodicCounterCapture m_PeriodicCounterCapture;
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100107 ConnectionAcknowledgedCommandHandler m_ConnectionAcknowledgedCommandHandler;
Matteo Martincigh8efc5002019-10-10 14:30:29 +0100108 RequestCounterDirectoryCommandHandler m_RequestCounterDirectoryCommandHandler;
Matteo Martincighe8485382019-10-10 14:08:21 +0100109 PeriodicCounterSelectionCommandHandler m_PeriodicCounterSelectionCommandHandler;
Matteo Martincigh994b5342019-10-11 17:19:56 +0100110 PerJobCounterSelectionCommandHandler m_PerJobCounterSelectionCommandHandler;
Jim Flynn00f3aaf2019-10-24 11:58:06 +0100111 ProfilingGuidGenerator m_GuidGenerator;
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100112
113protected:
114 // Default constructor/destructor kept protected for testing
115 ProfilingService()
116 : m_Options()
117 , m_CounterDirectory()
118 , m_ProfilingConnectionFactory(new ProfilingConnectionFactory())
119 , m_ProfilingConnection()
120 , m_StateMachine()
121 , m_CounterIndex()
122 , m_CounterValues()
123 , m_CommandHandlerRegistry()
124 , m_PacketVersionResolver()
125 , m_CommandHandler(1000,
126 false,
127 m_CommandHandlerRegistry,
128 m_PacketVersionResolver)
129 , m_BufferManager()
130 , m_SendCounterPacket(m_StateMachine, m_BufferManager)
Matteo Martincighe8485382019-10-10 14:08:21 +0100131 , m_PeriodicCounterCapture(m_Holder, m_SendCounterPacket, *this)
Jim Flynn397043f2019-10-17 17:37:10 +0100132 , m_ConnectionAcknowledgedCommandHandler(0,
133 1,
Jim Flynned25e0e2019-10-18 13:21:43 +0100134 m_PacketVersionResolver.ResolvePacketVersion(0, 1).GetEncodedValue(),
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100135 m_StateMachine)
Jim Flynn397043f2019-10-17 17:37:10 +0100136 , m_RequestCounterDirectoryCommandHandler(0,
137 3,
Jim Flynned25e0e2019-10-18 13:21:43 +0100138 m_PacketVersionResolver.ResolvePacketVersion(0, 3).GetEncodedValue(),
Matteo Martincigh8efc5002019-10-10 14:30:29 +0100139 m_CounterDirectory,
140 m_SendCounterPacket,
141 m_StateMachine)
Jim Flynn397043f2019-10-17 17:37:10 +0100142 , m_PeriodicCounterSelectionCommandHandler(0,
143 4,
Jim Flynned25e0e2019-10-18 13:21:43 +0100144 m_PacketVersionResolver.ResolvePacketVersion(0, 4).GetEncodedValue(),
Matteo Martincighe8485382019-10-10 14:08:21 +0100145 m_Holder,
146 m_PeriodicCounterCapture,
147 *this,
148 m_SendCounterPacket,
149 m_StateMachine)
Jim Flynn397043f2019-10-17 17:37:10 +0100150 , m_PerJobCounterSelectionCommandHandler(0,
151 5,
Jim Flynned25e0e2019-10-18 13:21:43 +0100152 m_PacketVersionResolver.ResolvePacketVersion(0, 5).GetEncodedValue(),
Matteo Martincigh994b5342019-10-11 17:19:56 +0100153 m_StateMachine)
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100154 {
155 // Register the "Connection Acknowledged" command handler
156 m_CommandHandlerRegistry.RegisterFunctor(&m_ConnectionAcknowledgedCommandHandler);
Matteo Martincigh8efc5002019-10-10 14:30:29 +0100157
158 // Register the "Request Counter Directory" command handler
159 m_CommandHandlerRegistry.RegisterFunctor(&m_RequestCounterDirectoryCommandHandler);
Matteo Martincighe8485382019-10-10 14:08:21 +0100160
161 // Register the "Periodic Counter Selection" command handler
162 m_CommandHandlerRegistry.RegisterFunctor(&m_PeriodicCounterSelectionCommandHandler);
Matteo Martincigh994b5342019-10-11 17:19:56 +0100163
164 // Register the "Per-Job Counter Selection" command handler
165 m_CommandHandlerRegistry.RegisterFunctor(&m_PerJobCounterSelectionCommandHandler);
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100166 }
167 ~ProfilingService() = default;
168
Matteo Martincighd0613b52019-10-09 16:47:04 +0100169 // Protected methods for testing
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100170 void SwapProfilingConnectionFactory(ProfilingService& instance,
171 IProfilingConnectionFactory* other,
172 IProfilingConnectionFactory*& backup)
173 {
174 BOOST_ASSERT(instance.m_ProfilingConnectionFactory);
175 BOOST_ASSERT(other);
176
177 backup = instance.m_ProfilingConnectionFactory.release();
178 instance.m_ProfilingConnectionFactory.reset(other);
179 }
Matteo Martincighd0613b52019-10-09 16:47:04 +0100180 IProfilingConnection* GetProfilingConnection(ProfilingService& instance)
181 {
182 return instance.m_ProfilingConnection.get();
183 }
Matteo Martincigh8efc5002019-10-10 14:30:29 +0100184 void TransitionToState(ProfilingService& instance, ProfilingState newState)
185 {
186 instance.m_StateMachine.TransitionToState(newState);
187 }
Matteo Martincighe8485382019-10-10 14:08:21 +0100188 void WaitForPacketSent(ProfilingService& instance)
189 {
190 return instance.m_SendCounterPacket.WaitForPacketSent();
191 }
Keith Davis02356de2019-08-26 18:28:17 +0100192};
193
194} // namespace profiling
195
Matteo Martincigha84edee2019-10-02 12:50:57 +0100196} // namespace armnn