10 #include <boost/numeric/conversion/cast.hpp> 11 #include <boost/format.hpp> 21 void PeriodicCounterSelectionCommandHandler::ParseData(
const arm::pipe::Packet& packet, CaptureData& captureData)
23 std::vector<uint16_t> counterIds;
28 if (packet.GetLength() < 4)
35 uint32_t capturePeriod =
ReadUint32(packet.GetData(), offset);
38 captureData.SetCapturePeriod(capturePeriod);
41 unsigned int counters = (packet.GetLength() - 4) / 2;
44 counterIds.reserve(counters);
45 offset += sizeOfUint32;
46 for (
unsigned int i = 0; i < counters; ++i)
49 uint16_t counterId =
ReadUint16(packet.GetData(), offset);
50 counterIds.emplace_back(counterId);
51 offset += sizeOfUint16;
56 captureData.SetCounterIds(counterIds);
67 throw RuntimeException(boost::str(boost::format(
"Periodic Counter Selection Command Handler invoked while in " 68 "an wrong state: %1%")
73 if (!(packet.GetPacketFamily() == 0u && packet.GetPacketId() == 4u))
76 "received family = %1%, id = %2%")
77 % packet.GetPacketFamily()
78 % packet.GetPacketId()));
83 ParseData(packet, captureData);
92 const std::vector<uint16_t>& counterIds = captureData.
GetCounterIds();
95 std::vector<uint16_t> validCounterIds;
96 for (uint16_t counterId : counterIds)
105 validCounterIds.emplace_back(counterId);
108 std::sort(validCounterIds.begin(), validCounterIds.end());
110 auto backendIdStart = std::find_if(validCounterIds.begin(), validCounterIds.end(), [&](uint16_t& counterId)
112 return counterId > m_MaxArmCounterId;
115 std::set<armnn::BackendId> activeBackends;
116 std::set<uint16_t> backendCounterIds = std::set<uint16_t>(backendIdStart, validCounterIds.end());
118 if (m_BackendCounterMap.size() != 0)
120 std::set<uint16_t> newCounterIds;
121 std::set<uint16_t> unusedCounterIds;
124 std::set_difference(backendCounterIds.begin(), backendCounterIds.end(),
125 m_PrevBackendCounterIds.begin(), m_PrevBackendCounterIds.end(),
126 std::inserter(newCounterIds, newCounterIds.begin()));
129 std::set_difference(m_PrevBackendCounterIds.begin(), m_PrevBackendCounterIds.end(),
130 backendCounterIds.begin(), backendCounterIds.end(),
131 std::inserter(unusedCounterIds, unusedCounterIds.begin()));
133 activeBackends = ProcessBackendCounterIds(capturePeriod, newCounterIds, unusedCounterIds);
137 activeBackends = ProcessBackendCounterIds(capturePeriod, backendCounterIds, {});
141 m_PrevBackendCounterIds = backendCounterIds;
144 m_CaptureDataHolder.
SetCaptureData(capturePeriod, {validCounterIds.begin(), backendIdStart}, activeBackends);
149 if (capturePeriod == 0 || validCounterIds.empty())
152 m_PeriodicCounterCapture.
Stop();
157 m_PeriodicCounterCapture.
Start();
163 throw RuntimeException(boost::str(boost::format(
"Unknown profiling service state: %1%")
164 % static_cast<int>(currentState)));
168 std::set<armnn::BackendId> PeriodicCounterSelectionCommandHandler::ProcessBackendCounterIds(
169 const uint32_t capturePeriod,
170 const std::set<uint16_t> newCounterIds,
171 const std::set<uint16_t> unusedCounterIds)
173 std::set<armnn::BackendId> changedBackends;
176 for (uint16_t counterId : newCounterIds)
178 auto backendId = m_CounterIdMap.
GetBackendId(counterId);
179 m_BackendCounterMap[backendId.second].emplace_back(backendId.first);
180 changedBackends.insert(backendId.second);
183 activeBackends.insert(changedBackends.begin(), changedBackends.end());
185 for (uint16_t counterId : unusedCounterIds)
187 auto backendId = m_CounterIdMap.
GetBackendId(counterId);
188 std::vector<uint16_t>& backendCounters = m_BackendCounterMap[backendId.second];
190 backendCounters.erase(std::remove(backendCounters.begin(), backendCounters.end(), backendId.first));
192 if(backendCounters.size() == 0)
196 activeBackends.erase(backendId.second);
197 ActivateBackedCounters(backendId.second, 0, {});
201 changedBackends.insert(backendId.second);
206 if(capturePeriod == m_PrevCapturePeriod)
208 for (
auto backend : changedBackends)
210 ActivateBackedCounters(backend, capturePeriod, m_BackendCounterMap[backend]);
216 for (
auto backend : m_BackendCounterMap)
218 ActivateBackedCounters(backend.first, capturePeriod, backend.second);
220 if(capturePeriod == 0)
224 m_PrevCapturePeriod = capturePeriod;
227 return activeBackends;
ProfilingState GetCurrentState() const
const std::set< armnn::BackendId > & GetActiveBackends() const
const std::vector< uint16_t > & GetCounterIds() const
virtual void SendPeriodicCounterSelectionPacket(uint32_t capturePeriod, const std::vector< uint16_t > &selectedCounterIds)=0
Create and write a PeriodicCounterSelectionPacket from the parameters to the buffer.
uint16_t ReadUint16(const IPacketBufferPtr &packetBuffer, unsigned int offset)
Copyright (c) 2020 ARM Limited.
uint32_t GetCapturePeriod() const
CaptureData GetCaptureData() const
void SetCaptureData(uint32_t capturePeriod, const std::vector< uint16_t > &counterIds, const std::set< armnn::BackendId > &activeBackends)
std::enable_if_t< std::is_unsigned< Source >::value &&std::is_unsigned< Dest >::value, Dest > numeric_cast(Source source)
constexpr unsigned int LOWEST_CAPTURE_PERIOD
The lowest performance data capture interval we support is 10 miliseconds.
virtual bool IsCounterRegistered(uint16_t counterUid) const =0
uint32_t ReadUint32(const IPacketBufferPtr &packetBuffer, unsigned int offset)
void operator()(const arm::pipe::Packet &packet) override
virtual const std::pair< uint16_t, armnn::BackendId > & GetBackendId(uint16_t globalCounterId) const =0
constexpr char const * GetProfilingStateName(ProfilingState state)