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