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