xref: /aosp_15_r20/external/armnn/src/profiling/test/ProfilingTestUtils.hpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker 
6*89c4ff92SAndroid Build Coastguard Worker #pragma once
7*89c4ff92SAndroid Build Coastguard Worker 
8*89c4ff92SAndroid Build Coastguard Worker #include "Runtime.hpp"
9*89c4ff92SAndroid Build Coastguard Worker 
10*89c4ff92SAndroid Build Coastguard Worker #include <client/src/BufferManager.hpp>
11*89c4ff92SAndroid Build Coastguard Worker #include <client/src/ProfilingService.hpp>
12*89c4ff92SAndroid Build Coastguard Worker #include <client/src/ProfilingUtils.hpp>
13*89c4ff92SAndroid Build Coastguard Worker 
14*89c4ff92SAndroid Build Coastguard Worker 
15*89c4ff92SAndroid Build Coastguard Worker #include <armnn/profiling/ArmNNProfiling.hpp>
16*89c4ff92SAndroid Build Coastguard Worker 
17*89c4ff92SAndroid Build Coastguard Worker #include <common/include/Optional.hpp>
18*89c4ff92SAndroid Build Coastguard Worker #include <common/include/ProfilingGuid.hpp>
19*89c4ff92SAndroid Build Coastguard Worker 
20*89c4ff92SAndroid Build Coastguard Worker using namespace armnn;
21*89c4ff92SAndroid Build Coastguard Worker using namespace arm::pipe;
22*89c4ff92SAndroid Build Coastguard Worker 
23*89c4ff92SAndroid Build Coastguard Worker const static uint32_t bodyHeaderSize = 6;
24*89c4ff92SAndroid Build Coastguard Worker 
25*89c4ff92SAndroid Build Coastguard Worker uint32_t GetStreamMetaDataPacketSize();
26*89c4ff92SAndroid Build Coastguard Worker 
27*89c4ff92SAndroid Build Coastguard Worker /// Returns a vector of CpuRef, CpuAcc or GpuAcc backends if they where registered
28*89c4ff92SAndroid Build Coastguard Worker std::vector<BackendId> GetSuitableBackendRegistered();
29*89c4ff92SAndroid Build Coastguard Worker 
30*89c4ff92SAndroid Build Coastguard Worker inline unsigned int OffsetToNextWord(unsigned int numberOfBytes);
31*89c4ff92SAndroid Build Coastguard Worker 
32*89c4ff92SAndroid Build Coastguard Worker void VerifyTimelineHeaderBinary(const unsigned char* readableData,
33*89c4ff92SAndroid Build Coastguard Worker                                 unsigned int& offset,
34*89c4ff92SAndroid Build Coastguard Worker                                 uint32_t packetDataLength);
35*89c4ff92SAndroid Build Coastguard Worker 
36*89c4ff92SAndroid Build Coastguard Worker ProfilingGuid VerifyTimelineLabelBinaryPacketData(arm::pipe::Optional<ProfilingGuid> guid,
37*89c4ff92SAndroid Build Coastguard Worker                                                   const std::string& label,
38*89c4ff92SAndroid Build Coastguard Worker                                                   const unsigned char* readableData,
39*89c4ff92SAndroid Build Coastguard Worker                                                   unsigned int& offset);
40*89c4ff92SAndroid Build Coastguard Worker 
41*89c4ff92SAndroid Build Coastguard Worker void VerifyTimelineEventClassBinaryPacketData(ProfilingGuid guid,
42*89c4ff92SAndroid Build Coastguard Worker                                               ProfilingGuid nameGuid,
43*89c4ff92SAndroid Build Coastguard Worker                                               const unsigned char* readableData,
44*89c4ff92SAndroid Build Coastguard Worker                                               unsigned int& offset);
45*89c4ff92SAndroid Build Coastguard Worker 
46*89c4ff92SAndroid Build Coastguard Worker void VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType relationshipType,
47*89c4ff92SAndroid Build Coastguard Worker                                                 arm::pipe::Optional<ProfilingGuid> relationshipGuid,
48*89c4ff92SAndroid Build Coastguard Worker                                                 arm::pipe::Optional<ProfilingGuid> headGuid,
49*89c4ff92SAndroid Build Coastguard Worker                                                 arm::pipe::Optional<ProfilingGuid> tailGuid,
50*89c4ff92SAndroid Build Coastguard Worker                                                 arm::pipe::Optional<ProfilingGuid> attributeGuid,
51*89c4ff92SAndroid Build Coastguard Worker                                                 const unsigned char* readableData,
52*89c4ff92SAndroid Build Coastguard Worker                                                 unsigned int& offset);
53*89c4ff92SAndroid Build Coastguard Worker 
54*89c4ff92SAndroid Build Coastguard Worker ProfilingGuid VerifyTimelineEntityBinaryPacketData(arm::pipe::Optional<ProfilingGuid> guid,
55*89c4ff92SAndroid Build Coastguard Worker                                                    const unsigned char* readableData,
56*89c4ff92SAndroid Build Coastguard Worker                                                    unsigned int& offset);
57*89c4ff92SAndroid Build Coastguard Worker 
58*89c4ff92SAndroid Build Coastguard Worker ProfilingGuid VerifyTimelineEventBinaryPacket(arm::pipe::Optional<uint64_t> timestamp,
59*89c4ff92SAndroid Build Coastguard Worker                                               arm::pipe::Optional<int> threadId,
60*89c4ff92SAndroid Build Coastguard Worker                                               arm::pipe::Optional<ProfilingGuid> eventGuid,
61*89c4ff92SAndroid Build Coastguard Worker                                               const unsigned char* readableData,
62*89c4ff92SAndroid Build Coastguard Worker                                               unsigned int& offset);
63*89c4ff92SAndroid Build Coastguard Worker 
64*89c4ff92SAndroid Build Coastguard Worker void VerifyPostOptimisationStructureTestImpl(armnn::BackendId backendId);
65*89c4ff92SAndroid Build Coastguard Worker 
66*89c4ff92SAndroid Build Coastguard Worker bool CompareOutput(std::vector<std::string> output, std::vector<std::string> expectedOutput);
67*89c4ff92SAndroid Build Coastguard Worker 
68*89c4ff92SAndroid Build Coastguard Worker namespace arm
69*89c4ff92SAndroid Build Coastguard Worker {
70*89c4ff92SAndroid Build Coastguard Worker 
71*89c4ff92SAndroid Build Coastguard Worker namespace pipe
72*89c4ff92SAndroid Build Coastguard Worker {
73*89c4ff92SAndroid Build Coastguard Worker 
74*89c4ff92SAndroid Build Coastguard Worker class ProfilingServiceRuntimeHelper : public ProfilingService
75*89c4ff92SAndroid Build Coastguard Worker {
76*89c4ff92SAndroid Build Coastguard Worker public:
ProfilingServiceRuntimeHelper(uint16_t maxGlobalCounterId,IInitialiseProfilingService & initialiser,arm::pipe::IProfilingService & profilingService)77*89c4ff92SAndroid Build Coastguard Worker     ProfilingServiceRuntimeHelper(uint16_t maxGlobalCounterId,
78*89c4ff92SAndroid Build Coastguard Worker                                   IInitialiseProfilingService& initialiser,
79*89c4ff92SAndroid Build Coastguard Worker                                   arm::pipe::IProfilingService& profilingService)
80*89c4ff92SAndroid Build Coastguard Worker         : ProfilingService(maxGlobalCounterId,
81*89c4ff92SAndroid Build Coastguard Worker                            initialiser,
82*89c4ff92SAndroid Build Coastguard Worker                            arm::pipe::ARMNN_SOFTWARE_INFO,
83*89c4ff92SAndroid Build Coastguard Worker                            arm::pipe::ARMNN_SOFTWARE_VERSION,
84*89c4ff92SAndroid Build Coastguard Worker                            arm::pipe::ARMNN_HARDWARE_VERSION),
85*89c4ff92SAndroid Build Coastguard Worker           m_ProfilingService(profilingService) {}
86*89c4ff92SAndroid Build Coastguard Worker     ~ProfilingServiceRuntimeHelper() = default;
87*89c4ff92SAndroid Build Coastguard Worker 
GetProfilingBufferManager()88*89c4ff92SAndroid Build Coastguard Worker     BufferManager& GetProfilingBufferManager()
89*89c4ff92SAndroid Build Coastguard Worker     {
90*89c4ff92SAndroid Build Coastguard Worker         return GetBufferManager(static_cast<arm::pipe::ProfilingService&>(m_ProfilingService));
91*89c4ff92SAndroid Build Coastguard Worker     }
92*89c4ff92SAndroid Build Coastguard Worker     arm::pipe::IProfilingService& m_ProfilingService;
93*89c4ff92SAndroid Build Coastguard Worker 
ForceTransitionToState(ProfilingState newState)94*89c4ff92SAndroid Build Coastguard Worker     void ForceTransitionToState(ProfilingState newState)
95*89c4ff92SAndroid Build Coastguard Worker     {
96*89c4ff92SAndroid Build Coastguard Worker         TransitionToState(static_cast<arm::pipe::ProfilingService&>(m_ProfilingService), newState);
97*89c4ff92SAndroid Build Coastguard Worker     }
98*89c4ff92SAndroid Build Coastguard Worker };
99*89c4ff92SAndroid Build Coastguard Worker 
100*89c4ff92SAndroid Build Coastguard Worker struct LogLevelSwapper
101*89c4ff92SAndroid Build Coastguard Worker {
102*89c4ff92SAndroid Build Coastguard Worker public:
LogLevelSwapperarm::pipe::LogLevelSwapper103*89c4ff92SAndroid Build Coastguard Worker     LogLevelSwapper(arm::pipe::LogSeverity severity)
104*89c4ff92SAndroid Build Coastguard Worker     {
105*89c4ff92SAndroid Build Coastguard Worker         // Set the new log level
106*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::ConfigureLogging(true, true, severity);
107*89c4ff92SAndroid Build Coastguard Worker     }
~LogLevelSwapperarm::pipe::LogLevelSwapper108*89c4ff92SAndroid Build Coastguard Worker     ~LogLevelSwapper()
109*89c4ff92SAndroid Build Coastguard Worker     {
110*89c4ff92SAndroid Build Coastguard Worker         // The default log level for unit tests is "Fatal"
111*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::ConfigureLogging(true, true, arm::pipe::LogSeverity::Fatal);
112*89c4ff92SAndroid Build Coastguard Worker     }
113*89c4ff92SAndroid Build Coastguard Worker };
114*89c4ff92SAndroid Build Coastguard Worker 
115*89c4ff92SAndroid Build Coastguard Worker struct StreamRedirector
116*89c4ff92SAndroid Build Coastguard Worker {
117*89c4ff92SAndroid Build Coastguard Worker public:
StreamRedirectorarm::pipe::StreamRedirector118*89c4ff92SAndroid Build Coastguard Worker     StreamRedirector(std::ostream& stream, std::streambuf* newStreamBuffer)
119*89c4ff92SAndroid Build Coastguard Worker         : m_Stream(stream)
120*89c4ff92SAndroid Build Coastguard Worker         , m_BackupBuffer(m_Stream.rdbuf(newStreamBuffer))
121*89c4ff92SAndroid Build Coastguard Worker     {}
122*89c4ff92SAndroid Build Coastguard Worker 
~StreamRedirectorarm::pipe::StreamRedirector123*89c4ff92SAndroid Build Coastguard Worker     ~StreamRedirector() { CancelRedirect(); }
124*89c4ff92SAndroid Build Coastguard Worker 
CancelRedirectarm::pipe::StreamRedirector125*89c4ff92SAndroid Build Coastguard Worker     void CancelRedirect()
126*89c4ff92SAndroid Build Coastguard Worker     {
127*89c4ff92SAndroid Build Coastguard Worker         // Only cancel the redirect once.
128*89c4ff92SAndroid Build Coastguard Worker         if (m_BackupBuffer != nullptr )
129*89c4ff92SAndroid Build Coastguard Worker         {
130*89c4ff92SAndroid Build Coastguard Worker             m_Stream.rdbuf(m_BackupBuffer);
131*89c4ff92SAndroid Build Coastguard Worker             m_BackupBuffer = nullptr;
132*89c4ff92SAndroid Build Coastguard Worker         }
133*89c4ff92SAndroid Build Coastguard Worker     }
134*89c4ff92SAndroid Build Coastguard Worker 
135*89c4ff92SAndroid Build Coastguard Worker private:
136*89c4ff92SAndroid Build Coastguard Worker     std::ostream& m_Stream;
137*89c4ff92SAndroid Build Coastguard Worker     std::streambuf* m_BackupBuffer;
138*89c4ff92SAndroid Build Coastguard Worker };
139*89c4ff92SAndroid Build Coastguard Worker 
140*89c4ff92SAndroid Build Coastguard Worker } // namespace pipe
141*89c4ff92SAndroid Build Coastguard Worker 
142*89c4ff92SAndroid Build Coastguard Worker } // namespace arm
143