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
123
124
125
126
127
128
129
130
131
|
//
// Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
// SPDX-License-Identifier: MIT
//
#pragma once
#include "IBufferManager.hpp"
#include "armnn/profiling/ISendTimelinePacket.hpp"
#include "ProfilingUtils.hpp"
#include <armnn/utility/Assert.hpp>
#include <memory>
namespace armnn
{
namespace profiling
{
class SendTimelinePacket : public ISendTimelinePacket
{
public:
SendTimelinePacket(IBufferManager& bufferManager)
: m_BufferManager(bufferManager)
, m_WriteBuffer(nullptr)
, m_Offset(8u)
, m_RemainingBufferSize(0u)
, m_PacketDataLength(0u)
{}
/// Commits the current buffer and reset the member variables
void Commit() override;
/// Create and write a TimelineEntityBinaryPacket from the parameters to the buffer.
void SendTimelineEntityBinaryPacket(uint64_t profilingGuid) override;
/// Create and write a TimelineEventBinaryPacket from the parameters to the buffer.
void SendTimelineEventBinaryPacket(uint64_t timestamp, int threadId, uint64_t profilingGuid) override;
/// Create and write a TimelineEventClassBinaryPacket from the parameters to the buffer.
void SendTimelineEventClassBinaryPacket(uint64_t profilingGuid, uint64_t nameGuid) override;
/// Create and write a TimelineLabelBinaryPacket from the parameters to the buffer.
void SendTimelineLabelBinaryPacket(uint64_t profilingGuid, const std::string& label) override;
/// Create and write a TimelineMessageDirectoryPackage in the buffer
void SendTimelineMessageDirectoryPackage() override;
/// Create and write a TimelineRelationshipBinaryPacket from the parameters to the buffer.
virtual void SendTimelineRelationshipBinaryPacket(ProfilingRelationshipType relationshipType,
uint64_t relationshipGuid,
uint64_t headGuid,
uint64_t tailGuid,
uint64_t attributeGuid) override;
private:
/// Reserves maximum packet size from buffer
void ReserveBuffer();
template <typename Func, typename ... Params>
void ForwardWriteBinaryFunction(Func& func, Params&& ... params);
IBufferManager& m_BufferManager;
IPacketBufferPtr m_WriteBuffer;
unsigned int m_Offset;
unsigned int m_RemainingBufferSize;
const unsigned int m_uint32_t_size = sizeof(uint32_t);
std::pair<uint32_t, uint32_t> m_PacketHeader;
uint32_t m_PacketDataLength;
bool m_DirectoryPackage = false;
};
template<typename Func, typename ... Params>
void SendTimelinePacket::ForwardWriteBinaryFunction(Func& func, Params&& ... params)
{
try
{
ReserveBuffer();
ARMNN_ASSERT(m_WriteBuffer);
unsigned int numberOfBytesWritten = 0;
// Header will be prepended to the buffer on Commit()
while ( true )
{
TimelinePacketStatus result = func(std::forward<Params>(params)...,
&m_WriteBuffer->GetWritableData()[m_Offset],
m_RemainingBufferSize,
numberOfBytesWritten);
switch ( result )
{
case TimelinePacketStatus::BufferExhaustion:
Commit();
ReserveBuffer();
continue;
case TimelinePacketStatus::Error:
throw RuntimeException("Error processing while sending TimelineBinaryPacket", CHECK_LOCATION());
default:
m_Offset += numberOfBytesWritten;
m_RemainingBufferSize -= numberOfBytesWritten;
return;
}
}
}
catch (const RuntimeException& ex)
{
// don't swallow in the catch all block
throw ex;
}
catch (const BufferExhaustion& ex)
{
// ditto
throw ex;
}
catch (const Exception& ex)
{
throw ex;
}
catch ( ... )
{
throw RuntimeException("Unknown Exception thrown while sending TimelineBinaryPacket", CHECK_LOCATION());
}
}
} // namespace profiling
} // namespace armnn
|