blob: 3e0a8a2cec960f8167553e96d9542a2a7d96b350 [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
Narumol Prangnawarat404b2752019-09-24 17:23:16 +010010#include "IPacketBuffer.hpp"
11
Matteo Martincigh6db5f202019-09-05 12:02:04 +010012#include <boost/numeric/conversion/cast.hpp>
13
Matteo Martincigh6db5f202019-09-05 12:02:04 +010014#include <algorithm>
15#include <cstring>
Narumol Prangnawarat404b2752019-09-24 17:23:16 +010016#include <memory>
17#include <string>
18#include <vector>
Matteo Martincigh378bbfc2019-11-04 14:05:28 +000019#include <thread>
Ferran Balaguer73882172019-09-02 16:39:42 +010020
21namespace armnn
22{
23
24namespace profiling
25{
26
Sadik Armagan7bbdf9d2019-10-24 10:26:05 +010027struct SwTraceMessage
28{
29 uint32_t id;
30 std::string name;
31 std::string uiName;
32 std::vector<char> argTypes;
33 std::vector<std::string> argNames;
34};
35
Matteo Martincigh6db5f202019-09-05 12:02:04 +010036struct SwTraceCharPolicy
37{
38 static bool IsValidChar(unsigned char c)
39 {
40 // Check that the given character has ASCII 7-bit encoding
41 return c < 128;
42 }
43};
44
45struct SwTraceNameCharPolicy
46{
47 static bool IsValidChar(unsigned char c)
48 {
49 // Check that the given character has ASCII 7-bit encoding, alpha-numeric and underscore only
50 return c < 128 && (std::isalnum(c) || c == '_');
51 }
52};
53
54template <typename SwTracePolicy>
55bool IsValidSwTraceString(const std::string& s)
56{
57 // Check that all the characters in the given string conform to the given policy
58 return std::all_of(s.begin(), s.end(), [](unsigned char c)
59 {
60 return SwTracePolicy::IsValidChar(c);
61 });
62}
63
64template <typename SwTracePolicy>
65bool StringToSwTraceString(const std::string& s, std::vector<uint32_t>& outputBuffer)
66{
67 // Converts the given string to an SWTrace "string" (i.e. a string of "chars"), and writes it into
68 // the given buffer including the null-terminator. It also pads it to the next uint32_t if necessary
69
70 // Clear the output buffer
71 outputBuffer.clear();
72
73 // Check that the given string is a valid SWTrace "string" (i.e. a string of "chars")
74 if (!IsValidSwTraceString<SwTracePolicy>(s))
75 {
76 return false;
77 }
78
79 // Prepare the output buffer
80 size_t s_size = s.size() + 1; // The size of the string (in chars) plus the null-terminator
81 size_t uint32_t_size = sizeof(uint32_t);
82 size_t outBufferSize = 1 + s_size / uint32_t_size + (s_size % uint32_t_size != 0 ? 1 : 0);
83 outputBuffer.resize(outBufferSize, '\0');
84
85 // Write the SWTrace string to the output buffer
86 outputBuffer[0] = boost::numeric_cast<uint32_t>(s_size);
87 std::memcpy(outputBuffer.data() + 1, s.data(), s_size);
88
89 return true;
90}
91
92uint16_t GetNextUid(bool peekOnly = false);
93
94std::vector<uint16_t> GetNextCounterUids(uint16_t cores);
Matteo Martincighab173e92019-09-05 12:02:04 +010095
Matteo Martincigh378bbfc2019-11-04 14:05:28 +000096void WriteBytes(const IPacketBuffer& packetBuffer, unsigned int offset, const void* value, unsigned int valueSize);
97
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000098void WriteUint64(const IPacketBufferPtr& packetBuffer, unsigned int offset, uint64_t value);
Narumol Prangnawarat404b2752019-09-24 17:23:16 +010099
Matteo Martincigh2ffcc412019-11-05 11:47:40 +0000100void WriteUint32(const IPacketBufferPtr& packetBuffer, unsigned int offset, uint32_t value);
Narumol Prangnawarat404b2752019-09-24 17:23:16 +0100101
Matteo Martincigh2ffcc412019-11-05 11:47:40 +0000102void WriteUint16(const IPacketBufferPtr& packetBuffer, unsigned int offset, uint16_t value);
Narumol Prangnawarat404b2752019-09-24 17:23:16 +0100103
Matteo Martincigh378bbfc2019-11-04 14:05:28 +0000104void WriteBytes(unsigned char* buffer, unsigned int offset, const void* value, unsigned int valueSize);
105
Francis Murtagh3a161982019-09-04 15:25:02 +0100106void WriteUint64(unsigned char* buffer, unsigned int offset, uint64_t value);
107
Ferran Balaguer73882172019-09-02 16:39:42 +0100108void WriteUint32(unsigned char* buffer, unsigned int offset, uint32_t value);
109
110void WriteUint16(unsigned char* buffer, unsigned int offset, uint16_t value);
111
Matteo Martincigh378bbfc2019-11-04 14:05:28 +0000112void ReadBytes(const IPacketBufferPtr& packetBuffer, unsigned int offset, unsigned int valueSize, uint8_t outValue[]);
113
Matteo Martincigh2ffcc412019-11-05 11:47:40 +0000114uint64_t ReadUint64(const IPacketBufferPtr& packetBuffer, unsigned int offset);
Francis Murtagh3a161982019-09-04 15:25:02 +0100115
Matteo Martincigh2ffcc412019-11-05 11:47:40 +0000116uint32_t ReadUint32(const IPacketBufferPtr& packetBuffer, unsigned int offset);
Ferran Balaguer73882172019-09-02 16:39:42 +0100117
Matteo Martincigh2ffcc412019-11-05 11:47:40 +0000118uint16_t ReadUint16(const IPacketBufferPtr& packetBuffer, unsigned int offset);
Ferran Balaguer73882172019-09-02 16:39:42 +0100119
Matteo Martincigh2ffcc412019-11-05 11:47:40 +0000120uint8_t ReadUint8(const IPacketBufferPtr& packetBuffer, unsigned int offset);
Narumol Prangnawarat404b2752019-09-24 17:23:16 +0100121
Matteo Martincigh378bbfc2019-11-04 14:05:28 +0000122void ReadBytes(const unsigned char* buffer, unsigned int offset, unsigned int valueSize, uint8_t outValue[]);
123
Narumol Prangnawarat404b2752019-09-24 17:23:16 +0100124uint64_t ReadUint64(unsigned const char* buffer, unsigned int offset);
125
126uint32_t ReadUint32(unsigned const char* buffer, unsigned int offset);
127
128uint16_t ReadUint16(unsigned const char* buffer, unsigned int offset);
129
130uint8_t ReadUint8(unsigned const char* buffer, unsigned int offset);
Matteo Martincigh42f9d9e2019-09-05 12:02:04 +0100131
Ferran Balaguer47d0fe92019-09-04 16:47:34 +0100132std::string GetSoftwareInfo();
133
134std::string GetSoftwareVersion();
135
136std::string GetHardwareVersion();
137
138std::string GetProcessName();
139
Matteo Martincigh0aed4f92019-10-01 14:25:34 +0100140enum class TimelinePacketStatus
141{
142 Ok,
143 Error,
144 BufferExhaustion
145};
146
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100147enum class ProfilingRelationshipType
148{
149 RetentionLink, /// Head retains(parents) Tail
150 ExecutionLink, /// Head execution start depends on Tail execution completion
151 DataLink, /// Head uses data of Tail
152 LabelLink /// Head uses label Tail (Tail MUST be a guid of a label).
153};
154
Sadik Armagan7bbdf9d2019-10-24 10:26:05 +0100155uint32_t CalculateSizeOfPaddedSwString(const std::string& str);
156
Matteo Martincigh2ffcc412019-11-05 11:47:40 +0000157SwTraceMessage ReadSwTraceMessage(const IPacketBufferPtr& packetBuffer, unsigned int& offset);
Sadik Armagan7bbdf9d2019-10-24 10:26:05 +0100158
Matteo Martincigh0aed4f92019-10-01 14:25:34 +0100159TimelinePacketStatus WriteTimelineLabelBinaryPacket(uint64_t profilingGuid,
160 const std::string& label,
161 unsigned char* buffer,
162 unsigned int bufferSize,
163 unsigned int& numberOfBytesWritten);
164
David Monahanf21f6062019-10-07 15:11:15 +0100165TimelinePacketStatus WriteTimelineEntityBinaryPacket(uint64_t profilingGuid,
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100166 unsigned char* buffer,
167 unsigned int bufferSize,
168 unsigned int& numberOfBytesWritten);
David Monahanf21f6062019-10-07 15:11:15 +0100169
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100170TimelinePacketStatus WriteTimelineRelationshipBinaryPacket(ProfilingRelationshipType relationshipType,
171 uint64_t relationshipGuid,
172 uint64_t headGuid,
173 uint64_t tailGuid,
174 unsigned char* buffer,
175 unsigned int bufferSize,
176 unsigned int& numberOfBytesWritten);
177
Sadik Armagan784db772019-10-08 15:05:38 +0100178TimelinePacketStatus WriteTimelineMessageDirectoryPackage(unsigned char* buffer,
179 unsigned int bufferSize,
180 unsigned int& numberOfBytesWritten);
181
Jan Eilers92fa15b2019-10-15 15:23:25 +0100182TimelinePacketStatus WriteTimelineEventClassBinaryPacket(uint64_t profilingGuid,
183 unsigned char* buffer,
184 unsigned int bufferSize,
185 unsigned int& numberOfBytesWritten);
186
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100187TimelinePacketStatus WriteTimelineEventBinaryPacket(uint64_t timestamp,
Matteo Martincigh378bbfc2019-11-04 14:05:28 +0000188 std::thread::id threadId,
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100189 uint64_t profilingGuid,
190 unsigned char* buffer,
191 unsigned int bufferSize,
192 unsigned int& numberOfBytesWritten);
193
Francis Murtagh3a161982019-09-04 15:25:02 +0100194class BufferExhaustion : public armnn::Exception
195{
196 using Exception::Exception;
197};
198
Ferran Balaguer73882172019-09-02 16:39:42 +0100199} // namespace profiling
200
Ferran Balaguer47d0fe92019-09-04 16:47:34 +0100201} // namespace armnn
Matteo Martincigh378bbfc2019-11-04 14:05:28 +0000202
203namespace std
204{
205
206bool operator==(const std::vector<uint8_t>& left, std::thread::id right);
207
208} // namespace std