blob: 437d7128be87332ad51fd5160ae7c27435f951c6 [file] [log] [blame]
Ferran Balaguer1b941722019-08-28 16:57:18 +01001//
2// Copyright © 2019 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
Finn Williams032bc742020-02-12 11:02:34 +00008#include "CounterIdMap.hpp"
Ferran Balaguer1b941722019-08-28 16:57:18 +01009#include "Packet.hpp"
10#include "CommandHandlerFunctor.hpp"
11#include "Holder.hpp"
Sadik Armagan3896b472020-02-10 12:24:15 +000012#include "ProfilingStateMachine.hpp"
Ferran Balaguer1b941722019-08-28 16:57:18 +010013#include "SendCounterPacket.hpp"
14#include "IPeriodicCounterCapture.hpp"
Matteo Martincighe8485382019-10-10 14:08:21 +010015#include "ICounterValues.hpp"
Ferran Balaguer1b941722019-08-28 16:57:18 +010016
Finn Williams032bc742020-02-12 11:02:34 +000017#include "armnn/backends/profiling/IBackendProfilingContext.hpp"
18#include "armnn/Logging.hpp"
19#include "armnn/BackendRegistry.hpp"
20
21#include <set>
22
23
Ferran Balaguer1b941722019-08-28 16:57:18 +010024namespace armnn
25{
26
27namespace profiling
28{
29
Finn Williams032bc742020-02-12 11:02:34 +000030
Ferran Balaguer1b941722019-08-28 16:57:18 +010031class PeriodicCounterSelectionCommandHandler : public CommandHandlerFunctor
32{
33
34public:
Jim Flynn397043f2019-10-17 17:37:10 +010035 PeriodicCounterSelectionCommandHandler(uint32_t familyId,
36 uint32_t packetId,
Matteo Martincighe8485382019-10-10 14:08:21 +010037 uint32_t version,
Finn Williams032bc742020-02-12 11:02:34 +000038 const std::unordered_map<BackendId,
39 std::shared_ptr<armnn::profiling::IBackendProfilingContext>>&
40 backendProfilingContext,
41 const ICounterMappings& counterIdMap,
Matteo Martincighe8485382019-10-10 14:08:21 +010042 Holder& captureDataHolder,
Finn Williams032bc742020-02-12 11:02:34 +000043 const uint16_t maxArmnnCounterId,
Matteo Martincighe8485382019-10-10 14:08:21 +010044 IPeriodicCounterCapture& periodicCounterCapture,
45 const IReadCounterValues& readCounterValue,
46 ISendCounterPacket& sendCounterPacket,
47 const ProfilingStateMachine& profilingStateMachine)
Jim Flynn397043f2019-10-17 17:37:10 +010048 : CommandHandlerFunctor(familyId, packetId, version)
Finn Williams032bc742020-02-12 11:02:34 +000049 , m_BackendProfilingContext(backendProfilingContext)
50 , m_CounterIdMap(counterIdMap)
Matteo Martincighe8485382019-10-10 14:08:21 +010051 , m_CaptureDataHolder(captureDataHolder)
Finn Williams032bc742020-02-12 11:02:34 +000052 , m_MaxArmCounterId(maxArmnnCounterId)
Matteo Martincighe8485382019-10-10 14:08:21 +010053 , m_PeriodicCounterCapture(periodicCounterCapture)
Finn Williams032bc742020-02-12 11:02:34 +000054 , m_PrevCapturePeriod(0)
Matteo Martincighe8485382019-10-10 14:08:21 +010055 , m_ReadCounterValues(readCounterValue)
56 , m_SendCounterPacket(sendCounterPacket)
57 , m_StateMachine(profilingStateMachine)
Finn Williams032bc742020-02-12 11:02:34 +000058
59 {
60
61 }
Ferran Balaguer1b941722019-08-28 16:57:18 +010062
63 void operator()(const Packet& packet) override;
64
Ferran Balaguer1b941722019-08-28 16:57:18 +010065private:
Finn Williams032bc742020-02-12 11:02:34 +000066
67 std::unordered_map<armnn::BackendId, std::vector<uint16_t>> m_BackendCounterMap;
68 const std::unordered_map<BackendId,
69 std::shared_ptr<armnn::profiling::IBackendProfilingContext>>& m_BackendProfilingContext;
70 const ICounterMappings& m_CounterIdMap;
Ferran Balaguer1b941722019-08-28 16:57:18 +010071 Holder& m_CaptureDataHolder;
Finn Williams032bc742020-02-12 11:02:34 +000072 const uint16_t m_MaxArmCounterId;
Matteo Martincighe8485382019-10-10 14:08:21 +010073 IPeriodicCounterCapture& m_PeriodicCounterCapture;
Finn Williams032bc742020-02-12 11:02:34 +000074 uint32_t m_PrevCapturePeriod;
75 std::set<uint16_t> m_PrevBackendCounterIds;
Matteo Martincighe8485382019-10-10 14:08:21 +010076 const IReadCounterValues& m_ReadCounterValues;
Ferran Balaguer1b941722019-08-28 16:57:18 +010077 ISendCounterPacket& m_SendCounterPacket;
Matteo Martincighe8485382019-10-10 14:08:21 +010078 const ProfilingStateMachine& m_StateMachine;
79
Finn Williams032bc742020-02-12 11:02:34 +000080 void ActivateBackedCounters(const armnn::BackendId backendId,
81 const uint32_t capturePeriod,
82 const std::vector<uint16_t> counterIds)
83 {
84 Optional<std::string> errorMsg =
85 m_BackendProfilingContext.at(backendId)->ActivateCounters(capturePeriod, counterIds);
86
87 if(errorMsg.has_value())
88 {
89 ARMNN_LOG(warning) << "An error has occurred when activating counters of " << backendId << ": "
90 << errorMsg.value();
91 }
92 }
Ferran Balaguer1b941722019-08-28 16:57:18 +010093 void ParseData(const Packet& packet, CaptureData& captureData);
Finn Williams032bc742020-02-12 11:02:34 +000094 std::set<armnn::BackendId> ProcessBackendCounterIds(const u_int32_t capturePeriod,
95 std::set<uint16_t> newCounterIds,
96 std::set<uint16_t> unusedCounterIds);
97
Ferran Balaguer1b941722019-08-28 16:57:18 +010098};
99
100} // namespace profiling
101
102} // namespace armnn
103