blob: ea11442ba750ca992e10dbb943ad3c6ab3fa4b50 [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)
Jim Flynn397043f2019-10-17 17:37:10 +0100124 , m_ConnectionAcknowledgedCommandHandler(0,
125 1,
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100126 m_PacketVersionResolver.ResolvePacketVersion(1).GetEncodedValue(),
127 m_StateMachine)
Jim Flynn397043f2019-10-17 17:37:10 +0100128 , m_RequestCounterDirectoryCommandHandler(0,
129 3,
Matteo Martincigh8efc5002019-10-10 14:30:29 +0100130 m_PacketVersionResolver.ResolvePacketVersion(3).GetEncodedValue(),
131 m_CounterDirectory,
132 m_SendCounterPacket,
133 m_StateMachine)
Jim Flynn397043f2019-10-17 17:37:10 +0100134 , m_PeriodicCounterSelectionCommandHandler(0,
135 4,
Matteo Martincighe8485382019-10-10 14:08:21 +0100136 m_PacketVersionResolver.ResolvePacketVersion(4).GetEncodedValue(),
137 m_Holder,
138 m_PeriodicCounterCapture,
139 *this,
140 m_SendCounterPacket,
141 m_StateMachine)
Jim Flynn397043f2019-10-17 17:37:10 +0100142 , m_PerJobCounterSelectionCommandHandler(0,
143 5,
Matteo Martincigh994b5342019-10-11 17:19:56 +0100144 m_PacketVersionResolver.ResolvePacketVersion(4).GetEncodedValue(),
145 m_StateMachine)
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100146 {
147 // Register the "Connection Acknowledged" command handler
148 m_CommandHandlerRegistry.RegisterFunctor(&m_ConnectionAcknowledgedCommandHandler);
Matteo Martincigh8efc5002019-10-10 14:30:29 +0100149
150 // Register the "Request Counter Directory" command handler
151 m_CommandHandlerRegistry.RegisterFunctor(&m_RequestCounterDirectoryCommandHandler);
Matteo Martincighe8485382019-10-10 14:08:21 +0100152
153 // Register the "Periodic Counter Selection" command handler
154 m_CommandHandlerRegistry.RegisterFunctor(&m_PeriodicCounterSelectionCommandHandler);
Matteo Martincigh994b5342019-10-11 17:19:56 +0100155
156 // Register the "Per-Job Counter Selection" command handler
157 m_CommandHandlerRegistry.RegisterFunctor(&m_PerJobCounterSelectionCommandHandler);
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100158 }
159 ~ProfilingService() = default;
160
Matteo Martincighd0613b52019-10-09 16:47:04 +0100161 // Protected methods for testing
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100162 void SwapProfilingConnectionFactory(ProfilingService& instance,
163 IProfilingConnectionFactory* other,
164 IProfilingConnectionFactory*& backup)
165 {
166 BOOST_ASSERT(instance.m_ProfilingConnectionFactory);
167 BOOST_ASSERT(other);
168
169 backup = instance.m_ProfilingConnectionFactory.release();
170 instance.m_ProfilingConnectionFactory.reset(other);
171 }
Matteo Martincighd0613b52019-10-09 16:47:04 +0100172 IProfilingConnection* GetProfilingConnection(ProfilingService& instance)
173 {
174 return instance.m_ProfilingConnection.get();
175 }
Matteo Martincigh8efc5002019-10-10 14:30:29 +0100176 void TransitionToState(ProfilingService& instance, ProfilingState newState)
177 {
178 instance.m_StateMachine.TransitionToState(newState);
179 }
Matteo Martincighe8485382019-10-10 14:08:21 +0100180 void WaitForPacketSent(ProfilingService& instance)
181 {
182 return instance.m_SendCounterPacket.WaitForPacketSent();
183 }
Keith Davis02356de2019-08-26 18:28:17 +0100184};
185
186} // namespace profiling
187
Matteo Martincigha84edee2019-10-02 12:50:57 +0100188} // namespace armnn