1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
//
// Copyright © 2019 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//
#include "SendTimelinePacket.hpp"
namespace armnn
{
namespace profiling
{
void SendTimelinePacket::Commit()
{
if (m_WriteBuffer == nullptr)
{
// Can't commit from a null buffer
return;
}
// Commit the message
m_BufferManager.Commit(m_WriteBuffer, m_Offset);
m_WriteBuffer.reset(nullptr);
m_Offset = 0;
m_BufferSize = 0;
}
void SendTimelinePacket::ReserveBuffer()
{
if (m_WriteBuffer != nullptr)
{
// Buffer already reserved
return;
}
uint32_t reserved = 0;
// Reserve the buffer
m_WriteBuffer = m_BufferManager.Reserve(MAX_METADATA_PACKET_LENGTH, reserved);
// Check if there is enough space in the buffer
if (m_WriteBuffer == nullptr || reserved < m_Offset)
{
throw BufferExhaustion("No space left on buffer", CHECK_LOCATION());
}
m_BufferSize = reserved;
}
void SendTimelinePacket::SendTimelineEntityBinaryPacket(uint64_t profilingGuid)
{
ForwardWriteBinaryFunction(WriteTimelineEntityBinaryPacket,
profilingGuid);
}
void SendTimelinePacket::SendTimelineEventBinaryPacket(uint64_t timestamp,
std::thread::id threadId,
uint64_t profilingGuid)
{
ForwardWriteBinaryFunction(WriteTimelineEventBinaryPacket,
timestamp,
threadId,
profilingGuid);
}
void SendTimelinePacket::SendTimelineEventClassBinaryPacket(uint64_t profilingGuid)
{
ForwardWriteBinaryFunction(WriteTimelineEventClassBinaryPacket,
profilingGuid);
}
void SendTimelinePacket::SendTimelineLabelBinaryPacket(uint64_t profilingGuid, const std::string& label)
{
ForwardWriteBinaryFunction(WriteTimelineLabelBinaryPacket,
profilingGuid,
label);
}
void SendTimelinePacket::SendTimelineRelationshipBinaryPacket(ProfilingRelationshipType relationshipType,
uint64_t relationshipGuid,
uint64_t headGuid,
uint64_t tailGuid)
{
ForwardWriteBinaryFunction(WriteTimelineRelationshipBinaryPacket,
relationshipType,
relationshipGuid,
headGuid,
tailGuid);
}
void SendTimelinePacket::SendTimelineMessageDirectoryPackage()
{
try
{
// Reserve buffer if it hasn't already been reserved
ReserveBuffer();
// Write to buffer
unsigned int numberOfBytesWritten = 0;
TimelinePacketStatus result = WriteTimelineMessageDirectoryPackage(&m_WriteBuffer->GetWritableData()[m_Offset],
m_BufferSize,
numberOfBytesWritten);
if (result != armnn::profiling::TimelinePacketStatus::Ok)
{
throw RuntimeException("Error processing TimelineMessageDirectoryPackage", CHECK_LOCATION());
}
// Commit the message
m_Offset += numberOfBytesWritten;
m_BufferSize -= numberOfBytesWritten;
Commit();
}
catch (...)
{
throw RuntimeException("Error processing TimelineMessageDirectoryPackage", CHECK_LOCATION());
}
}
} // namespace profiling
} // namespace armnn
|