blob: fae1a83024b43b1cc7d51315c30f83e402ba65e2 [file] [log] [blame]
Ferran Balaguer73882172019-09-02 16:39:42 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
Francis Murtagh3a161982019-09-04 15:25:02 +01008#include <armnn/Exceptions.hpp>
9
Keith Davis3201eea2019-10-24 17:30:41 +010010#include "ICounterDirectory.hpp"
Narumol Prangnawarat404b2752019-09-24 17:23:16 +010011#include "IPacketBuffer.hpp"
12
Matteo Martincigh6db5f202019-09-05 12:02:04 +010013#include <boost/numeric/conversion/cast.hpp>
14
Matteo Martincigh6db5f202019-09-05 12:02:04 +010015#include <algorithm>
16#include <cstring>
Narumol Prangnawarat404b2752019-09-24 17:23:16 +010017#include <memory>
18#include <string>
19#include <vector>
Matteo Martincigh378bbfc2019-11-04 14:05:28 +000020#include <thread>
Ferran Balaguer73882172019-09-02 16:39:42 +010021
22namespace armnn
23{
24
25namespace profiling
26{
27
Sadik Armagan7bbdf9d2019-10-24 10:26:05 +010028struct SwTraceMessage
29{
30 uint32_t id;
31 std::string name;
32 std::string uiName;
33 std::vector<char> argTypes;
34 std::vector<std::string> argNames;
35};
36
Matteo Martincigh6db5f202019-09-05 12:02:04 +010037struct SwTraceCharPolicy
38{
39 static bool IsValidChar(unsigned char c)
40 {
41 // Check that the given character has ASCII 7-bit encoding
42 return c < 128;
43 }
44};
45
46struct SwTraceNameCharPolicy
47{
48 static bool IsValidChar(unsigned char c)
49 {
50 // Check that the given character has ASCII 7-bit encoding, alpha-numeric and underscore only
51 return c < 128 && (std::isalnum(c) || c == '_');
52 }
53};
54
55template <typename SwTracePolicy>
56bool IsValidSwTraceString(const std::string& s)
57{
58 // Check that all the characters in the given string conform to the given policy
Keith Davis3201eea2019-10-24 17:30:41 +010059 return std::all_of(s.begin(), s.end(), [](unsigned char c) { return SwTracePolicy::IsValidChar(c); });
Matteo Martincigh6db5f202019-09-05 12:02:04 +010060}
61
62template <typename SwTracePolicy>
63bool StringToSwTraceString(const std::string& s, std::vector<uint32_t>& outputBuffer)
64{
65 // Converts the given string to an SWTrace "string" (i.e. a string of "chars"), and writes it into
66 // the given buffer including the null-terminator. It also pads it to the next uint32_t if necessary
67
68 // Clear the output buffer
69 outputBuffer.clear();
70
71 // Check that the given string is a valid SWTrace "string" (i.e. a string of "chars")
72 if (!IsValidSwTraceString<SwTracePolicy>(s))
73 {
74 return false;
75 }
76
77 // Prepare the output buffer
Keith Davis3201eea2019-10-24 17:30:41 +010078 size_t s_size = s.size() + 1; // The size of the string (in chars) plus the null-terminator
Matteo Martincigh6db5f202019-09-05 12:02:04 +010079 size_t uint32_t_size = sizeof(uint32_t);
80 size_t outBufferSize = 1 + s_size / uint32_t_size + (s_size % uint32_t_size != 0 ? 1 : 0);
81 outputBuffer.resize(outBufferSize, '\0');
82
83 // Write the SWTrace string to the output buffer
84 outputBuffer[0] = boost::numeric_cast<uint32_t>(s_size);
85 std::memcpy(outputBuffer.data() + 1, s.data(), s_size);
86
87 return true;
88}
89
90uint16_t GetNextUid(bool peekOnly = false);
91
92std::vector<uint16_t> GetNextCounterUids(uint16_t cores);
Matteo Martincighab173e92019-09-05 12:02:04 +010093
Matteo Martincigh378bbfc2019-11-04 14:05:28 +000094void WriteBytes(const IPacketBuffer& packetBuffer, unsigned int offset, const void* value, unsigned int valueSize);
95
Keith Davis3201eea2019-10-24 17:30:41 +010096uint32_t ConstructHeader(uint32_t packetFamily, uint32_t packetId);
97
98uint32_t ConstructHeader(uint32_t packetFamily, uint32_t packetClass, uint32_t packetType);
99
Matteo Martincigh2ffcc412019-11-05 11:47:40 +0000100void WriteUint64(const IPacketBufferPtr& packetBuffer, unsigned int offset, uint64_t value);
Narumol Prangnawarat404b2752019-09-24 17:23:16 +0100101
Matteo Martincigh2ffcc412019-11-05 11:47:40 +0000102void WriteUint32(const IPacketBufferPtr& packetBuffer, unsigned int offset, uint32_t value);
Narumol Prangnawarat404b2752019-09-24 17:23:16 +0100103
Matteo Martincigh2ffcc412019-11-05 11:47:40 +0000104void WriteUint16(const IPacketBufferPtr& packetBuffer, unsigned int offset, uint16_t value);
Narumol Prangnawarat404b2752019-09-24 17:23:16 +0100105
Matteo Martincigh378bbfc2019-11-04 14:05:28 +0000106void WriteBytes(unsigned char* buffer, unsigned int offset, const void* value, unsigned int valueSize);
107
Francis Murtagh3a161982019-09-04 15:25:02 +0100108void WriteUint64(unsigned char* buffer, unsigned int offset, uint64_t value);
109
Ferran Balaguer73882172019-09-02 16:39:42 +0100110void WriteUint32(unsigned char* buffer, unsigned int offset, uint32_t value);
111
112void WriteUint16(unsigned char* buffer, unsigned int offset, uint16_t value);
113
Matteo Martincigh378bbfc2019-11-04 14:05:28 +0000114void ReadBytes(const IPacketBufferPtr& packetBuffer, unsigned int offset, unsigned int valueSize, uint8_t outValue[]);
115
Matteo Martincigh2ffcc412019-11-05 11:47:40 +0000116uint64_t ReadUint64(const IPacketBufferPtr& packetBuffer, unsigned int offset);
Francis Murtagh3a161982019-09-04 15:25:02 +0100117
Matteo Martincigh2ffcc412019-11-05 11:47:40 +0000118uint32_t ReadUint32(const IPacketBufferPtr& packetBuffer, unsigned int offset);
Ferran Balaguer73882172019-09-02 16:39:42 +0100119
Matteo Martincigh2ffcc412019-11-05 11:47:40 +0000120uint16_t ReadUint16(const IPacketBufferPtr& packetBuffer, unsigned int offset);
Ferran Balaguer73882172019-09-02 16:39:42 +0100121
Matteo Martincigh2ffcc412019-11-05 11:47:40 +0000122uint8_t ReadUint8(const IPacketBufferPtr& packetBuffer, unsigned int offset);
Narumol Prangnawarat404b2752019-09-24 17:23:16 +0100123
Matteo Martincigh378bbfc2019-11-04 14:05:28 +0000124void ReadBytes(const unsigned char* buffer, unsigned int offset, unsigned int valueSize, uint8_t outValue[]);
125
Narumol Prangnawarat404b2752019-09-24 17:23:16 +0100126uint64_t ReadUint64(unsigned const char* buffer, unsigned int offset);
127
128uint32_t ReadUint32(unsigned const char* buffer, unsigned int offset);
129
130uint16_t ReadUint16(unsigned const char* buffer, unsigned int offset);
131
132uint8_t ReadUint8(unsigned const char* buffer, unsigned int offset);
Matteo Martincigh42f9d9e2019-09-05 12:02:04 +0100133
Ferran Balaguer47d0fe92019-09-04 16:47:34 +0100134std::string GetSoftwareInfo();
135
136std::string GetSoftwareVersion();
137
138std::string GetHardwareVersion();
139
140std::string GetProcessName();
141
Matteo Martincigh0aed4f92019-10-01 14:25:34 +0100142enum class TimelinePacketStatus
143{
144 Ok,
145 Error,
146 BufferExhaustion
147};
148
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100149enum class ProfilingRelationshipType
150{
Keith Davis3201eea2019-10-24 17:30:41 +0100151 RetentionLink, /// Head retains(parents) Tail
152 ExecutionLink, /// Head execution start depends on Tail execution completion
153 DataLink, /// Head uses data of Tail
154 LabelLink /// Head uses label Tail (Tail MUST be a guid of a label).
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100155};
156
Sadik Armagan7bbdf9d2019-10-24 10:26:05 +0100157uint32_t CalculateSizeOfPaddedSwString(const std::string& str);
158
Matteo Martincigh2ffcc412019-11-05 11:47:40 +0000159SwTraceMessage ReadSwTraceMessage(const IPacketBufferPtr& packetBuffer, unsigned int& offset);
Sadik Armagan7bbdf9d2019-10-24 10:26:05 +0100160
Matteo Martincigh0aed4f92019-10-01 14:25:34 +0100161TimelinePacketStatus WriteTimelineLabelBinaryPacket(uint64_t profilingGuid,
162 const std::string& label,
163 unsigned char* buffer,
164 unsigned int bufferSize,
165 unsigned int& numberOfBytesWritten);
166
David Monahanf21f6062019-10-07 15:11:15 +0100167TimelinePacketStatus WriteTimelineEntityBinaryPacket(uint64_t profilingGuid,
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100168 unsigned char* buffer,
169 unsigned int bufferSize,
170 unsigned int& numberOfBytesWritten);
David Monahanf21f6062019-10-07 15:11:15 +0100171
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100172TimelinePacketStatus WriteTimelineRelationshipBinaryPacket(ProfilingRelationshipType relationshipType,
173 uint64_t relationshipGuid,
174 uint64_t headGuid,
175 uint64_t tailGuid,
176 unsigned char* buffer,
177 unsigned int bufferSize,
178 unsigned int& numberOfBytesWritten);
179
Sadik Armagan784db772019-10-08 15:05:38 +0100180TimelinePacketStatus WriteTimelineMessageDirectoryPackage(unsigned char* buffer,
181 unsigned int bufferSize,
182 unsigned int& numberOfBytesWritten);
183
Jan Eilers92fa15b2019-10-15 15:23:25 +0100184TimelinePacketStatus WriteTimelineEventClassBinaryPacket(uint64_t profilingGuid,
185 unsigned char* buffer,
186 unsigned int bufferSize,
187 unsigned int& numberOfBytesWritten);
188
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100189TimelinePacketStatus WriteTimelineEventBinaryPacket(uint64_t timestamp,
Matteo Martincigh378bbfc2019-11-04 14:05:28 +0000190 std::thread::id threadId,
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100191 uint64_t profilingGuid,
192 unsigned char* buffer,
193 unsigned int bufferSize,
194 unsigned int& numberOfBytesWritten);
195
Keith Davis3201eea2019-10-24 17:30:41 +0100196std::string CentreAlignFormatting(const std::string& stringToPass, const int spacingWidth);
197
198void PrintCounterDirectory(ICounterDirectory& counterDirectory);
199
Francis Murtagh3a161982019-09-04 15:25:02 +0100200class BufferExhaustion : public armnn::Exception
201{
202 using Exception::Exception;
203};
204
Keith Davis3201eea2019-10-24 17:30:41 +0100205} // namespace profiling
Ferran Balaguer73882172019-09-02 16:39:42 +0100206
Keith Davis3201eea2019-10-24 17:30:41 +0100207} // namespace armnn
Matteo Martincigh378bbfc2019-11-04 14:05:28 +0000208
209namespace std
210{
211
212bool operator==(const std::vector<uint8_t>& left, std::thread::id right);
213
214} // namespace std