blob: bf2c08b45fa0967096784dcc1275b86cbd72716e [file] [log] [blame]
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +00001//
Jim Flynn6398a982020-05-27 17:05:21 +01002// Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +00003// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
Keith Davis33ed2212020-03-30 10:43:41 +01008#include "Runtime.hpp"
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +00009
Jim Flynn3e9bc192022-03-23 23:01:26 +000010#include <client/src/BufferManager.hpp>
11#include <client/src/ProfilingService.hpp>
12#include <client/src/ProfilingUtils.hpp>
13
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000014
Jim Flynn9c85b412022-03-16 00:27:43 +000015#include <armnn/profiling/ArmNNProfiling.hpp>
16
Jim Flynndecd08b2022-03-13 22:35:46 +000017#include <common/include/Optional.hpp>
Nikhil Raj77fe76b2021-06-09 14:55:32 +010018#include <common/include/ProfilingGuid.hpp>
19
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000020using namespace armnn;
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000021using namespace arm::pipe;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000022
Finn Williams985fecf2020-04-30 11:06:43 +010023const static uint32_t bodyHeaderSize = 6;
24
Finn Williamsa0de0562020-04-22 12:27:37 +010025uint32_t GetStreamMetaDataPacketSize();
26
Jan Eilersf78c7672020-07-01 18:09:39 +010027/// Returns a vector of CpuRef, CpuAcc or GpuAcc backends if they where registered
28std::vector<BackendId> GetSuitableBackendRegistered();
29
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000030inline unsigned int OffsetToNextWord(unsigned int numberOfBytes);
31
Keith Davis97da5e22020-03-05 16:25:28 +000032void VerifyTimelineHeaderBinary(const unsigned char* readableData,
33 unsigned int& offset,
34 uint32_t packetDataLength);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000035
Jim Flynndecd08b2022-03-13 22:35:46 +000036ProfilingGuid VerifyTimelineLabelBinaryPacketData(arm::pipe::Optional<ProfilingGuid> guid,
Jim Flynn6398a982020-05-27 17:05:21 +010037 const std::string& label,
38 const unsigned char* readableData,
39 unsigned int& offset);
Keith Davis97da5e22020-03-05 16:25:28 +000040
41void VerifyTimelineEventClassBinaryPacketData(ProfilingGuid guid,
Jim Flynn1892d212020-05-26 21:10:49 +010042 ProfilingGuid nameGuid,
Keith Davis97da5e22020-03-05 16:25:28 +000043 const unsigned char* readableData,
44 unsigned int& offset);
45
46void VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType relationshipType,
Jim Flynndecd08b2022-03-13 22:35:46 +000047 arm::pipe::Optional<ProfilingGuid> relationshipGuid,
48 arm::pipe::Optional<ProfilingGuid> headGuid,
49 arm::pipe::Optional<ProfilingGuid> tailGuid,
50 arm::pipe::Optional<ProfilingGuid> attributeGuid,
Keith Davis97da5e22020-03-05 16:25:28 +000051 const unsigned char* readableData,
52 unsigned int& offset);
53
Jim Flynndecd08b2022-03-13 22:35:46 +000054ProfilingGuid VerifyTimelineEntityBinaryPacketData(arm::pipe::Optional<ProfilingGuid> guid,
Jim Flynn6398a982020-05-27 17:05:21 +010055 const unsigned char* readableData,
56 unsigned int& offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000057
Jim Flynndecd08b2022-03-13 22:35:46 +000058ProfilingGuid VerifyTimelineEventBinaryPacket(arm::pipe::Optional<uint64_t> timestamp,
59 arm::pipe::Optional<int> threadId,
60 arm::pipe::Optional<ProfilingGuid> eventGuid,
Jim Flynn6398a982020-05-27 17:05:21 +010061 const unsigned char* readableData,
62 unsigned int& offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000063
64void VerifyPostOptimisationStructureTestImpl(armnn::BackendId backendId);
65
Jim Flynn6398a982020-05-27 17:05:21 +010066bool CompareOutput(std::vector<std::string> output, std::vector<std::string> expectedOutput);
67
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000068namespace arm
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000069{
70
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000071namespace pipe
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000072{
73
74class ProfilingServiceRuntimeHelper : public ProfilingService
75{
76public:
Jim Flynn34430252022-03-04 15:03:58 +000077 ProfilingServiceRuntimeHelper(uint16_t maxGlobalCounterId,
78 IInitialiseProfilingService& initialiser,
79 arm::pipe::IProfilingService& profilingService)
Jim Flynn9c85b412022-03-16 00:27:43 +000080 : ProfilingService(maxGlobalCounterId,
81 initialiser,
82 arm::pipe::ARMNN_SOFTWARE_INFO,
83 arm::pipe::ARMNN_SOFTWARE_VERSION,
84 arm::pipe::ARMNN_HARDWARE_VERSION),
85 m_ProfilingService(profilingService) {}
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000086 ~ProfilingServiceRuntimeHelper() = default;
87
88 BufferManager& GetProfilingBufferManager()
89 {
Jim Flynn34430252022-03-04 15:03:58 +000090 return GetBufferManager(static_cast<arm::pipe::ProfilingService&>(m_ProfilingService));
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000091 }
Jim Flynn34430252022-03-04 15:03:58 +000092 arm::pipe::IProfilingService& m_ProfilingService;
Keith Davis33ed2212020-03-30 10:43:41 +010093
94 void ForceTransitionToState(ProfilingState newState)
95 {
Jim Flynn34430252022-03-04 15:03:58 +000096 TransitionToState(static_cast<arm::pipe::ProfilingService&>(m_ProfilingService), newState);
Keith Davis33ed2212020-03-30 10:43:41 +010097 }
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000098};
99
Jim Flynn6c9f17d2022-03-10 23:13:01 +0000100struct LogLevelSwapper
101{
102public:
103 LogLevelSwapper(arm::pipe::LogSeverity severity)
104 {
105 // Set the new log level
106 arm::pipe::ConfigureLogging(true, true, severity);
107 }
108 ~LogLevelSwapper()
109 {
110 // The default log level for unit tests is "Fatal"
111 arm::pipe::ConfigureLogging(true, true, arm::pipe::LogSeverity::Fatal);
112 }
113};
114
115struct StreamRedirector
116{
117public:
118 StreamRedirector(std::ostream& stream, std::streambuf* newStreamBuffer)
119 : m_Stream(stream)
120 , m_BackupBuffer(m_Stream.rdbuf(newStreamBuffer))
121 {}
122
123 ~StreamRedirector() { CancelRedirect(); }
124
125 void CancelRedirect()
126 {
127 // Only cancel the redirect once.
128 if (m_BackupBuffer != nullptr )
129 {
130 m_Stream.rdbuf(m_BackupBuffer);
131 m_BackupBuffer = nullptr;
132 }
133 }
134
135private:
136 std::ostream& m_Stream;
137 std::streambuf* m_BackupBuffer;
138};
139
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000140} // namespace pipe
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000141
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000142} // namespace arm