• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright © 2019 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #pragma once
7 
8 #include "IPeriodicCounterCapture.hpp"
9 #include "Holder.hpp"
10 #include <Packet.hpp>
11 #include "SendCounterPacket.hpp"
12 #include "ICounterValues.hpp"
13 #include "CounterIdMap.hpp"
14 
15 #include <atomic>
16 #include <mutex>
17 #include <thread>
18 #include <armnn/backends/profiling/IBackendProfilingContext.hpp>
19 
20 namespace armnn
21 {
22 
23 namespace profiling
24 {
25 
26 class PeriodicCounterCapture final : public IPeriodicCounterCapture
27 {
28 public:
PeriodicCounterCapture(const Holder & data,ISendCounterPacket & packet,IReadCounterValues & readCounterValue,const ICounterMappings & counterIdMap,const std::unordered_map<armnn::BackendId,std::shared_ptr<armnn::profiling::IBackendProfilingContext>> & backendProfilingContexts)29     PeriodicCounterCapture(const Holder& data,
30                            ISendCounterPacket& packet,
31                            IReadCounterValues& readCounterValue,
32                            const ICounterMappings& counterIdMap,
33                            const std::unordered_map<armnn::BackendId,
34                                    std::shared_ptr<armnn::profiling::IBackendProfilingContext>>&
35                            backendProfilingContexts)
36             : m_CaptureDataHolder(data)
37             , m_IsRunning(false)
38             , m_KeepRunning(false)
39             , m_ReadCounterValues(readCounterValue)
40             , m_SendCounterPacket(packet)
41             , m_CounterIdMap(counterIdMap)
42             , m_BackendProfilingContexts(backendProfilingContexts)
43     {}
~PeriodicCounterCapture()44     ~PeriodicCounterCapture() { Stop(); }
45 
46     void Start() override;
47     void Stop() override;
IsRunning() const48     bool IsRunning() const { return m_IsRunning; }
49 
50 private:
51     CaptureData ReadCaptureData();
52     void Capture(IReadCounterValues& readCounterValues);
53     void DispatchPeriodicCounterCapturePacket(
54             const armnn::BackendId& backendId, const std::vector<Timestamp>& timestampValues);
55 
56     const Holder&             m_CaptureDataHolder;
57     bool                      m_IsRunning;
58     std::atomic<bool>         m_KeepRunning;
59     std::thread               m_PeriodCaptureThread;
60     IReadCounterValues&       m_ReadCounterValues;
61     ISendCounterPacket&       m_SendCounterPacket;
62     const ICounterMappings&   m_CounterIdMap;
63     const std::unordered_map<armnn::BackendId,
64             std::shared_ptr<armnn::profiling::IBackendProfilingContext>>& m_BackendProfilingContexts;
65 };
66 
67 } // namespace profiling
68 
69 } // namespace armnn
70