• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #pragma once
7 
8 #include "CounterDirectory.hpp"
9 
10 #include <common/include/CommandHandlerFunctor.hpp>
11 
12 #include <atomic>
13 
14 namespace armnn
15 {
16 
17 namespace profiling
18 {
19 
20 struct CounterDirectoryEventRecord
21 {
22     uint16_t m_CounterClass;
23     std::string m_CounterDescription;
24     uint16_t m_CounterInterpolation;
25     double m_CounterMultiplier;
26     std::string m_CounterName;
27     uint16_t m_CounterSetUid;
28     uint16_t m_CounterUid;
29     Optional<std::string> m_CounterUnits;
30     uint16_t m_DeviceUid;
31     uint16_t m_MaxCounterUid;
32 };
33 
34 class DirectoryCaptureCommandHandler : public arm::pipe::CommandHandlerFunctor
35 {
36 
37 public:
DirectoryCaptureCommandHandler(uint32_t familyId,uint32_t packetId,uint32_t version,bool quietOperation=true)38     DirectoryCaptureCommandHandler(uint32_t familyId, uint32_t packetId, uint32_t version, bool quietOperation = true)
39         : CommandHandlerFunctor(familyId, packetId, version)
40         , m_QuietOperation(quietOperation)
41         , m_AlreadyParsed(false)
42     {}
43 
44     void operator()(const arm::pipe::Packet& packet) override;
45 
46     const ICounterDirectory& GetCounterDirectory() const;
47 
ParsedCounterDirectory()48     bool ParsedCounterDirectory()
49     {
50         return m_AlreadyParsed.load();
51     }
52 
53     /**
54      * Given a Uid that came from a copy of the counter directory translate it to the original.
55      *
56      * @param copyUid
57      * @return the original Uid that the copy maps to.
58      */
TranslateUIDCopyToOriginal(uint16_t copyUid)59     uint16_t TranslateUIDCopyToOriginal(uint16_t copyUid)
60     {
61         return m_UidTranslation[copyUid];
62     }
63 
64 private:
65     void ParseData(const arm::pipe::Packet& packet);
66 
67     void ReadCategoryRecords(const unsigned char* data, uint32_t offset, std::vector<uint32_t> categoryOffsets);
68 
69     std::vector<CounterDirectoryEventRecord>
70         ReadEventRecords(const unsigned char* data, uint32_t offset, std::vector<uint32_t> eventRecordsOffsets);
71 
72     std::string GetStringNameFromBuffer(const unsigned char* data, uint32_t offset);
73     bool IsValidChar(unsigned char c);
74 
75     CounterDirectory m_CounterDirectory;
76     std::unordered_map<uint16_t, uint16_t> m_UidTranslation;
77     bool m_QuietOperation;
78     // We can only parse the counter directory once per instance. It won't change anyway as it's static
79     // per instance of ArmNN.
80     std::atomic<bool> m_AlreadyParsed;
81 };
82 
83 }    // namespace profiling
84 
85 }    // namespace armnn
86