1 // 2 // Copyright © 2019 Arm Ltd and Contributors. All rights reserved. 3 // SPDX-License-Identifier: MIT 4 // 5 6 #pragma once 7 8 #include <armnn/Exceptions.hpp> 9 #include <armnn/profiling/ISendTimelinePacket.hpp> 10 11 #include <armnn/utility/NumericCast.hpp> 12 13 #include "ICounterDirectory.hpp" 14 #include "IPacketBuffer.hpp" 15 16 #include <common/include/Packet.hpp> 17 18 #include <algorithm> 19 #include <cstring> 20 #include <memory> 21 #include <string> 22 #include <thread> 23 #include <vector> 24 25 namespace armnn 26 { 27 28 namespace profiling 29 { 30 31 constexpr unsigned int ThreadIdSize = sizeof(int); // Is platform dependent 32 33 uint16_t GetNextUid(bool peekOnly = false); 34 35 std::vector<uint16_t> GetNextCounterUids(uint16_t firstUid, uint16_t cores); 36 37 void WriteBytes(const IPacketBuffer& packetBuffer, unsigned int offset, const void* value, unsigned int valueSize); 38 39 uint32_t ConstructHeader(uint32_t packetFamily, uint32_t packetId); 40 41 uint32_t ConstructHeader(uint32_t packetFamily, uint32_t packetClass, uint32_t packetType); 42 43 void WriteUint64(const IPacketBufferPtr& packetBuffer, unsigned int offset, uint64_t value); 44 45 void WriteUint32(const IPacketBufferPtr& packetBuffer, unsigned int offset, uint32_t value); 46 47 void WriteUint16(const IPacketBufferPtr& packetBuffer, unsigned int offset, uint16_t value); 48 49 void WriteUint8(const IPacketBufferPtr& packetBuffer, unsigned int offset, uint8_t value); 50 51 void WriteBytes(unsigned char* buffer, unsigned int offset, const void* value, unsigned int valueSize); 52 53 void WriteUint64(unsigned char* buffer, unsigned int offset, uint64_t value); 54 55 void WriteUint32(unsigned char* buffer, unsigned int offset, uint32_t value); 56 57 void WriteUint16(unsigned char* buffer, unsigned int offset, uint16_t value); 58 59 void WriteUint8(unsigned char* buffer, unsigned int offset, uint8_t value); 60 61 void ReadBytes(const IPacketBufferPtr& packetBuffer, unsigned int offset, unsigned int valueSize, uint8_t outValue[]); 62 63 uint64_t ReadUint64(const IPacketBufferPtr& packetBuffer, unsigned int offset); 64 65 uint32_t ReadUint32(const IPacketBufferPtr& packetBuffer, unsigned int offset); 66 67 uint16_t ReadUint16(const IPacketBufferPtr& packetBuffer, unsigned int offset); 68 69 uint8_t ReadUint8(const IPacketBufferPtr& packetBuffer, unsigned int offset); 70 71 void ReadBytes(const unsigned char* buffer, unsigned int offset, unsigned int valueSize, uint8_t outValue[]); 72 73 uint64_t ReadUint64(unsigned const char* buffer, unsigned int offset); 74 75 uint32_t ReadUint32(unsigned const char* buffer, unsigned int offset); 76 77 uint16_t ReadUint16(unsigned const char* buffer, unsigned int offset); 78 79 uint8_t ReadUint8(unsigned const char* buffer, unsigned int offset); 80 81 std::pair<uint32_t, uint32_t> CreateTimelinePacketHeader(uint32_t packetFamily, 82 uint32_t packetClass, 83 uint32_t packetType, 84 uint32_t streamId, 85 uint32_t sequenceNumbered, 86 uint32_t dataLength); 87 88 std::string GetSoftwareInfo(); 89 90 std::string GetSoftwareVersion(); 91 92 std::string GetHardwareVersion(); 93 94 std::string GetProcessName(); 95 96 enum class TimelinePacketStatus 97 { 98 Ok, 99 Error, 100 BufferExhaustion 101 }; 102 103 TimelinePacketStatus WriteTimelineLabelBinaryPacket(uint64_t profilingGuid, 104 const std::string& label, 105 unsigned char* buffer, 106 unsigned int bufferSize, 107 unsigned int& numberOfBytesWritten); 108 109 TimelinePacketStatus WriteTimelineEntityBinary(uint64_t profilingGuid, 110 unsigned char* buffer, 111 unsigned int bufferSize, 112 unsigned int& numberOfBytesWritten); 113 114 TimelinePacketStatus WriteTimelineRelationshipBinary(ProfilingRelationshipType relationshipType, 115 uint64_t relationshipGuid, 116 uint64_t headGuid, 117 uint64_t tailGuid, 118 uint64_t attributeGuid, 119 unsigned char* buffer, 120 unsigned int bufferSize, 121 unsigned int& numberOfBytesWritten); 122 123 TimelinePacketStatus WriteTimelineMessageDirectoryPackage(unsigned char* buffer, 124 unsigned int bufferSize, 125 unsigned int& numberOfBytesWritten); 126 127 TimelinePacketStatus WriteTimelineEventClassBinary(uint64_t profilingGuid, 128 uint64_t nameGuid, 129 unsigned char* buffer, 130 unsigned int bufferSize, 131 unsigned int& numberOfBytesWritten); 132 133 TimelinePacketStatus WriteTimelineEventBinary(uint64_t timestamp, 134 int threadId, 135 uint64_t profilingGuid, 136 unsigned char* buffer, 137 unsigned int bufferSize, 138 unsigned int& numberOfBytesWritten); 139 140 std::string CentreAlignFormatting(const std::string& stringToPass, const int spacingWidth); 141 142 void PrintCounterDirectory(ICounterDirectory& counterDirectory); 143 144 class BufferExhaustion : public armnn::Exception 145 { 146 using Exception::Exception; 147 }; 148 149 uint64_t GetTimestamp(); 150 151 arm::pipe::Packet ReceivePacket(const unsigned char* buffer, uint32_t length); 152 153 } // namespace profiling 154 155 } // namespace armnn 156 157 namespace std 158 { 159 160 bool operator==(const std::vector<uint8_t>& left, int right); 161 162 } // namespace std 163