aboutsummaryrefslogtreecommitdiff
path: root/21.02/_send_counter_packet_8cpp_source.xhtml
blob: 08aa0c1ce87f56a1cb478f17b5d5d81cec1fe3ab (plain)
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
<!-- Copyright (c) 2020 ARM Limited. -->
<!--                                 -->
<!-- SPDX-License-Identifier: MIT    -->
<!--                                 -->
<!-- HTML header for doxygen 1.8.13-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="robots" content="NOINDEX, NOFOLLOW" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>ArmNN: src/profiling/SendCounterPacket.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
  $(document).ready(initResizable);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    extensions: ["tex2jax.js"],
    jax: ["input/TeX","output/HTML-CSS"],
});
</script><script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="stylesheet.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <img alt="ArmNN" src="Arm_NN_horizontal_blue.png" style="max-width: 10rem; margin-top: .5rem; margin-left 10px"/>
  <td style="padding-left: 0.5em;">
   <div id="projectname">
   &#160;<span id="projectnumber">21.02</span>
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('_send_counter_packet_8cpp_source.xhtml','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="headertitle">
<div class="title">SendCounterPacket.cpp</div>  </div>
</div><!--header-->
<div class="contents">
<a href="_send_counter_packet_8cpp.xhtml">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment">// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment">// SPDX-License-Identifier: MIT</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;</div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_send_counter_packet_8hpp.xhtml">SendCounterPacket.hpp</a>&quot;</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="preprocessor">#include &lt;common/include/EncodeVersion.hpp&gt;</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;</div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_exceptions_8hpp.xhtml">armnn/Exceptions.hpp</a>&gt;</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_conversion_8hpp.xhtml">armnn/Conversion.hpp</a>&gt;</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_processes_8hpp.xhtml">Processes.hpp</a>&gt;</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_assert_8hpp.xhtml">armnn/utility/Assert.hpp</a>&gt;</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_numeric_cast_8hpp.xhtml">armnn/utility/NumericCast.hpp</a>&gt;</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="preprocessor">#include &lt;common/include/Constants.hpp&gt;</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="preprocessor">#include &lt;common/include/SwTrace.hpp&gt;</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;</div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="preprocessor">#include &lt;fmt/format.h&gt;</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;</div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="preprocessor">#include &lt;cstring&gt;</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;</div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacearmnn.xhtml">armnn</a></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;{</div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;</div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="keyword">namespace </span>profiling</div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;{</div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;</div><div class="line"><a name="l00027"></a><span class="lineno"><a class="line" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#a2a2e451c4e4963909b8a6dc7e7653cd1">   27</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#a2a2e451c4e4963909b8a6dc7e7653cd1">SendCounterPacket::SendStreamMetaDataPacket</a>()</div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;{</div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;    <span class="keyword">const</span> std::string <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>(<a class="code" href="namespacearmnn_1_1profiling.xhtml#af38e9c5d82c9317255665a6315842166">GetSoftwareInfo</a>());</div><div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;    <span class="keyword">const</span> std::string hardwareVersion(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a66ccd202fa7bf1e52476e61d49a45ee6">GetHardwareVersion</a>());</div><div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;    <span class="keyword">const</span> std::string softwareVersion(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a1a90cae723e311b3b71272a7f5ecccbb">GetSoftwareVersion</a>());</div><div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;    <span class="keyword">const</span> std::string processName = <a class="code" href="namespacearmnn_1_1profiling.xhtml#a52fbcd350a9f12a385a7c5562c1efd9a">GetProcessName</a>().substr(0, 60);</div><div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;</div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;    <span class="keyword">const</span> uint32_t infoSize =            <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint32_t&gt;(info.size()) + 1;</div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;    <span class="keyword">const</span> uint32_t hardwareVersionSize = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint32_t&gt;(hardwareVersion.size()) + 1;</div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;    <span class="keyword">const</span> uint32_t softwareVersionSize = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint32_t&gt;(softwareVersion.size()) + 1;</div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;    <span class="keyword">const</span> uint32_t processNameSize =     <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint32_t&gt;(processName.size()) + 1;</div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;</div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;    <span class="keyword">const</span> uint32_t sizeUint32 = <span class="keyword">sizeof</span>(uint32_t);</div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;</div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;    <span class="keyword">const</span> uint32_t headerSize = 2 * sizeUint32;</div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;    <span class="keyword">const</span> uint32_t bodySize = 10 * sizeUint32;</div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;    <span class="keyword">const</span> uint32_t packetVersionCountSize = sizeUint32;</div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;</div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;    <span class="comment">// Supported Packets</span></div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;    <span class="comment">// Packet Encoding version 1.0.0</span></div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;    <span class="comment">// Control packet family</span></div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;    <span class="comment">//   Stream metadata packet (packet family=0; packet id=0)</span></div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;    <span class="comment">//   Connection Acknowledged packet ( packet family=0, packet id=1) Version 1.0.0</span></div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;    <span class="comment">//   Counter Directory packet (packet family=0; packet id=2) Version 1.0.0</span></div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;    <span class="comment">//   Request Counter Directory packet ( packet family=0, packet id=3) Version 1.0.0</span></div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;    <span class="comment">//   Periodic Counter Selection packet ( packet family=0, packet id=4) Version 1.0.0</span></div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;    <span class="comment">//   Per Job Counter Selection packet ( packet family=0, packet id=5) Version 1.0.0</span></div><div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;    <span class="comment">//   Activate Timeline Reporting (packet family = 0, packet id = 6) Version 1.0.0</span></div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;    <span class="comment">//   Deactivate Timeline Reporting (packet family = 0, packet id = 7) Version 1.0.0</span></div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;    <span class="comment">// Counter Packet Family</span></div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;    <span class="comment">//   Periodic Counter Capture (packet_family = 3, packet_class = 0, packet_type = 0) Version 1.0.0</span></div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;    <span class="comment">//   Per-Job Counter Capture (packet_family = 3, packet_class = 1, packet_type = 0,1) Version  1.0.0</span></div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;    <span class="comment">// Timeline Packet Family</span></div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;    <span class="comment">//   Timeline Message Directory (packet_family = 1, packet_class = 0, packet_type = 0) Version 1.0.0</span></div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;    <span class="comment">//   Timeline Message (packet_family = 1, packet_class = 0, packet_type = 1) Version 1.0.0</span></div><div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;    std::vector&lt;std::pair&lt;uint32_t, uint32_t&gt;&gt; packetVersions;</div><div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;    packetVersions.push_back(std::make_pair(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a750935094e7dc62a6ce69be8688ee9fc">ConstructHeader</a>(0, 0), arm::pipe::EncodeVersion(1, 0, 0)));</div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;    packetVersions.push_back(std::make_pair(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a750935094e7dc62a6ce69be8688ee9fc">ConstructHeader</a>(0, 1), arm::pipe::EncodeVersion(1, 0, 0)));</div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;    packetVersions.push_back(std::make_pair(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a750935094e7dc62a6ce69be8688ee9fc">ConstructHeader</a>(0, 2), arm::pipe::EncodeVersion(1, 0, 0)));</div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;    packetVersions.push_back(std::make_pair(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a750935094e7dc62a6ce69be8688ee9fc">ConstructHeader</a>(0, 3), arm::pipe::EncodeVersion(1, 0, 0)));</div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;    packetVersions.push_back(std::make_pair(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a750935094e7dc62a6ce69be8688ee9fc">ConstructHeader</a>(0, 4), arm::pipe::EncodeVersion(1, 0, 0)));</div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;    packetVersions.push_back(std::make_pair(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a750935094e7dc62a6ce69be8688ee9fc">ConstructHeader</a>(0, 5), arm::pipe::EncodeVersion(1, 0, 0)));</div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;    packetVersions.push_back(std::make_pair(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a750935094e7dc62a6ce69be8688ee9fc">ConstructHeader</a>(0, 6), arm::pipe::EncodeVersion(1, 0, 0)));</div><div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;    packetVersions.push_back(std::make_pair(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a750935094e7dc62a6ce69be8688ee9fc">ConstructHeader</a>(0, 7), arm::pipe::EncodeVersion(1, 0, 0)));</div><div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;    packetVersions.push_back(std::make_pair(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a750935094e7dc62a6ce69be8688ee9fc">ConstructHeader</a>(3, 0, 0), arm::pipe::EncodeVersion(1, 0, 0)));</div><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;    packetVersions.push_back(std::make_pair(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a750935094e7dc62a6ce69be8688ee9fc">ConstructHeader</a>(3, 1, 0), arm::pipe::EncodeVersion(1, 0, 0)));</div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;    packetVersions.push_back(std::make_pair(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a750935094e7dc62a6ce69be8688ee9fc">ConstructHeader</a>(3, 1, 1), arm::pipe::EncodeVersion(1, 0, 0)));</div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;    packetVersions.push_back(std::make_pair(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a750935094e7dc62a6ce69be8688ee9fc">ConstructHeader</a>(1, 0, 0), arm::pipe::EncodeVersion(1, 0, 0)));</div><div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;    packetVersions.push_back(std::make_pair(<a class="code" href="namespacearmnn_1_1profiling.xhtml#a750935094e7dc62a6ce69be8688ee9fc">ConstructHeader</a>(1, 0, 1), arm::pipe::EncodeVersion(1, 0, 0)));</div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;    uint32_t numberOfVersions = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint32_t&gt;(packetVersions.size());</div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;    uint32_t packetVersionSize = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint32_t&gt;(numberOfVersions * 2 * sizeUint32);</div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;</div><div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;    <span class="keyword">const</span> uint32_t payloadSize = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint32_t&gt;(infoSize + hardwareVersionSize +</div><div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;                                                               softwareVersionSize + processNameSize +</div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;                                                               packetVersionCountSize + packetVersionSize);</div><div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;</div><div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;    <span class="keyword">const</span> uint32_t totalSize = headerSize + bodySize + payloadSize;</div><div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;    uint32_t offset = 0;</div><div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;    uint32_t reserved = 0;</div><div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;</div><div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a14328d977cec3abadcfd5935f04f3409">IPacketBufferPtr</a> writeBuffer = m_BufferManager.<a class="code" href="classarmnn_1_1profiling_1_1_i_buffer_manager.xhtml#a49c88b0e052621f30462c3bdbf3e4a7a">Reserve</a>(totalSize, reserved);</div><div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;</div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;    <span class="keywordflow">if</span> (writeBuffer == <span class="keyword">nullptr</span> || reserved &lt; totalSize)</div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;    {</div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;        CancelOperationAndThrow&lt;BufferExhaustion&gt;(</div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;            writeBuffer,</div><div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;            fmt::format(<span class="stringliteral">&quot;No space left in buffer. Unable to reserve ({}) bytes.&quot;</span>, totalSize));</div><div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;    }</div><div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;</div><div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;    <span class="keywordflow">try</span></div><div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;    {</div><div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;        <span class="comment">// Create header</span></div><div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;</div><div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;        <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(writeBuffer, offset, 0);</div><div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;        offset += sizeUint32;</div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;        <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(writeBuffer, offset, totalSize - headerSize);</div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;</div><div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;        <span class="comment">// Packet body</span></div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;</div><div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;        offset += sizeUint32;</div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;        <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(writeBuffer, offset, arm::pipe::PIPE_MAGIC); <span class="comment">// pipe_magic</span></div><div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;        offset += sizeUint32;</div><div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;        <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(writeBuffer, offset, arm::pipe::EncodeVersion(1, 0, 0)); <span class="comment">// stream_metadata_version</span></div><div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;        offset += sizeUint32;</div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;        <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(writeBuffer, offset, <a class="code" href="_i_buffer_manager_8hpp.xhtml#aa710a41e4e10ec3243e29e74dacae3c0">MAX_METADATA_PACKET_LENGTH</a>); <span class="comment">// max_data_length</span></div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;        offset += sizeUint32;</div><div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;        <span class="keywordtype">int</span> pid = <a class="code" href="namespacearmnn_utils_1_1_processes.xhtml#a1d95dea376acbd82dde773e05db454be">armnnUtils::Processes::GetCurrentId</a>();</div><div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;        <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(writeBuffer, offset, armnn::numeric_cast&lt;uint32_t&gt;(pid)); <span class="comment">// pid</span></div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;        offset += sizeUint32;</div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;        uint32_t poolOffset = bodySize;</div><div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;        <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(writeBuffer, offset, poolOffset); <span class="comment">// offset_info</span></div><div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;        offset += sizeUint32;</div><div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;        poolOffset += infoSize;</div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;        <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(writeBuffer, offset, poolOffset); <span class="comment">// offset_hw_version</span></div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;        offset += sizeUint32;</div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;        poolOffset += hardwareVersionSize;</div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;        <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(writeBuffer, offset, poolOffset); <span class="comment">// offset_sw_version</span></div><div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;        offset += sizeUint32;</div><div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;        poolOffset += softwareVersionSize;</div><div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;        <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(writeBuffer, offset, poolOffset); <span class="comment">// offset_process_name</span></div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;        offset += sizeUint32;</div><div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;        poolOffset += processNameSize;</div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;        <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(writeBuffer, offset, poolOffset); <span class="comment">// offset_packet_version_table</span></div><div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;        offset += sizeUint32;</div><div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;        <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(writeBuffer, offset, 0); <span class="comment">// reserved</span></div><div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;        offset += sizeUint32;</div><div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;</div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;        <span class="comment">// Pool</span></div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;</div><div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;        <span class="keywordflow">if</span> (infoSize)</div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;        {</div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;            memcpy(&amp;writeBuffer-&gt;GetWritableData()[offset], info.c_str(), infoSize);</div><div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;            offset += infoSize;</div><div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;        }</div><div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;</div><div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;        memcpy(&amp;writeBuffer-&gt;GetWritableData()[offset], hardwareVersion.c_str(), hardwareVersionSize);</div><div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;        offset += hardwareVersionSize;</div><div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;        memcpy(&amp;writeBuffer-&gt;GetWritableData()[offset], softwareVersion.c_str(), softwareVersionSize);</div><div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;        offset += softwareVersionSize;</div><div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;        memcpy(&amp;writeBuffer-&gt;GetWritableData()[offset], processName.c_str(), processNameSize);</div><div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;        offset += processNameSize;</div><div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;</div><div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;        <span class="keywordflow">if</span> (!packetVersions.empty())</div><div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;        {</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;            <span class="comment">// Packet Version Count</span></div><div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;            <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(writeBuffer, offset, numberOfVersions &lt;&lt; 16);</div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;            offset += sizeUint32;</div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;</div><div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;            <span class="comment">// Packet Version Entries</span></div><div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;            <span class="keywordflow">for</span> (std::pair&lt;uint32_t, uint32_t&gt;&amp; packetVersion : packetVersions)</div><div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;            {</div><div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;                <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(writeBuffer, offset, packetVersion.first);</div><div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;                offset += sizeUint32;</div><div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;                <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(writeBuffer, offset, packetVersion.second);</div><div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;                offset += sizeUint32;</div><div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;            }</div><div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;        }</div><div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;    }</div><div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;    <span class="keywordflow">catch</span>(...)</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;    {</div><div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;        CancelOperationAndThrow&lt;RuntimeException&gt;(writeBuffer, <span class="stringliteral">&quot;Error processing packet.&quot;</span>);</div><div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;    }</div><div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;</div><div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;    m_BufferManager.<a class="code" href="classarmnn_1_1profiling_1_1_i_buffer_manager.xhtml#ad0faa8a317506b2e72252f087c7f3c46">Commit</a>(writeBuffer, totalSize, <span class="keyword">false</span>);</div><div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;}</div><div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;</div><div class="line"><a name="l00173"></a><span class="lineno"><a class="line" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#acd58fc16d0b9e0a3983e3e8719c0f95a">  173</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#acd58fc16d0b9e0a3983e3e8719c0f95a">SendCounterPacket::CreateCategoryRecord</a>(<span class="keyword">const</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a8adee535828386656b4c8acfa8bcf871">CategoryPtr</a>&amp; category,</div><div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;                                             <span class="keyword">const</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#aeeb6904ffbae435c8d0a7138427688f4">Counters</a>&amp; counters,</div><div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;                                             <a class="code" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#acc3cd9f22519728404bf47992ea01f77">CategoryRecord</a>&amp; categoryRecord,</div><div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;                                             std::string&amp; errorMessage)</div><div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;{</div><div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(category);</div><div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;</div><div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;    <span class="keyword">const</span> std::string&amp; categoryName = category-&gt;m_Name;</div><div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(!categoryName.empty());</div><div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;</div><div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;    <span class="comment">// Remove any duplicate counters</span></div><div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;    std::vector&lt;uint16_t&gt; categoryCounters;</div><div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> counterIndex = 0; counterIndex &lt; category-&gt;m_Counters.size(); ++counterIndex)</div><div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;    {</div><div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;        uint16_t counterUid = category-&gt;m_Counters.at(counterIndex);</div><div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;        <span class="keyword">auto</span> it = counters.find(counterUid);</div><div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;        <span class="keywordflow">if</span> (it == counters.end())</div><div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;        {</div><div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;            errorMessage = fmt::format(<span class="stringliteral">&quot;Counter ({}) not found in category ({})&quot;</span>,</div><div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;                                       counterUid,</div><div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;                                       category-&gt;m_Name );</div><div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;        }</div><div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;</div><div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;        <span class="keyword">const</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a38de53725b010ce63ea7557bb1d270e7">CounterPtr</a>&amp; counter = it-&gt;second;</div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;</div><div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;        <span class="keywordflow">if</span> (counterUid == counter-&gt;m_MaxCounterUid)</div><div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;        {</div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;            categoryCounters.emplace_back(counterUid);</div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;        }</div><div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;    }</div><div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;    <span class="keywordflow">if</span> (categoryCounters.empty())</div><div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;    {</div><div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;        errorMessage = fmt::format(<span class="stringliteral">&quot;No valid counters found in category ({})&quot;</span>, categoryName);</div><div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;    }</div><div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;</div><div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;    <span class="comment">// Utils</span></div><div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a> = <span class="keyword">sizeof</span>(uint32_t);</div><div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;</div><div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;    <span class="comment">// Convert the device name into a SWTrace namestring</span></div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;    std::vector&lt;uint32_t&gt; categoryNameBuffer;</div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;    <span class="keywordflow">if</span> (!arm::pipe::StringToSwTraceString&lt;arm::pipe::SwTraceNameCharPolicy&gt;(categoryName, categoryNameBuffer))</div><div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;    {</div><div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;        errorMessage = fmt::format(<span class="stringliteral">&quot;Cannot convert the name of category ({}) to an SWTrace namestring&quot;</span>,</div><div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;                                   categoryName);</div><div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;    }</div><div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;</div><div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;    <span class="comment">// Category record word 1:</span></div><div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;    <span class="comment">// 16:31 [16] event_count: number of events belonging to this category</span></div><div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;    <span class="comment">// 0:15  [16] reserved: all zeros</span></div><div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;    <span class="keyword">const</span> uint32_t categoryRecordWord1 = <span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(categoryCounters.size()) &lt;&lt; 16;</div><div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;</div><div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;    <span class="comment">// Category record word 2:</span></div><div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;    <span class="comment">// 0:31 [32] event_pointer_table_offset: offset from the beginning of the category data pool to</span></div><div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;    <span class="comment">//                                       the event_pointer_table</span></div><div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;    <span class="keyword">const</span> uint32_t categoryRecordWord2 = <span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(3u * <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>);</div><div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;</div><div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;    <span class="comment">// Process the event records</span></div><div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> counterCount = categoryCounters.size();</div><div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;    std::vector&lt;EventRecord&gt; eventRecords(counterCount);</div><div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;    std::vector&lt;uint32_t&gt; eventRecordOffsets(counterCount, 0);</div><div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;    <span class="keywordtype">size_t</span> eventRecordsSize = 0;</div><div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;    uint32_t eventRecordsOffset = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint32_t&gt;(</div><div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;                    (eventRecords.size() + categoryNameBuffer.size()) * uint32_t_size);</div><div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> counterIndex = 0, eventRecordIndex = 0, eventRecordOffsetIndex = 0;</div><div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;         counterIndex &lt; counterCount;</div><div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;         counterIndex++, eventRecordIndex++, eventRecordOffsetIndex++)</div><div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;    {</div><div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;        uint16_t counterUid = categoryCounters.at(counterIndex);</div><div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;        <span class="keyword">auto</span> it = counters.find(counterUid);</div><div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;        <span class="keyword">const</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a38de53725b010ce63ea7557bb1d270e7">CounterPtr</a>&amp; counter = it-&gt;second;</div><div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;</div><div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;        <a class="code" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#a7b90a935def976944525581f5f254068">EventRecord</a>&amp; eventRecord = eventRecords.at(eventRecordIndex);</div><div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;        <span class="keywordflow">if</span> (!<a class="code" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#ac134e8d175e305297b729b4461d9f34f">CreateEventRecord</a>(counter, eventRecord, errorMessage))</div><div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;        {</div><div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;        }</div><div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;</div><div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;        <span class="comment">// Update the total size in words of the event records</span></div><div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;        eventRecordsSize += eventRecord.size();</div><div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;</div><div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;        <span class="comment">// Add the event record offset to the event pointer table offset field</span></div><div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;        eventRecordOffsets[eventRecordOffsetIndex] = eventRecordsOffset;</div><div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;        eventRecordsOffset += <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint32_t&gt;(eventRecord.size() * <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>);</div><div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;    }</div><div class="line"><a name="l00260"></a><span class="lineno">  260</span>&#160;</div><div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;    <span class="comment">// Category record word 3:</span></div><div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;    <span class="comment">// 0:31 [32] name_offset (offset from the beginning of the category data pool to the name field)</span></div><div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;    <span class="keyword">const</span> uint32_t categoryRecordWord3 = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint32_t&gt;(</div><div class="line"><a name="l00264"></a><span class="lineno">  264</span>&#160;            (3u + eventRecordOffsets.size()) * uint32_t_size);</div><div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;</div><div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;    <span class="comment">// Calculate the size in words of the category record</span></div><div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> categoryRecordSize = 3u +<span class="comment">// The size of the fixed part (device + counter_set + event_count +</span></div><div class="line"><a name="l00268"></a><span class="lineno">  268</span>&#160;                                          <span class="comment">// reserved + event_pointer_table_offset + name_offset)</span></div><div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;                                      eventRecordOffsets.size() + <span class="comment">// The size of the variable part (</span></div><div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;                                      categoryNameBuffer.size() + <span class="comment">// the event pointer table + the category name</span></div><div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;                                      eventRecordsSize;           <span class="comment">// including the null-terminator + the event records)</span></div><div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;</div><div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;    <span class="comment">// Allocate the necessary space for the category record</span></div><div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;    categoryRecord.resize(categoryRecordSize);</div><div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;</div><div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160;    <a class="code" href="_conversion_8hpp.xhtml#aeaf555aa7f39f7ba192a3812cb1b7d07">ARMNN_NO_CONVERSION_WARN_BEGIN</a></div><div class="line"><a name="l00277"></a><span class="lineno">  277</span>&#160;    <span class="comment">// Create the category record</span></div><div class="line"><a name="l00278"></a><span class="lineno">  278</span>&#160;    categoryRecord[0] = categoryRecordWord1; <span class="comment">// event_count + reserved</span></div><div class="line"><a name="l00279"></a><span class="lineno">  279</span>&#160;    categoryRecord[1] = categoryRecordWord2; <span class="comment">// event_pointer_table_offset</span></div><div class="line"><a name="l00280"></a><span class="lineno">  280</span>&#160;    categoryRecord[2] = categoryRecordWord3; <span class="comment">// name_offset</span></div><div class="line"><a name="l00281"></a><span class="lineno">  281</span>&#160;    <span class="keyword">auto</span> offset = categoryRecord.begin() + 3u;</div><div class="line"><a name="l00282"></a><span class="lineno">  282</span>&#160;    std::copy(eventRecordOffsets.begin(), eventRecordOffsets.end(), offset); <span class="comment">// event_pointer_table</span></div><div class="line"><a name="l00283"></a><span class="lineno">  283</span>&#160;    offset += eventRecordOffsets.size();</div><div class="line"><a name="l00284"></a><span class="lineno">  284</span>&#160;    std::copy(categoryNameBuffer.begin(), categoryNameBuffer.end(), offset); <span class="comment">// name</span></div><div class="line"><a name="l00285"></a><span class="lineno">  285</span>&#160;    offset += categoryNameBuffer.size();</div><div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#a7b90a935def976944525581f5f254068">EventRecord</a>&amp; eventRecord : eventRecords)</div><div class="line"><a name="l00287"></a><span class="lineno">  287</span>&#160;    {</div><div class="line"><a name="l00288"></a><span class="lineno">  288</span>&#160;        std::copy(eventRecord.begin(), eventRecord.end(), offset); <span class="comment">// event_record</span></div><div class="line"><a name="l00289"></a><span class="lineno">  289</span>&#160;        offset += eventRecord.size();</div><div class="line"><a name="l00290"></a><span class="lineno">  290</span>&#160;    }</div><div class="line"><a name="l00291"></a><span class="lineno">  291</span>&#160;    <a class="code" href="_conversion_8hpp.xhtml#a71cf574f1296e09d0ce16157bdeb6619">ARMNN_NO_CONVERSION_WARN_END</a></div><div class="line"><a name="l00292"></a><span class="lineno">  292</span>&#160;</div><div class="line"><a name="l00293"></a><span class="lineno">  293</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;}</div><div class="line"><a name="l00295"></a><span class="lineno">  295</span>&#160;</div><div class="line"><a name="l00296"></a><span class="lineno"><a class="line" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#af18b6d5da883305c751d6ed00bea006a">  296</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#af18b6d5da883305c751d6ed00bea006a">SendCounterPacket::CreateDeviceRecord</a>(<span class="keyword">const</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a22a0d730c0d08335585e6e8999be8f8b">DevicePtr</a>&amp; device,</div><div class="line"><a name="l00297"></a><span class="lineno">  297</span>&#160;                                           <a class="code" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#ae8cb0ed3b5a68b271532e959ec2507d4">DeviceRecord</a>&amp; deviceRecord,</div><div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;                                           std::string&amp; errorMessage)</div><div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;{</div><div class="line"><a name="l00300"></a><span class="lineno">  300</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(device);</div><div class="line"><a name="l00301"></a><span class="lineno">  301</span>&#160;</div><div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;    uint16_t deviceUid = device-&gt;m_Uid;</div><div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;    <span class="keyword">const</span> std::string&amp; deviceName = device-&gt;m_Name;</div><div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;    uint16_t deviceCores = device-&gt;m_Cores;</div><div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;</div><div class="line"><a name="l00306"></a><span class="lineno">  306</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(!deviceName.empty());</div><div class="line"><a name="l00307"></a><span class="lineno">  307</span>&#160;</div><div class="line"><a name="l00308"></a><span class="lineno">  308</span>&#160;    <span class="comment">// Device record word 0:</span></div><div class="line"><a name="l00309"></a><span class="lineno">  309</span>&#160;    <span class="comment">// 16:31 [16] uid: the unique identifier for the device</span></div><div class="line"><a name="l00310"></a><span class="lineno">  310</span>&#160;    <span class="comment">// 0:15  [16] cores: the number of individual streams of counters for one or more cores of some device</span></div><div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;    <span class="keyword">const</span> uint32_t deviceRecordWord0 = (<span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(deviceUid) &lt;&lt; 16) |</div><div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;                                 (<span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(deviceCores));</div><div class="line"><a name="l00313"></a><span class="lineno">  313</span>&#160;</div><div class="line"><a name="l00314"></a><span class="lineno">  314</span>&#160;    <span class="comment">// Device record word 1:</span></div><div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;    <span class="comment">// 0:31 [32] name_offset: offset from the beginning of the device record pool to the name field</span></div><div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;    <span class="keyword">const</span> uint32_t deviceRecordWord1 = 8u; <span class="comment">// The offset is always eight here, as the name field is always</span></div><div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160;                                           <span class="comment">// the first (and only) item in the pool and there are two device words</span></div><div class="line"><a name="l00318"></a><span class="lineno">  318</span>&#160;</div><div class="line"><a name="l00319"></a><span class="lineno">  319</span>&#160;    <span class="comment">// Convert the device name into a SWTrace string</span></div><div class="line"><a name="l00320"></a><span class="lineno">  320</span>&#160;    std::vector&lt;uint32_t&gt; deviceNameBuffer;</div><div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;    <span class="keywordflow">if</span> (!arm::pipe::StringToSwTraceString&lt;arm::pipe::SwTraceCharPolicy&gt;(deviceName, deviceNameBuffer))</div><div class="line"><a name="l00322"></a><span class="lineno">  322</span>&#160;    {</div><div class="line"><a name="l00323"></a><span class="lineno">  323</span>&#160;        errorMessage = fmt::format(<span class="stringliteral">&quot;Cannot convert the name of device {} ({}) to an SWTrace string&quot;</span>,</div><div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;                                   deviceUid,</div><div class="line"><a name="l00325"></a><span class="lineno">  325</span>&#160;                                   deviceName);</div><div class="line"><a name="l00326"></a><span class="lineno">  326</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00327"></a><span class="lineno">  327</span>&#160;    }</div><div class="line"><a name="l00328"></a><span class="lineno">  328</span>&#160;</div><div class="line"><a name="l00329"></a><span class="lineno">  329</span>&#160;    <span class="comment">// Calculate the size in words of the device record</span></div><div class="line"><a name="l00330"></a><span class="lineno">  330</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> deviceRecordSize = 2u + <span class="comment">// The size of the fixed part (uid + cores + name_offset)</span></div><div class="line"><a name="l00331"></a><span class="lineno">  331</span>&#160;                              deviceNameBuffer.size(); <span class="comment">// The size of the variable part (the device name including</span></div><div class="line"><a name="l00332"></a><span class="lineno">  332</span>&#160;                                                       <span class="comment">// the null-terminator)</span></div><div class="line"><a name="l00333"></a><span class="lineno">  333</span>&#160;</div><div class="line"><a name="l00334"></a><span class="lineno">  334</span>&#160;    <span class="comment">// Allocate the necessary space for the device record</span></div><div class="line"><a name="l00335"></a><span class="lineno">  335</span>&#160;    deviceRecord.resize(deviceRecordSize);</div><div class="line"><a name="l00336"></a><span class="lineno">  336</span>&#160;</div><div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;    <span class="comment">// Create the device record</span></div><div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;    deviceRecord[0] = deviceRecordWord0; <span class="comment">// uid + core</span></div><div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;    deviceRecord[1] = deviceRecordWord1; <span class="comment">// name_offset</span></div><div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;    <span class="keyword">auto</span> offset = deviceRecord.begin() + 2u;</div><div class="line"><a name="l00341"></a><span class="lineno">  341</span>&#160;    std::copy(deviceNameBuffer.begin(), deviceNameBuffer.end(), offset); <span class="comment">// name</span></div><div class="line"><a name="l00342"></a><span class="lineno">  342</span>&#160;</div><div class="line"><a name="l00343"></a><span class="lineno">  343</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00344"></a><span class="lineno">  344</span>&#160;}</div><div class="line"><a name="l00345"></a><span class="lineno">  345</span>&#160;</div><div class="line"><a name="l00346"></a><span class="lineno"><a class="line" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#ad0a58db963ae04484cdc3addd8327c3e">  346</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#ad0a58db963ae04484cdc3addd8327c3e">SendCounterPacket::CreateCounterSetRecord</a>(<span class="keyword">const</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#abaedc7fcb8ecb2e086482afe10737fb7">CounterSetPtr</a>&amp; counterSet,</div><div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;                                               <a class="code" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#a30f18e205737ed0a4057d18b52d48018">CounterSetRecord</a>&amp; counterSetRecord,</div><div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;                                               std::string&amp; errorMessage)</div><div class="line"><a name="l00349"></a><span class="lineno">  349</span>&#160;{</div><div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(counterSet);</div><div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;</div><div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;    uint16_t counterSetUid = counterSet-&gt;m_Uid;</div><div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;    <span class="keyword">const</span> std::string&amp; counterSetName = counterSet-&gt;m_Name;</div><div class="line"><a name="l00354"></a><span class="lineno">  354</span>&#160;    uint16_t counterSetCount = counterSet-&gt;m_Count;</div><div class="line"><a name="l00355"></a><span class="lineno">  355</span>&#160;</div><div class="line"><a name="l00356"></a><span class="lineno">  356</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(!counterSetName.empty());</div><div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;</div><div class="line"><a name="l00358"></a><span class="lineno">  358</span>&#160;    <span class="comment">// Counter set record word 0:</span></div><div class="line"><a name="l00359"></a><span class="lineno">  359</span>&#160;    <span class="comment">// 16:31 [16] uid: the unique identifier for the counter_set</span></div><div class="line"><a name="l00360"></a><span class="lineno">  360</span>&#160;    <span class="comment">// 0:15  [16] count: the number of counters which can be active in this set at any one time</span></div><div class="line"><a name="l00361"></a><span class="lineno">  361</span>&#160;    <span class="keyword">const</span> uint32_t counterSetRecordWord0 = (<span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(counterSetUid) &lt;&lt; 16) |</div><div class="line"><a name="l00362"></a><span class="lineno">  362</span>&#160;                                           (<span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(counterSetCount));</div><div class="line"><a name="l00363"></a><span class="lineno">  363</span>&#160;</div><div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;    <span class="comment">// Counter set record word 1:</span></div><div class="line"><a name="l00365"></a><span class="lineno">  365</span>&#160;    <span class="comment">// 0:31 [32] name_offset: offset from the beginning of the counter set pool to the name field</span></div><div class="line"><a name="l00366"></a><span class="lineno">  366</span>&#160;    <span class="keyword">const</span> uint32_t counterSetRecordWord1 = 8u; <span class="comment">// The offset is always eight here, as the name field is always</span></div><div class="line"><a name="l00367"></a><span class="lineno">  367</span>&#160;                                               <span class="comment">// the first (and only) item in the pool after the two counter set words</span></div><div class="line"><a name="l00368"></a><span class="lineno">  368</span>&#160;</div><div class="line"><a name="l00369"></a><span class="lineno">  369</span>&#160;    <span class="comment">// Convert the device name into a SWTrace namestring</span></div><div class="line"><a name="l00370"></a><span class="lineno">  370</span>&#160;    std::vector&lt;uint32_t&gt; counterSetNameBuffer;</div><div class="line"><a name="l00371"></a><span class="lineno">  371</span>&#160;    <span class="keywordflow">if</span> (!arm::pipe::StringToSwTraceString&lt;arm::pipe::SwTraceNameCharPolicy&gt;(counterSet-&gt;m_Name, counterSetNameBuffer))</div><div class="line"><a name="l00372"></a><span class="lineno">  372</span>&#160;    {</div><div class="line"><a name="l00373"></a><span class="lineno">  373</span>&#160;        errorMessage = fmt::format(<span class="stringliteral">&quot;Cannot convert the name of counter set {} ({}) to an SWTrace namestring&quot;</span>,</div><div class="line"><a name="l00374"></a><span class="lineno">  374</span>&#160;                                   counterSetUid,</div><div class="line"><a name="l00375"></a><span class="lineno">  375</span>&#160;                                   counterSetName);</div><div class="line"><a name="l00376"></a><span class="lineno">  376</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;    }</div><div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;</div><div class="line"><a name="l00379"></a><span class="lineno">  379</span>&#160;    <span class="comment">// Calculate the size in words of the counter set record</span></div><div class="line"><a name="l00380"></a><span class="lineno">  380</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> counterSetRecordSize = 2u + <span class="comment">// The size of the fixed part (uid + cores + name_offset)</span></div><div class="line"><a name="l00381"></a><span class="lineno">  381</span>&#160;                                        counterSetNameBuffer.size(); <span class="comment">// The size of the variable part (the counter set</span></div><div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;                                                                     <span class="comment">// name including the null-terminator)</span></div><div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;</div><div class="line"><a name="l00384"></a><span class="lineno">  384</span>&#160;    <span class="comment">// Allocate the space for the counter set record</span></div><div class="line"><a name="l00385"></a><span class="lineno">  385</span>&#160;    counterSetRecord.resize(counterSetRecordSize);</div><div class="line"><a name="l00386"></a><span class="lineno">  386</span>&#160;</div><div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;    <span class="comment">// Create the counter set record</span></div><div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;    counterSetRecord[0] = counterSetRecordWord0; <span class="comment">// uid + core</span></div><div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;    counterSetRecord[1] = counterSetRecordWord1; <span class="comment">// name_offset</span></div><div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160;    <span class="keyword">auto</span> offset = counterSetRecord.begin() + 2u;</div><div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;    std::copy(counterSetNameBuffer.begin(), counterSetNameBuffer.end(), offset); <span class="comment">// name</span></div><div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;</div><div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;}</div><div class="line"><a name="l00395"></a><span class="lineno">  395</span>&#160;</div><div class="line"><a name="l00396"></a><span class="lineno"><a class="line" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#ac134e8d175e305297b729b4461d9f34f">  396</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#ac134e8d175e305297b729b4461d9f34f">SendCounterPacket::CreateEventRecord</a>(<span class="keyword">const</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a38de53725b010ce63ea7557bb1d270e7">CounterPtr</a>&amp; counter,</div><div class="line"><a name="l00397"></a><span class="lineno">  397</span>&#160;                                          <a class="code" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#a7b90a935def976944525581f5f254068">EventRecord</a>&amp; eventRecord,</div><div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;                                          std::string&amp; errorMessage)</div><div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;{</div><div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(counter);</div><div class="line"><a name="l00401"></a><span class="lineno">  401</span>&#160;</div><div class="line"><a name="l00402"></a><span class="lineno">  402</span>&#160;    uint16_t           counterUid           = counter-&gt;m_Uid;</div><div class="line"><a name="l00403"></a><span class="lineno">  403</span>&#160;    uint16_t           maxCounterUid        = counter-&gt;m_MaxCounterUid;</div><div class="line"><a name="l00404"></a><span class="lineno">  404</span>&#160;    uint16_t           deviceUid            = counter-&gt;m_DeviceUid;</div><div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;    uint16_t           counterSetUid        = counter-&gt;m_CounterSetUid;</div><div class="line"><a name="l00406"></a><span class="lineno">  406</span>&#160;    uint16_t           counterClass         = counter-&gt;m_Class;</div><div class="line"><a name="l00407"></a><span class="lineno">  407</span>&#160;    uint16_t           counterInterpolation = counter-&gt;m_Interpolation;</div><div class="line"><a name="l00408"></a><span class="lineno">  408</span>&#160;    <span class="keywordtype">double</span>             counterMultiplier    = counter-&gt;m_Multiplier;</div><div class="line"><a name="l00409"></a><span class="lineno">  409</span>&#160;    <span class="keyword">const</span> std::string&amp; counterName          = counter-&gt;m_Name;</div><div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;    <span class="keyword">const</span> std::string&amp; counterDescription   = counter-&gt;m_Description;</div><div class="line"><a name="l00411"></a><span class="lineno">  411</span>&#160;    <span class="keyword">const</span> std::string&amp; counterUnits         = counter-&gt;m_Units;</div><div class="line"><a name="l00412"></a><span class="lineno">  412</span>&#160;</div><div class="line"><a name="l00413"></a><span class="lineno">  413</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(counterClass == 0 || counterClass == 1);</div><div class="line"><a name="l00414"></a><span class="lineno">  414</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(counterInterpolation == 0 || counterInterpolation == 1);</div><div class="line"><a name="l00415"></a><span class="lineno">  415</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(counterMultiplier);</div><div class="line"><a name="l00416"></a><span class="lineno">  416</span>&#160;</div><div class="line"><a name="l00417"></a><span class="lineno">  417</span>&#160;    <span class="comment">// Utils</span></div><div class="line"><a name="l00418"></a><span class="lineno">  418</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a> = <span class="keyword">sizeof</span>(uint32_t);</div><div class="line"><a name="l00419"></a><span class="lineno">  419</span>&#160;    <span class="comment">// eventRecordBlockSize is the size of the fixed part</span></div><div class="line"><a name="l00420"></a><span class="lineno">  420</span>&#160;    <span class="comment">// (counter_uid + max_counter_uid + device +</span></div><div class="line"><a name="l00421"></a><span class="lineno">  421</span>&#160;    <span class="comment">// counter_set + class + interpolation +</span></div><div class="line"><a name="l00422"></a><span class="lineno">  422</span>&#160;    <span class="comment">// multiplier + name_offset + description_offset +</span></div><div class="line"><a name="l00423"></a><span class="lineno">  423</span>&#160;    <span class="comment">// units_offset)</span></div><div class="line"><a name="l00424"></a><span class="lineno">  424</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> eventRecordBlockSize = 8u;</div><div class="line"><a name="l00425"></a><span class="lineno">  425</span>&#160;</div><div class="line"><a name="l00426"></a><span class="lineno">  426</span>&#160;    <span class="comment">// Event record word 0:</span></div><div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;    <span class="comment">// 16:31 [16] max_counter_uid: if the device this event is associated with has more than one core and there</span></div><div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;    <span class="comment">//                             is one of these counters per core this value will be set to</span></div><div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;    <span class="comment">//                             (counter_uid + cores (from device_record)) - 1.</span></div><div class="line"><a name="l00430"></a><span class="lineno">  430</span>&#160;    <span class="comment">//                             If there is only a single core then this value will be the same as</span></div><div class="line"><a name="l00431"></a><span class="lineno">  431</span>&#160;    <span class="comment">//                             the counter_uid value</span></div><div class="line"><a name="l00432"></a><span class="lineno">  432</span>&#160;    <span class="comment">// 0:15  [16] count_uid: unique ID for the counter. Must be unique across all counters in all categories</span></div><div class="line"><a name="l00433"></a><span class="lineno">  433</span>&#160;    <span class="keyword">const</span> uint32_t eventRecordWord0 = (<span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(maxCounterUid) &lt;&lt; 16) |</div><div class="line"><a name="l00434"></a><span class="lineno">  434</span>&#160;                                      (<span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(counterUid));</div><div class="line"><a name="l00435"></a><span class="lineno">  435</span>&#160;</div><div class="line"><a name="l00436"></a><span class="lineno">  436</span>&#160;    <span class="comment">// Event record word 1:</span></div><div class="line"><a name="l00437"></a><span class="lineno">  437</span>&#160;    <span class="comment">// 16:31 [16] device: UID of the device this event is associated with. Set to zero if the event is NOT</span></div><div class="line"><a name="l00438"></a><span class="lineno">  438</span>&#160;    <span class="comment">//                    associated with a device</span></div><div class="line"><a name="l00439"></a><span class="lineno">  439</span>&#160;    <span class="comment">// 0:15  [16] counter_set: UID of the counter_set this event is associated with. Set to zero if the event</span></div><div class="line"><a name="l00440"></a><span class="lineno">  440</span>&#160;    <span class="comment">//                         is NOT associated with a counter_set</span></div><div class="line"><a name="l00441"></a><span class="lineno">  441</span>&#160;    <span class="keyword">const</span> uint32_t eventRecordWord1 = (<span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(deviceUid) &lt;&lt; 16) |</div><div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160;                                      (<span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(counterSetUid));</div><div class="line"><a name="l00443"></a><span class="lineno">  443</span>&#160;</div><div class="line"><a name="l00444"></a><span class="lineno">  444</span>&#160;    <span class="comment">// Event record word 2:</span></div><div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;    <span class="comment">// 16:31 [16] class: type describing how to treat each data point in a stream of data points</span></div><div class="line"><a name="l00446"></a><span class="lineno">  446</span>&#160;    <span class="comment">// 0:15  [16] interpolation: type describing how to interpolate each data point in a stream of data points</span></div><div class="line"><a name="l00447"></a><span class="lineno">  447</span>&#160;    <span class="keyword">const</span> uint32_t eventRecordWord2 = (<span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(counterClass) &lt;&lt; 16) |</div><div class="line"><a name="l00448"></a><span class="lineno">  448</span>&#160;                                      (<span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(counterInterpolation));</div><div class="line"><a name="l00449"></a><span class="lineno">  449</span>&#160;</div><div class="line"><a name="l00450"></a><span class="lineno">  450</span>&#160;    <span class="comment">// Event record word 3-4:</span></div><div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;    <span class="comment">// 0:63 [64] multiplier: internal data stream is represented as integer values, this allows scaling of</span></div><div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;    <span class="comment">//                       those values as if they are fixed point numbers. Zero is not a valid value</span></div><div class="line"><a name="l00453"></a><span class="lineno">  453</span>&#160;    uint32_t multiplier[2] = { 0u, 0u };</div><div class="line"><a name="l00454"></a><span class="lineno">  454</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(<span class="keyword">sizeof</span>(counterMultiplier) == <span class="keyword">sizeof</span>(multiplier));</div><div class="line"><a name="l00455"></a><span class="lineno">  455</span>&#160;    std::memcpy(multiplier, &amp;counterMultiplier, <span class="keyword">sizeof</span>(multiplier));</div><div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;    <span class="keyword">const</span> uint32_t eventRecordWord3 = multiplier[0];</div><div class="line"><a name="l00457"></a><span class="lineno">  457</span>&#160;    <span class="keyword">const</span> uint32_t eventRecordWord4 = multiplier[1];</div><div class="line"><a name="l00458"></a><span class="lineno">  458</span>&#160;</div><div class="line"><a name="l00459"></a><span class="lineno">  459</span>&#160;    <span class="comment">// Event record word 5:</span></div><div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;    <span class="comment">// 0:31 [32] name_offset: offset from the beginning of the event record pool to the name field</span></div><div class="line"><a name="l00461"></a><span class="lineno">  461</span>&#160;    <span class="keyword">const</span> uint32_t eventRecordWord5 = <span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(eventRecordBlockSize * <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>);</div><div class="line"><a name="l00462"></a><span class="lineno">  462</span>&#160;</div><div class="line"><a name="l00463"></a><span class="lineno">  463</span>&#160;    <span class="comment">// Convert the counter name into a SWTrace string</span></div><div class="line"><a name="l00464"></a><span class="lineno">  464</span>&#160;    std::vector&lt;uint32_t&gt; counterNameBuffer;</div><div class="line"><a name="l00465"></a><span class="lineno">  465</span>&#160;    <span class="keywordflow">if</span> (!arm::pipe::StringToSwTraceString&lt;arm::pipe::SwTraceCharPolicy&gt;(counterName, counterNameBuffer))</div><div class="line"><a name="l00466"></a><span class="lineno">  466</span>&#160;    {</div><div class="line"><a name="l00467"></a><span class="lineno">  467</span>&#160;        errorMessage = fmt::format(<span class="stringliteral">&quot;Cannot convert the name of counter {} (name: {}) to an SWTrace string&quot;</span>,</div><div class="line"><a name="l00468"></a><span class="lineno">  468</span>&#160;                                   counterUid,</div><div class="line"><a name="l00469"></a><span class="lineno">  469</span>&#160;                                   counterName);</div><div class="line"><a name="l00470"></a><span class="lineno">  470</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00471"></a><span class="lineno">  471</span>&#160;    }</div><div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;</div><div class="line"><a name="l00473"></a><span class="lineno">  473</span>&#160;    <span class="comment">// Event record word 6:</span></div><div class="line"><a name="l00474"></a><span class="lineno">  474</span>&#160;    <span class="comment">// 0:31 [32] description_offset: offset from the beginning of the event record pool to the description field</span></div><div class="line"><a name="l00475"></a><span class="lineno">  475</span>&#160;    <span class="comment">// The size of the name buffer in bytes</span></div><div class="line"><a name="l00476"></a><span class="lineno">  476</span>&#160;    uint32_t eventRecordWord6 =</div><div class="line"><a name="l00477"></a><span class="lineno">  477</span>&#160;            <span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>((counterNameBuffer.size() + eventRecordBlockSize) * uint32_t_size);</div><div class="line"><a name="l00478"></a><span class="lineno">  478</span>&#160;</div><div class="line"><a name="l00479"></a><span class="lineno">  479</span>&#160;    <span class="comment">// Convert the counter description into a SWTrace string</span></div><div class="line"><a name="l00480"></a><span class="lineno">  480</span>&#160;    std::vector&lt;uint32_t&gt; counterDescriptionBuffer;</div><div class="line"><a name="l00481"></a><span class="lineno">  481</span>&#160;    <span class="keywordflow">if</span> (!arm::pipe::StringToSwTraceString&lt;arm::pipe::SwTraceCharPolicy&gt;(counterDescription, counterDescriptionBuffer))</div><div class="line"><a name="l00482"></a><span class="lineno">  482</span>&#160;    {</div><div class="line"><a name="l00483"></a><span class="lineno">  483</span>&#160;        errorMessage = fmt::format(<span class="stringliteral">&quot;Cannot convert the description of counter {} (description: {}) &quot;</span></div><div class="line"><a name="l00484"></a><span class="lineno">  484</span>&#160;                                   <span class="stringliteral">&quot;to an SWTrace string&quot;</span>,</div><div class="line"><a name="l00485"></a><span class="lineno">  485</span>&#160;                                   counterUid,</div><div class="line"><a name="l00486"></a><span class="lineno">  486</span>&#160;                                   counterName);</div><div class="line"><a name="l00487"></a><span class="lineno">  487</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00488"></a><span class="lineno">  488</span>&#160;    }</div><div class="line"><a name="l00489"></a><span class="lineno">  489</span>&#160;</div><div class="line"><a name="l00490"></a><span class="lineno">  490</span>&#160;    <span class="comment">// Event record word 7:</span></div><div class="line"><a name="l00491"></a><span class="lineno">  491</span>&#160;    <span class="comment">// 0:31 [32] units_offset: (optional) offset from the beginning of the event record pool to the units field.</span></div><div class="line"><a name="l00492"></a><span class="lineno">  492</span>&#160;    <span class="comment">//                         An offset value of zero indicates this field is not provided</span></div><div class="line"><a name="l00493"></a><span class="lineno">  493</span>&#160;    <span class="keywordtype">bool</span> includeUnits = !counterUnits.empty();</div><div class="line"><a name="l00494"></a><span class="lineno">  494</span>&#160;    <span class="comment">// The size of the description buffer in bytes</span></div><div class="line"><a name="l00495"></a><span class="lineno">  495</span>&#160;    <span class="keyword">const</span> uint32_t eventRecordWord7 = includeUnits ?</div><div class="line"><a name="l00496"></a><span class="lineno">  496</span>&#160;                                eventRecordWord6 +</div><div class="line"><a name="l00497"></a><span class="lineno">  497</span>&#160;                                <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint32_t&gt;(counterDescriptionBuffer.size()</div><div class="line"><a name="l00498"></a><span class="lineno">  498</span>&#160;                                * <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>) :</div><div class="line"><a name="l00499"></a><span class="lineno">  499</span>&#160;                                0;</div><div class="line"><a name="l00500"></a><span class="lineno">  500</span>&#160;</div><div class="line"><a name="l00501"></a><span class="lineno">  501</span>&#160;    <span class="comment">// Convert the counter units into a SWTrace namestring (optional)</span></div><div class="line"><a name="l00502"></a><span class="lineno">  502</span>&#160;    std::vector&lt;uint32_t&gt; counterUnitsBuffer;</div><div class="line"><a name="l00503"></a><span class="lineno">  503</span>&#160;    <span class="keywordflow">if</span> (includeUnits)</div><div class="line"><a name="l00504"></a><span class="lineno">  504</span>&#160;    {</div><div class="line"><a name="l00505"></a><span class="lineno">  505</span>&#160;        <span class="comment">// Convert the counter units into a SWTrace namestring</span></div><div class="line"><a name="l00506"></a><span class="lineno">  506</span>&#160;        <span class="keywordflow">if</span> (!arm::pipe::StringToSwTraceString&lt;arm::pipe::SwTraceNameCharPolicy&gt;(counterUnits, counterUnitsBuffer))</div><div class="line"><a name="l00507"></a><span class="lineno">  507</span>&#160;        {</div><div class="line"><a name="l00508"></a><span class="lineno">  508</span>&#160;            errorMessage = fmt::format(<span class="stringliteral">&quot;Cannot convert the units of counter {} (units: {}) to an SWTrace string&quot;</span>,</div><div class="line"><a name="l00509"></a><span class="lineno">  509</span>&#160;                                       counterUid,</div><div class="line"><a name="l00510"></a><span class="lineno">  510</span>&#160;                                       counterName);</div><div class="line"><a name="l00511"></a><span class="lineno">  511</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00512"></a><span class="lineno">  512</span>&#160;        }</div><div class="line"><a name="l00513"></a><span class="lineno">  513</span>&#160;    }</div><div class="line"><a name="l00514"></a><span class="lineno">  514</span>&#160;</div><div class="line"><a name="l00515"></a><span class="lineno">  515</span>&#160;    <span class="comment">// Calculate the size in words of the event record</span></div><div class="line"><a name="l00516"></a><span class="lineno">  516</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> eventRecordSize = eventRecordBlockSize +</div><div class="line"><a name="l00517"></a><span class="lineno">  517</span>&#160;                                   counterNameBuffer.size() +        <span class="comment">// The size of the variable part (the counter name,</span></div><div class="line"><a name="l00518"></a><span class="lineno">  518</span>&#160;                                   counterDescriptionBuffer.size() + <span class="comment">// description and units</span></div><div class="line"><a name="l00519"></a><span class="lineno">  519</span>&#160;                                   counterUnitsBuffer.size();        <span class="comment">// including the null-terminator)</span></div><div class="line"><a name="l00520"></a><span class="lineno">  520</span>&#160;</div><div class="line"><a name="l00521"></a><span class="lineno">  521</span>&#160;    <span class="comment">// Allocate the space for the event record</span></div><div class="line"><a name="l00522"></a><span class="lineno">  522</span>&#160;    eventRecord.resize(eventRecordSize);</div><div class="line"><a name="l00523"></a><span class="lineno">  523</span>&#160;</div><div class="line"><a name="l00524"></a><span class="lineno">  524</span>&#160;    <a class="code" href="_conversion_8hpp.xhtml#aeaf555aa7f39f7ba192a3812cb1b7d07">ARMNN_NO_CONVERSION_WARN_BEGIN</a></div><div class="line"><a name="l00525"></a><span class="lineno">  525</span>&#160;    <span class="comment">// Create the event record</span></div><div class="line"><a name="l00526"></a><span class="lineno">  526</span>&#160;    eventRecord[0] = eventRecordWord0; <span class="comment">// max_counter_uid + counter_uid</span></div><div class="line"><a name="l00527"></a><span class="lineno">  527</span>&#160;    eventRecord[1] = eventRecordWord1; <span class="comment">// device + counter_set</span></div><div class="line"><a name="l00528"></a><span class="lineno">  528</span>&#160;    eventRecord[2] = eventRecordWord2; <span class="comment">// class + interpolation</span></div><div class="line"><a name="l00529"></a><span class="lineno">  529</span>&#160;    eventRecord[3] = eventRecordWord3; <span class="comment">// multiplier</span></div><div class="line"><a name="l00530"></a><span class="lineno">  530</span>&#160;    eventRecord[4] = eventRecordWord4; <span class="comment">// multiplier</span></div><div class="line"><a name="l00531"></a><span class="lineno">  531</span>&#160;    eventRecord[5] = eventRecordWord5; <span class="comment">// name_offset</span></div><div class="line"><a name="l00532"></a><span class="lineno">  532</span>&#160;    eventRecord[6] = eventRecordWord6; <span class="comment">// description_offset</span></div><div class="line"><a name="l00533"></a><span class="lineno">  533</span>&#160;    eventRecord[7] = eventRecordWord7; <span class="comment">// units_offset</span></div><div class="line"><a name="l00534"></a><span class="lineno">  534</span>&#160;    <span class="keyword">auto</span> offset = eventRecord.begin() + 8u;</div><div class="line"><a name="l00535"></a><span class="lineno">  535</span>&#160;    std::copy(counterNameBuffer.begin(), counterNameBuffer.end(), offset); <span class="comment">// name</span></div><div class="line"><a name="l00536"></a><span class="lineno">  536</span>&#160;    offset += counterNameBuffer.size();</div><div class="line"><a name="l00537"></a><span class="lineno">  537</span>&#160;    std::copy(counterDescriptionBuffer.begin(), counterDescriptionBuffer.end(), offset); <span class="comment">// description</span></div><div class="line"><a name="l00538"></a><span class="lineno">  538</span>&#160;    <span class="keywordflow">if</span> (includeUnits)</div><div class="line"><a name="l00539"></a><span class="lineno">  539</span>&#160;    {</div><div class="line"><a name="l00540"></a><span class="lineno">  540</span>&#160;        offset += counterDescriptionBuffer.size();</div><div class="line"><a name="l00541"></a><span class="lineno">  541</span>&#160;        std::copy(counterUnitsBuffer.begin(), counterUnitsBuffer.end(), offset); <span class="comment">// units</span></div><div class="line"><a name="l00542"></a><span class="lineno">  542</span>&#160;    }</div><div class="line"><a name="l00543"></a><span class="lineno">  543</span>&#160;    <a class="code" href="_conversion_8hpp.xhtml#a71cf574f1296e09d0ce16157bdeb6619">ARMNN_NO_CONVERSION_WARN_END</a></div><div class="line"><a name="l00544"></a><span class="lineno">  544</span>&#160;</div><div class="line"><a name="l00545"></a><span class="lineno">  545</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00546"></a><span class="lineno">  546</span>&#160;}</div><div class="line"><a name="l00547"></a><span class="lineno">  547</span>&#160;</div><div class="line"><a name="l00548"></a><span class="lineno"><a class="line" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#a3b526a823530443efec886c4305e52de">  548</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#a3b526a823530443efec886c4305e52de">SendCounterPacket::SendCounterDirectoryPacket</a>(<span class="keyword">const</span> <a class="code" href="classarmnn_1_1profiling_1_1_i_counter_directory.xhtml">ICounterDirectory</a>&amp; counterDirectory)</div><div class="line"><a name="l00549"></a><span class="lineno">  549</span>&#160;{</div><div class="line"><a name="l00550"></a><span class="lineno">  550</span>&#160;    <span class="comment">// Get the amount of data that needs to be put into the packet</span></div><div class="line"><a name="l00551"></a><span class="lineno">  551</span>&#160;    <span class="keyword">const</span> uint16_t categoryCount    = counterDirectory.<a class="code" href="classarmnn_1_1profiling_1_1_i_counter_directory.xhtml#ab43b0472c37fe51694977ae9b4132404">GetCategoryCount</a>();</div><div class="line"><a name="l00552"></a><span class="lineno">  552</span>&#160;    <span class="keyword">const</span> uint16_t deviceCount      = counterDirectory.<a class="code" href="classarmnn_1_1profiling_1_1_i_counter_directory.xhtml#aecd5912045fd41fe41dc96c9844f6deb">GetDeviceCount</a>();</div><div class="line"><a name="l00553"></a><span class="lineno">  553</span>&#160;    <span class="keyword">const</span> uint16_t counterSetCount  = counterDirectory.<a class="code" href="classarmnn_1_1profiling_1_1_i_counter_directory.xhtml#aef59fdca57a5bb822e22cacfc5836fab">GetCounterSetCount</a>();</div><div class="line"><a name="l00554"></a><span class="lineno">  554</span>&#160;</div><div class="line"><a name="l00555"></a><span class="lineno">  555</span>&#160;    <span class="comment">// Utils</span></div><div class="line"><a name="l00556"></a><span class="lineno">  556</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a> = <span class="keyword">sizeof</span>(uint32_t);</div><div class="line"><a name="l00557"></a><span class="lineno">  557</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> packetHeaderSize = 2u;</div><div class="line"><a name="l00558"></a><span class="lineno">  558</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> bodyHeaderSize = 6u;</div><div class="line"><a name="l00559"></a><span class="lineno">  559</span>&#160;    <span class="keyword">const</span> uint32_t bodyHeaderSizeBytes = bodyHeaderSize * <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>;</div><div class="line"><a name="l00560"></a><span class="lineno">  560</span>&#160;</div><div class="line"><a name="l00561"></a><span class="lineno">  561</span>&#160;    <span class="comment">// Initialize the offset for the pointer tables</span></div><div class="line"><a name="l00562"></a><span class="lineno">  562</span>&#160;    uint32_t pointerTableOffset = 0;</div><div class="line"><a name="l00563"></a><span class="lineno">  563</span>&#160;</div><div class="line"><a name="l00564"></a><span class="lineno">  564</span>&#160;    <span class="comment">// --------------</span></div><div class="line"><a name="l00565"></a><span class="lineno">  565</span>&#160;    <span class="comment">// Device records</span></div><div class="line"><a name="l00566"></a><span class="lineno">  566</span>&#160;    <span class="comment">// --------------</span></div><div class="line"><a name="l00567"></a><span class="lineno">  567</span>&#160;</div><div class="line"><a name="l00568"></a><span class="lineno">  568</span>&#160;    <span class="comment">// Process device records</span></div><div class="line"><a name="l00569"></a><span class="lineno">  569</span>&#160;    std::vector&lt;DeviceRecord&gt; deviceRecords(deviceCount);</div><div class="line"><a name="l00570"></a><span class="lineno">  570</span>&#160;    <span class="keyword">const</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3ff1066867cb9bd3b08338957c414401">Devices</a>&amp; devices = counterDirectory.<a class="code" href="classarmnn_1_1profiling_1_1_i_counter_directory.xhtml#a98e6769cb933d30bfd3ca25f61bd8438">GetDevices</a>();</div><div class="line"><a name="l00571"></a><span class="lineno">  571</span>&#160;    std::vector&lt;uint32_t&gt; deviceRecordOffsets(deviceCount, 0); <span class="comment">// device_records_pointer_table</span></div><div class="line"><a name="l00572"></a><span class="lineno">  572</span>&#160;    <span class="keywordtype">size_t</span> deviceRecordsSize = 0;</div><div class="line"><a name="l00573"></a><span class="lineno">  573</span>&#160;    <span class="keywordtype">size_t</span> deviceIndex = 0;</div><div class="line"><a name="l00574"></a><span class="lineno">  574</span>&#160;    <span class="keywordtype">size_t</span> deviceRecordOffsetIndex = 0;</div><div class="line"><a name="l00575"></a><span class="lineno">  575</span>&#160;</div><div class="line"><a name="l00576"></a><span class="lineno">  576</span>&#160;    pointerTableOffset = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint32_t&gt;(deviceCount * uint32_t_size +</div><div class="line"><a name="l00577"></a><span class="lineno">  577</span>&#160;                                                       counterSetCount * uint32_t_size +</div><div class="line"><a name="l00578"></a><span class="lineno">  578</span>&#160;                                                       categoryCount   * <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>);</div><div class="line"><a name="l00579"></a><span class="lineno">  579</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span> it = devices.begin(); it != devices.end(); it++)</div><div class="line"><a name="l00580"></a><span class="lineno">  580</span>&#160;    {</div><div class="line"><a name="l00581"></a><span class="lineno">  581</span>&#160;        <span class="keyword">const</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a22a0d730c0d08335585e6e8999be8f8b">DevicePtr</a>&amp; device = it-&gt;second;</div><div class="line"><a name="l00582"></a><span class="lineno">  582</span>&#160;        <a class="code" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#ae8cb0ed3b5a68b271532e959ec2507d4">DeviceRecord</a>&amp; deviceRecord = deviceRecords.at(deviceIndex);</div><div class="line"><a name="l00583"></a><span class="lineno">  583</span>&#160;</div><div class="line"><a name="l00584"></a><span class="lineno">  584</span>&#160;        std::string errorMessage;</div><div class="line"><a name="l00585"></a><span class="lineno">  585</span>&#160;        <span class="keywordflow">if</span> (!<a class="code" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#af18b6d5da883305c751d6ed00bea006a">CreateDeviceRecord</a>(device, deviceRecord, errorMessage))</div><div class="line"><a name="l00586"></a><span class="lineno">  586</span>&#160;        {</div><div class="line"><a name="l00587"></a><span class="lineno">  587</span>&#160;            CancelOperationAndThrow&lt;RuntimeException&gt;(errorMessage);</div><div class="line"><a name="l00588"></a><span class="lineno">  588</span>&#160;        }</div><div class="line"><a name="l00589"></a><span class="lineno">  589</span>&#160;</div><div class="line"><a name="l00590"></a><span class="lineno">  590</span>&#160;        <span class="comment">// Update the total size in words of the device records</span></div><div class="line"><a name="l00591"></a><span class="lineno">  591</span>&#160;        deviceRecordsSize += deviceRecord.size();</div><div class="line"><a name="l00592"></a><span class="lineno">  592</span>&#160;</div><div class="line"><a name="l00593"></a><span class="lineno">  593</span>&#160;        <span class="comment">// Add the device record offset to the device records pointer table offset field</span></div><div class="line"><a name="l00594"></a><span class="lineno">  594</span>&#160;        deviceRecordOffsets[deviceRecordOffsetIndex] = pointerTableOffset;</div><div class="line"><a name="l00595"></a><span class="lineno">  595</span>&#160;        pointerTableOffset += <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint32_t&gt;(deviceRecord.size() * <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>);</div><div class="line"><a name="l00596"></a><span class="lineno">  596</span>&#160;</div><div class="line"><a name="l00597"></a><span class="lineno">  597</span>&#160;        deviceIndex++;</div><div class="line"><a name="l00598"></a><span class="lineno">  598</span>&#160;        deviceRecordOffsetIndex++;</div><div class="line"><a name="l00599"></a><span class="lineno">  599</span>&#160;    }</div><div class="line"><a name="l00600"></a><span class="lineno">  600</span>&#160;</div><div class="line"><a name="l00601"></a><span class="lineno">  601</span>&#160;    <span class="comment">// -------------------</span></div><div class="line"><a name="l00602"></a><span class="lineno">  602</span>&#160;    <span class="comment">// Counter set records</span></div><div class="line"><a name="l00603"></a><span class="lineno">  603</span>&#160;    <span class="comment">// -------------------</span></div><div class="line"><a name="l00604"></a><span class="lineno">  604</span>&#160;</div><div class="line"><a name="l00605"></a><span class="lineno">  605</span>&#160;    <span class="comment">// Process counter set records</span></div><div class="line"><a name="l00606"></a><span class="lineno">  606</span>&#160;    std::vector&lt;CounterSetRecord&gt; counterSetRecords(counterSetCount);</div><div class="line"><a name="l00607"></a><span class="lineno">  607</span>&#160;    <span class="keyword">const</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#acfe20da73b5dc66439a65b49f04f7a21">CounterSets</a>&amp; counterSets = counterDirectory.<a class="code" href="classarmnn_1_1profiling_1_1_i_counter_directory.xhtml#a8908490db3b8a0003a639ac56b956cee">GetCounterSets</a>();</div><div class="line"><a name="l00608"></a><span class="lineno">  608</span>&#160;    std::vector&lt;uint32_t&gt; counterSetRecordOffsets(counterSetCount, 0); <span class="comment">// counter_set_records_pointer_table</span></div><div class="line"><a name="l00609"></a><span class="lineno">  609</span>&#160;    <span class="keywordtype">size_t</span> counterSetRecordsSize = 0;</div><div class="line"><a name="l00610"></a><span class="lineno">  610</span>&#160;    <span class="keywordtype">size_t</span> counterSetIndex = 0;</div><div class="line"><a name="l00611"></a><span class="lineno">  611</span>&#160;    <span class="keywordtype">size_t</span> counterSetRecordOffsetIndex = 0;</div><div class="line"><a name="l00612"></a><span class="lineno">  612</span>&#160;</div><div class="line"><a name="l00613"></a><span class="lineno">  613</span>&#160;    pointerTableOffset -= <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint32_t&gt;(deviceCount * <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>);</div><div class="line"><a name="l00614"></a><span class="lineno">  614</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span> it = counterSets.begin(); it != counterSets.end(); it++)</div><div class="line"><a name="l00615"></a><span class="lineno">  615</span>&#160;    {</div><div class="line"><a name="l00616"></a><span class="lineno">  616</span>&#160;        <span class="keyword">const</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#abaedc7fcb8ecb2e086482afe10737fb7">CounterSetPtr</a>&amp; counterSet = it-&gt;second;</div><div class="line"><a name="l00617"></a><span class="lineno">  617</span>&#160;        <a class="code" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#a30f18e205737ed0a4057d18b52d48018">CounterSetRecord</a>&amp; counterSetRecord = counterSetRecords.at(counterSetIndex);</div><div class="line"><a name="l00618"></a><span class="lineno">  618</span>&#160;</div><div class="line"><a name="l00619"></a><span class="lineno">  619</span>&#160;        std::string errorMessage;</div><div class="line"><a name="l00620"></a><span class="lineno">  620</span>&#160;        <span class="keywordflow">if</span> (!<a class="code" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#ad0a58db963ae04484cdc3addd8327c3e">CreateCounterSetRecord</a>(counterSet, counterSetRecord, errorMessage))</div><div class="line"><a name="l00621"></a><span class="lineno">  621</span>&#160;        {</div><div class="line"><a name="l00622"></a><span class="lineno">  622</span>&#160;            CancelOperationAndThrow&lt;RuntimeException&gt;(errorMessage);</div><div class="line"><a name="l00623"></a><span class="lineno">  623</span>&#160;        }</div><div class="line"><a name="l00624"></a><span class="lineno">  624</span>&#160;</div><div class="line"><a name="l00625"></a><span class="lineno">  625</span>&#160;        <span class="comment">// Update the total size in words of the counter set records</span></div><div class="line"><a name="l00626"></a><span class="lineno">  626</span>&#160;        counterSetRecordsSize += counterSetRecord.size();</div><div class="line"><a name="l00627"></a><span class="lineno">  627</span>&#160;</div><div class="line"><a name="l00628"></a><span class="lineno">  628</span>&#160;        <span class="comment">// Add the counter set record offset to the counter set records pointer table offset field</span></div><div class="line"><a name="l00629"></a><span class="lineno">  629</span>&#160;        counterSetRecordOffsets[counterSetRecordOffsetIndex] = pointerTableOffset;</div><div class="line"><a name="l00630"></a><span class="lineno">  630</span>&#160;        pointerTableOffset += <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint32_t&gt;(counterSetRecord.size() * <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>);</div><div class="line"><a name="l00631"></a><span class="lineno">  631</span>&#160;</div><div class="line"><a name="l00632"></a><span class="lineno">  632</span>&#160;        counterSetIndex++;</div><div class="line"><a name="l00633"></a><span class="lineno">  633</span>&#160;        counterSetRecordOffsetIndex++;</div><div class="line"><a name="l00634"></a><span class="lineno">  634</span>&#160;    }</div><div class="line"><a name="l00635"></a><span class="lineno">  635</span>&#160;</div><div class="line"><a name="l00636"></a><span class="lineno">  636</span>&#160;    <span class="comment">// ----------------</span></div><div class="line"><a name="l00637"></a><span class="lineno">  637</span>&#160;    <span class="comment">// Category records</span></div><div class="line"><a name="l00638"></a><span class="lineno">  638</span>&#160;    <span class="comment">// ----------------</span></div><div class="line"><a name="l00639"></a><span class="lineno">  639</span>&#160;</div><div class="line"><a name="l00640"></a><span class="lineno">  640</span>&#160;    <span class="comment">// Process category records</span></div><div class="line"><a name="l00641"></a><span class="lineno">  641</span>&#160;    std::vector&lt;CategoryRecord&gt; categoryRecords(categoryCount);</div><div class="line"><a name="l00642"></a><span class="lineno">  642</span>&#160;    <span class="keyword">const</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#af55bc6e5233a4720fe8a813db470b06f">Categories</a>&amp; categories = counterDirectory.<a class="code" href="classarmnn_1_1profiling_1_1_i_counter_directory.xhtml#a718a75d4c178cf3f687b3f27b8f55091">GetCategories</a>();</div><div class="line"><a name="l00643"></a><span class="lineno">  643</span>&#160;    std::vector&lt;uint32_t&gt; categoryRecordOffsets(categoryCount, 0); <span class="comment">// category_records_pointer_table</span></div><div class="line"><a name="l00644"></a><span class="lineno">  644</span>&#160;    <span class="keywordtype">size_t</span> categoryRecordsSize = 0;</div><div class="line"><a name="l00645"></a><span class="lineno">  645</span>&#160;    <span class="keywordtype">size_t</span> categoryIndex = 0;</div><div class="line"><a name="l00646"></a><span class="lineno">  646</span>&#160;    <span class="keywordtype">size_t</span> categoryRecordOffsetIndex = 0;</div><div class="line"><a name="l00647"></a><span class="lineno">  647</span>&#160;</div><div class="line"><a name="l00648"></a><span class="lineno">  648</span>&#160;    pointerTableOffset -= <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint32_t&gt;(counterSetCount * <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>);</div><div class="line"><a name="l00649"></a><span class="lineno">  649</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span> it = categories.begin(); it != categories.end(); it++)</div><div class="line"><a name="l00650"></a><span class="lineno">  650</span>&#160;    {</div><div class="line"><a name="l00651"></a><span class="lineno">  651</span>&#160;        <span class="keyword">const</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#a8adee535828386656b4c8acfa8bcf871">CategoryPtr</a>&amp; category = *it;</div><div class="line"><a name="l00652"></a><span class="lineno">  652</span>&#160;        <a class="code" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#acc3cd9f22519728404bf47992ea01f77">CategoryRecord</a>&amp; categoryRecord = categoryRecords.at(categoryIndex);</div><div class="line"><a name="l00653"></a><span class="lineno">  653</span>&#160;</div><div class="line"><a name="l00654"></a><span class="lineno">  654</span>&#160;        std::string errorMessage;</div><div class="line"><a name="l00655"></a><span class="lineno">  655</span>&#160;        <span class="keywordflow">if</span> (!<a class="code" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#acd58fc16d0b9e0a3983e3e8719c0f95a">CreateCategoryRecord</a>(category, counterDirectory.<a class="code" href="classarmnn_1_1profiling_1_1_i_counter_directory.xhtml#ad9fa9b8364fcaa2c940ef8e78eff8df2">GetCounters</a>(), categoryRecord, errorMessage))</div><div class="line"><a name="l00656"></a><span class="lineno">  656</span>&#160;        {</div><div class="line"><a name="l00657"></a><span class="lineno">  657</span>&#160;            CancelOperationAndThrow&lt;RuntimeException&gt;(errorMessage);</div><div class="line"><a name="l00658"></a><span class="lineno">  658</span>&#160;        }</div><div class="line"><a name="l00659"></a><span class="lineno">  659</span>&#160;</div><div class="line"><a name="l00660"></a><span class="lineno">  660</span>&#160;        <span class="comment">// Update the total size in words of the category records</span></div><div class="line"><a name="l00661"></a><span class="lineno">  661</span>&#160;        categoryRecordsSize += categoryRecord.size();</div><div class="line"><a name="l00662"></a><span class="lineno">  662</span>&#160;</div><div class="line"><a name="l00663"></a><span class="lineno">  663</span>&#160;        <span class="comment">// Add the category record offset to the category records pointer table offset field</span></div><div class="line"><a name="l00664"></a><span class="lineno">  664</span>&#160;        categoryRecordOffsets[categoryRecordOffsetIndex] = pointerTableOffset;</div><div class="line"><a name="l00665"></a><span class="lineno">  665</span>&#160;        pointerTableOffset += <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint32_t&gt;(categoryRecord.size() * <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>);</div><div class="line"><a name="l00666"></a><span class="lineno">  666</span>&#160;</div><div class="line"><a name="l00667"></a><span class="lineno">  667</span>&#160;        categoryIndex++;</div><div class="line"><a name="l00668"></a><span class="lineno">  668</span>&#160;        categoryRecordOffsetIndex++;</div><div class="line"><a name="l00669"></a><span class="lineno">  669</span>&#160;    }</div><div class="line"><a name="l00670"></a><span class="lineno">  670</span>&#160;</div><div class="line"><a name="l00671"></a><span class="lineno">  671</span>&#160;    <span class="comment">// Calculate the length in words of the counter directory packet&#39;s data (excludes the packet header size)</span></div><div class="line"><a name="l00672"></a><span class="lineno">  672</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> counterDirectoryPacketDataLength =</div><div class="line"><a name="l00673"></a><span class="lineno">  673</span>&#160;                 bodyHeaderSize +                 <span class="comment">// The size of the body header</span></div><div class="line"><a name="l00674"></a><span class="lineno">  674</span>&#160;                 deviceRecordOffsets.size() +     <span class="comment">// The size of the device records pointer table</span></div><div class="line"><a name="l00675"></a><span class="lineno">  675</span>&#160;                 counterSetRecordOffsets.size() + <span class="comment">// The size of counter set pointer table</span></div><div class="line"><a name="l00676"></a><span class="lineno">  676</span>&#160;                 categoryRecordOffsets.size() +   <span class="comment">// The size of category records pointer table</span></div><div class="line"><a name="l00677"></a><span class="lineno">  677</span>&#160;                 deviceRecordsSize +              <span class="comment">// The total size of the device records</span></div><div class="line"><a name="l00678"></a><span class="lineno">  678</span>&#160;                 counterSetRecordsSize +          <span class="comment">// The total size of the counter set records</span></div><div class="line"><a name="l00679"></a><span class="lineno">  679</span>&#160;                 categoryRecordsSize;             <span class="comment">// The total size of the category records</span></div><div class="line"><a name="l00680"></a><span class="lineno">  680</span>&#160;</div><div class="line"><a name="l00681"></a><span class="lineno">  681</span>&#160;    <span class="comment">// Calculate the size in words of the counter directory packet (the data length plus the packet header size)</span></div><div class="line"><a name="l00682"></a><span class="lineno">  682</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> counterDirectoryPacketSize = packetHeaderSize +                <span class="comment">// The size of the packet header</span></div><div class="line"><a name="l00683"></a><span class="lineno">  683</span>&#160;                                              counterDirectoryPacketDataLength; <span class="comment">// The data length</span></div><div class="line"><a name="l00684"></a><span class="lineno">  684</span>&#160;</div><div class="line"><a name="l00685"></a><span class="lineno">  685</span>&#160;    <span class="comment">// Allocate the necessary space for the counter directory packet</span></div><div class="line"><a name="l00686"></a><span class="lineno">  686</span>&#160;    std::vector&lt;uint32_t&gt; counterDirectoryPacket(counterDirectoryPacketSize, 0);</div><div class="line"><a name="l00687"></a><span class="lineno">  687</span>&#160;</div><div class="line"><a name="l00688"></a><span class="lineno">  688</span>&#160;    <span class="comment">// -------------</span></div><div class="line"><a name="l00689"></a><span class="lineno">  689</span>&#160;    <span class="comment">// Packet header</span></div><div class="line"><a name="l00690"></a><span class="lineno">  690</span>&#160;    <span class="comment">// -------------</span></div><div class="line"><a name="l00691"></a><span class="lineno">  691</span>&#160;</div><div class="line"><a name="l00692"></a><span class="lineno">  692</span>&#160;    <span class="comment">// Packet header word 0:</span></div><div class="line"><a name="l00693"></a><span class="lineno">  693</span>&#160;    <span class="comment">// 26:31 [6]  packet_family: control Packet Family</span></div><div class="line"><a name="l00694"></a><span class="lineno">  694</span>&#160;    <span class="comment">// 16:25 [10] packet_id: packet identifier</span></div><div class="line"><a name="l00695"></a><span class="lineno">  695</span>&#160;    <span class="comment">// 8:15  [8]  reserved: all zeros</span></div><div class="line"><a name="l00696"></a><span class="lineno">  696</span>&#160;    <span class="comment">// 0:7   [8]  reserved: all zeros</span></div><div class="line"><a name="l00697"></a><span class="lineno">  697</span>&#160;    uint32_t packetFamily = 0;</div><div class="line"><a name="l00698"></a><span class="lineno">  698</span>&#160;    uint32_t packetId = 2;</div><div class="line"><a name="l00699"></a><span class="lineno">  699</span>&#160;    uint32_t packetHeaderWord0 = ((packetFamily &amp; 0x3F) &lt;&lt; 26) | ((packetId &amp; 0x3FF) &lt;&lt; 16);</div><div class="line"><a name="l00700"></a><span class="lineno">  700</span>&#160;</div><div class="line"><a name="l00701"></a><span class="lineno">  701</span>&#160;    <span class="comment">// Packet header word 1:</span></div><div class="line"><a name="l00702"></a><span class="lineno">  702</span>&#160;    <span class="comment">// 0:31 [32] data_length: length of data, in bytes</span></div><div class="line"><a name="l00703"></a><span class="lineno">  703</span>&#160;    uint32_t packetHeaderWord1 = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint32_t&gt;(</div><div class="line"><a name="l00704"></a><span class="lineno">  704</span>&#160;            counterDirectoryPacketDataLength * <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>);</div><div class="line"><a name="l00705"></a><span class="lineno">  705</span>&#160;</div><div class="line"><a name="l00706"></a><span class="lineno">  706</span>&#160;    <span class="comment">// Create the packet header</span></div><div class="line"><a name="l00707"></a><span class="lineno">  707</span>&#160;    uint32_t packetHeader[2]</div><div class="line"><a name="l00708"></a><span class="lineno">  708</span>&#160;    {</div><div class="line"><a name="l00709"></a><span class="lineno">  709</span>&#160;        packetHeaderWord0, <span class="comment">// packet_family + packet_id + reserved + reserved</span></div><div class="line"><a name="l00710"></a><span class="lineno">  710</span>&#160;        packetHeaderWord1  <span class="comment">// data_length</span></div><div class="line"><a name="l00711"></a><span class="lineno">  711</span>&#160;    };</div><div class="line"><a name="l00712"></a><span class="lineno">  712</span>&#160;</div><div class="line"><a name="l00713"></a><span class="lineno">  713</span>&#160;    <span class="comment">// -----------</span></div><div class="line"><a name="l00714"></a><span class="lineno">  714</span>&#160;    <span class="comment">// Body header</span></div><div class="line"><a name="l00715"></a><span class="lineno">  715</span>&#160;    <span class="comment">// -----------</span></div><div class="line"><a name="l00716"></a><span class="lineno">  716</span>&#160;</div><div class="line"><a name="l00717"></a><span class="lineno">  717</span>&#160;    <span class="comment">// Body header word 0:</span></div><div class="line"><a name="l00718"></a><span class="lineno">  718</span>&#160;    <span class="comment">// 16:31 [16] device_records_count: number of entries in the device_records_pointer_table</span></div><div class="line"><a name="l00719"></a><span class="lineno">  719</span>&#160;    <span class="comment">// 0:15  [16] reserved: all zeros</span></div><div class="line"><a name="l00720"></a><span class="lineno">  720</span>&#160;    <span class="keyword">const</span> uint32_t bodyHeaderWord0 = <span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(deviceCount) &lt;&lt; 16;</div><div class="line"><a name="l00721"></a><span class="lineno">  721</span>&#160;</div><div class="line"><a name="l00722"></a><span class="lineno">  722</span>&#160;    <span class="comment">// Body header word 1:</span></div><div class="line"><a name="l00723"></a><span class="lineno">  723</span>&#160;    <span class="comment">// 0:31 [32] device_records_pointer_table_offset: offset to the device_records_pointer_table</span></div><div class="line"><a name="l00724"></a><span class="lineno">  724</span>&#160;    <span class="keyword">const</span> uint32_t bodyHeaderWord1 = bodyHeaderSizeBytes; <span class="comment">// The offset is always the bodyHeaderSize,</span></div><div class="line"><a name="l00725"></a><span class="lineno">  725</span>&#160;                                                          <span class="comment">// as the device record pointer table field</span></div><div class="line"><a name="l00726"></a><span class="lineno">  726</span>&#160;                                                          <span class="comment">// is always the first item in the pool</span></div><div class="line"><a name="l00727"></a><span class="lineno">  727</span>&#160;</div><div class="line"><a name="l00728"></a><span class="lineno">  728</span>&#160;    <span class="comment">// Body header word 2:</span></div><div class="line"><a name="l00729"></a><span class="lineno">  729</span>&#160;    <span class="comment">// 16:31 [16] counter_set_count: number of entries in the counter_set_pointer_table</span></div><div class="line"><a name="l00730"></a><span class="lineno">  730</span>&#160;    <span class="comment">// 0:15  [16] reserved: all zeros</span></div><div class="line"><a name="l00731"></a><span class="lineno">  731</span>&#160;    <span class="keyword">const</span> uint32_t bodyHeaderWord2 = <span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(counterSetCount) &lt;&lt; 16;</div><div class="line"><a name="l00732"></a><span class="lineno">  732</span>&#160;</div><div class="line"><a name="l00733"></a><span class="lineno">  733</span>&#160;    <span class="comment">// Body header word 3:</span></div><div class="line"><a name="l00734"></a><span class="lineno">  734</span>&#160;    <span class="comment">// 0:31 [32] counter_set_pointer_table_offset: offset to the counter_set_pointer_table</span></div><div class="line"><a name="l00735"></a><span class="lineno">  735</span>&#160;    <span class="keyword">const</span> uint32_t bodyHeaderWord3 = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint32_t&gt;(deviceRecordOffsets.size() *</div><div class="line"><a name="l00736"></a><span class="lineno">  736</span>&#160;                                                                   uint32_t_size +       <span class="comment">// The size of the</span></div><div class="line"><a name="l00737"></a><span class="lineno">  737</span>&#160;                                                                   bodyHeaderSizeBytes); <span class="comment">// device records pointer table</span></div><div class="line"><a name="l00738"></a><span class="lineno">  738</span>&#160;</div><div class="line"><a name="l00739"></a><span class="lineno">  739</span>&#160;    <span class="comment">// Body header word 4:</span></div><div class="line"><a name="l00740"></a><span class="lineno">  740</span>&#160;    <span class="comment">// 16:31 [16] categories_count: number of entries in the categories_pointer_table</span></div><div class="line"><a name="l00741"></a><span class="lineno">  741</span>&#160;    <span class="comment">// 0:15  [16] reserved: all zeros</span></div><div class="line"><a name="l00742"></a><span class="lineno">  742</span>&#160;    <span class="keyword">const</span> uint32_t bodyHeaderWord4 = <span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(categoryCount) &lt;&lt; 16;</div><div class="line"><a name="l00743"></a><span class="lineno">  743</span>&#160;</div><div class="line"><a name="l00744"></a><span class="lineno">  744</span>&#160;    <span class="comment">// Body header word 3:</span></div><div class="line"><a name="l00745"></a><span class="lineno">  745</span>&#160;    <span class="comment">// 0:31 [32] categories_pointer_table_offset: offset to the categories_pointer_table</span></div><div class="line"><a name="l00746"></a><span class="lineno">  746</span>&#160;    <span class="keyword">const</span> uint32_t bodyHeaderWord5 =</div><div class="line"><a name="l00747"></a><span class="lineno">  747</span>&#160;                   <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint32_t&gt;(</div><div class="line"><a name="l00748"></a><span class="lineno">  748</span>&#160;                       deviceRecordOffsets.size() * uint32_t_size +     <span class="comment">// The size of the device records</span></div><div class="line"><a name="l00749"></a><span class="lineno">  749</span>&#160;                       counterSetRecordOffsets.size() * uint32_t_size   <span class="comment">// pointer table, plus the size of</span></div><div class="line"><a name="l00750"></a><span class="lineno">  750</span>&#160;                       +  bodyHeaderSizeBytes);                         <span class="comment">// the counter set pointer table</span></div><div class="line"><a name="l00751"></a><span class="lineno">  751</span>&#160;</div><div class="line"><a name="l00752"></a><span class="lineno">  752</span>&#160;    <span class="comment">// Create the body header</span></div><div class="line"><a name="l00753"></a><span class="lineno">  753</span>&#160;    <span class="keyword">const</span> uint32_t bodyHeader[bodyHeaderSize]</div><div class="line"><a name="l00754"></a><span class="lineno">  754</span>&#160;    {</div><div class="line"><a name="l00755"></a><span class="lineno">  755</span>&#160;        bodyHeaderWord0, <span class="comment">// device_records_count + reserved</span></div><div class="line"><a name="l00756"></a><span class="lineno">  756</span>&#160;        bodyHeaderWord1, <span class="comment">// device_records_pointer_table_offset</span></div><div class="line"><a name="l00757"></a><span class="lineno">  757</span>&#160;        bodyHeaderWord2, <span class="comment">// counter_set_count + reserved</span></div><div class="line"><a name="l00758"></a><span class="lineno">  758</span>&#160;        bodyHeaderWord3, <span class="comment">// counter_set_pointer_table_offset</span></div><div class="line"><a name="l00759"></a><span class="lineno">  759</span>&#160;        bodyHeaderWord4, <span class="comment">// categories_count + reserved</span></div><div class="line"><a name="l00760"></a><span class="lineno">  760</span>&#160;        bodyHeaderWord5  <span class="comment">// categories_pointer_table_offset</span></div><div class="line"><a name="l00761"></a><span class="lineno">  761</span>&#160;    };</div><div class="line"><a name="l00762"></a><span class="lineno">  762</span>&#160;</div><div class="line"><a name="l00763"></a><span class="lineno">  763</span>&#160;    <a class="code" href="_conversion_8hpp.xhtml#aeaf555aa7f39f7ba192a3812cb1b7d07">ARMNN_NO_CONVERSION_WARN_BEGIN</a></div><div class="line"><a name="l00764"></a><span class="lineno">  764</span>&#160;    <span class="comment">// Create the counter directory packet</span></div><div class="line"><a name="l00765"></a><span class="lineno">  765</span>&#160;    <span class="keyword">auto</span> counterDirectoryPacketOffset = counterDirectoryPacket.begin();</div><div class="line"><a name="l00766"></a><span class="lineno">  766</span>&#160;    <span class="comment">// packet_header</span></div><div class="line"><a name="l00767"></a><span class="lineno">  767</span>&#160;    std::copy(packetHeader, packetHeader + packetHeaderSize, counterDirectoryPacketOffset);</div><div class="line"><a name="l00768"></a><span class="lineno">  768</span>&#160;    counterDirectoryPacketOffset += packetHeaderSize;</div><div class="line"><a name="l00769"></a><span class="lineno">  769</span>&#160;    <span class="comment">// body_header</span></div><div class="line"><a name="l00770"></a><span class="lineno">  770</span>&#160;    std::copy(bodyHeader, bodyHeader + bodyHeaderSize, counterDirectoryPacketOffset);</div><div class="line"><a name="l00771"></a><span class="lineno">  771</span>&#160;    counterDirectoryPacketOffset += bodyHeaderSize;</div><div class="line"><a name="l00772"></a><span class="lineno">  772</span>&#160;    <span class="comment">// device_records_pointer_table</span></div><div class="line"><a name="l00773"></a><span class="lineno">  773</span>&#160;    std::copy(deviceRecordOffsets.begin(), deviceRecordOffsets.end(), counterDirectoryPacketOffset);</div><div class="line"><a name="l00774"></a><span class="lineno">  774</span>&#160;    counterDirectoryPacketOffset += deviceRecordOffsets.size();</div><div class="line"><a name="l00775"></a><span class="lineno">  775</span>&#160;    <span class="comment">// counter_set_pointer_table</span></div><div class="line"><a name="l00776"></a><span class="lineno">  776</span>&#160;    std::copy(counterSetRecordOffsets.begin(), counterSetRecordOffsets.end(), counterDirectoryPacketOffset);</div><div class="line"><a name="l00777"></a><span class="lineno">  777</span>&#160;    counterDirectoryPacketOffset += counterSetRecordOffsets.size();</div><div class="line"><a name="l00778"></a><span class="lineno">  778</span>&#160;    <span class="comment">// category_pointer_table</span></div><div class="line"><a name="l00779"></a><span class="lineno">  779</span>&#160;    std::copy(categoryRecordOffsets.begin(), categoryRecordOffsets.end(), counterDirectoryPacketOffset);</div><div class="line"><a name="l00780"></a><span class="lineno">  780</span>&#160;    counterDirectoryPacketOffset += categoryRecordOffsets.size();</div><div class="line"><a name="l00781"></a><span class="lineno">  781</span>&#160;    <span class="comment">// device_records</span></div><div class="line"><a name="l00782"></a><span class="lineno">  782</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#ae8cb0ed3b5a68b271532e959ec2507d4">DeviceRecord</a>&amp; deviceRecord : deviceRecords)</div><div class="line"><a name="l00783"></a><span class="lineno">  783</span>&#160;    {</div><div class="line"><a name="l00784"></a><span class="lineno">  784</span>&#160;        std::copy(deviceRecord.begin(), deviceRecord.end(), counterDirectoryPacketOffset); <span class="comment">// device_record</span></div><div class="line"><a name="l00785"></a><span class="lineno">  785</span>&#160;        counterDirectoryPacketOffset += deviceRecord.size();</div><div class="line"><a name="l00786"></a><span class="lineno">  786</span>&#160;    }</div><div class="line"><a name="l00787"></a><span class="lineno">  787</span>&#160;    <span class="comment">// counter_set_records</span></div><div class="line"><a name="l00788"></a><span class="lineno">  788</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#a30f18e205737ed0a4057d18b52d48018">CounterSetRecord</a>&amp; counterSetRecord : counterSetRecords)</div><div class="line"><a name="l00789"></a><span class="lineno">  789</span>&#160;    {</div><div class="line"><a name="l00790"></a><span class="lineno">  790</span>&#160;        std::copy(counterSetRecord.begin(), counterSetRecord.end(), counterDirectoryPacketOffset); <span class="comment">// counter_set_record</span></div><div class="line"><a name="l00791"></a><span class="lineno">  791</span>&#160;        counterDirectoryPacketOffset += counterSetRecord.size();</div><div class="line"><a name="l00792"></a><span class="lineno">  792</span>&#160;    }</div><div class="line"><a name="l00793"></a><span class="lineno">  793</span>&#160;    <span class="comment">// category_records</span></div><div class="line"><a name="l00794"></a><span class="lineno">  794</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#acc3cd9f22519728404bf47992ea01f77">CategoryRecord</a>&amp; categoryRecord : categoryRecords)</div><div class="line"><a name="l00795"></a><span class="lineno">  795</span>&#160;    {</div><div class="line"><a name="l00796"></a><span class="lineno">  796</span>&#160;        std::copy(categoryRecord.begin(), categoryRecord.end(), counterDirectoryPacketOffset); <span class="comment">// category_record</span></div><div class="line"><a name="l00797"></a><span class="lineno">  797</span>&#160;        counterDirectoryPacketOffset += categoryRecord.size();</div><div class="line"><a name="l00798"></a><span class="lineno">  798</span>&#160;    }</div><div class="line"><a name="l00799"></a><span class="lineno">  799</span>&#160;    <a class="code" href="_conversion_8hpp.xhtml#a71cf574f1296e09d0ce16157bdeb6619">ARMNN_NO_CONVERSION_WARN_END</a></div><div class="line"><a name="l00800"></a><span class="lineno">  800</span>&#160;</div><div class="line"><a name="l00801"></a><span class="lineno">  801</span>&#160;    <span class="comment">// Calculate the total size in bytes of the counter directory packet</span></div><div class="line"><a name="l00802"></a><span class="lineno">  802</span>&#160;    uint32_t totalSize = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint32_t&gt;(counterDirectoryPacketSize * <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>);</div><div class="line"><a name="l00803"></a><span class="lineno">  803</span>&#160;</div><div class="line"><a name="l00804"></a><span class="lineno">  804</span>&#160;    <span class="comment">// Reserve space in the buffer for the packet</span></div><div class="line"><a name="l00805"></a><span class="lineno">  805</span>&#160;    uint32_t reserved = 0;</div><div class="line"><a name="l00806"></a><span class="lineno">  806</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a14328d977cec3abadcfd5935f04f3409">IPacketBufferPtr</a> writeBuffer = m_BufferManager.<a class="code" href="classarmnn_1_1profiling_1_1_i_buffer_manager.xhtml#a49c88b0e052621f30462c3bdbf3e4a7a">Reserve</a>(totalSize, reserved);</div><div class="line"><a name="l00807"></a><span class="lineno">  807</span>&#160;</div><div class="line"><a name="l00808"></a><span class="lineno">  808</span>&#160;    <span class="keywordflow">if</span> (writeBuffer == <span class="keyword">nullptr</span> || reserved &lt; totalSize)</div><div class="line"><a name="l00809"></a><span class="lineno">  809</span>&#160;    {</div><div class="line"><a name="l00810"></a><span class="lineno">  810</span>&#160;        CancelOperationAndThrow&lt;BufferExhaustion&gt;(</div><div class="line"><a name="l00811"></a><span class="lineno">  811</span>&#160;            writeBuffer,</div><div class="line"><a name="l00812"></a><span class="lineno">  812</span>&#160;            fmt::format(<span class="stringliteral">&quot;No space left in buffer. Unable to reserve ({}) bytes.&quot;</span>, totalSize));</div><div class="line"><a name="l00813"></a><span class="lineno">  813</span>&#160;    }</div><div class="line"><a name="l00814"></a><span class="lineno">  814</span>&#160;</div><div class="line"><a name="l00815"></a><span class="lineno">  815</span>&#160;    <span class="comment">// Offset for writing to the buffer</span></div><div class="line"><a name="l00816"></a><span class="lineno">  816</span>&#160;    uint32_t offset = 0;</div><div class="line"><a name="l00817"></a><span class="lineno">  817</span>&#160;</div><div class="line"><a name="l00818"></a><span class="lineno">  818</span>&#160;    <span class="comment">// Write the counter directory packet to the buffer</span></div><div class="line"><a name="l00819"></a><span class="lineno">  819</span>&#160;    <span class="keywordflow">for</span> (uint32_t counterDirectoryPacketWord : counterDirectoryPacket)</div><div class="line"><a name="l00820"></a><span class="lineno">  820</span>&#160;    {</div><div class="line"><a name="l00821"></a><span class="lineno">  821</span>&#160;        <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(writeBuffer, offset, counterDirectoryPacketWord);</div><div class="line"><a name="l00822"></a><span class="lineno">  822</span>&#160;        offset += <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint32_t&gt;(<a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>);</div><div class="line"><a name="l00823"></a><span class="lineno">  823</span>&#160;    }</div><div class="line"><a name="l00824"></a><span class="lineno">  824</span>&#160;</div><div class="line"><a name="l00825"></a><span class="lineno">  825</span>&#160;    m_BufferManager.<a class="code" href="classarmnn_1_1profiling_1_1_i_buffer_manager.xhtml#ad0faa8a317506b2e72252f087c7f3c46">Commit</a>(writeBuffer, totalSize);</div><div class="line"><a name="l00826"></a><span class="lineno">  826</span>&#160;}</div><div class="line"><a name="l00827"></a><span class="lineno">  827</span>&#160;</div><div class="line"><a name="l00828"></a><span class="lineno"><a class="line" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#adae3557b7778010227466ce3eed0edb2">  828</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#adae3557b7778010227466ce3eed0edb2">SendCounterPacket::SendPeriodicCounterCapturePacket</a>(uint64_t timestamp, <span class="keyword">const</span> <a class="code" href="classarmnn_1_1profiling_1_1_i_send_counter_packet.xhtml#a80cb41c63cb6d3a19870b3a0a8f21ba7">IndexValuePairsVector</a>&amp; values)</div><div class="line"><a name="l00829"></a><span class="lineno">  829</span>&#160;{</div><div class="line"><a name="l00830"></a><span class="lineno">  830</span>&#160;    uint32_t <a class="code" href="namespacearmnn_1_1profiling.xhtml#a2fd55777ec061a6c6df855677c165a03">uint16_t_size</a> = <span class="keyword">sizeof</span>(uint16_t);</div><div class="line"><a name="l00831"></a><span class="lineno">  831</span>&#160;    uint32_t <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a> = <span class="keyword">sizeof</span>(uint32_t);</div><div class="line"><a name="l00832"></a><span class="lineno">  832</span>&#160;    uint32_t uint64_t_size = <span class="keyword">sizeof</span>(uint64_t);</div><div class="line"><a name="l00833"></a><span class="lineno">  833</span>&#160;</div><div class="line"><a name="l00834"></a><span class="lineno">  834</span>&#160;    uint32_t packetFamily = 3;</div><div class="line"><a name="l00835"></a><span class="lineno">  835</span>&#160;    uint32_t packetClass = 0;</div><div class="line"><a name="l00836"></a><span class="lineno">  836</span>&#160;    uint32_t packetType = 0;</div><div class="line"><a name="l00837"></a><span class="lineno">  837</span>&#160;    uint32_t headerSize = 2 * <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>;</div><div class="line"><a name="l00838"></a><span class="lineno">  838</span>&#160;    uint32_t bodySize = uint64_t_size + <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint32_t&gt;(values.size()) * (uint16_t_size + uint32_t_size);</div><div class="line"><a name="l00839"></a><span class="lineno">  839</span>&#160;    uint32_t totalSize = headerSize + bodySize;</div><div class="line"><a name="l00840"></a><span class="lineno">  840</span>&#160;    uint32_t offset = 0;</div><div class="line"><a name="l00841"></a><span class="lineno">  841</span>&#160;    uint32_t reserved = 0;</div><div class="line"><a name="l00842"></a><span class="lineno">  842</span>&#160;</div><div class="line"><a name="l00843"></a><span class="lineno">  843</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a14328d977cec3abadcfd5935f04f3409">IPacketBufferPtr</a> writeBuffer = m_BufferManager.<a class="code" href="classarmnn_1_1profiling_1_1_i_buffer_manager.xhtml#a49c88b0e052621f30462c3bdbf3e4a7a">Reserve</a>(totalSize, reserved);</div><div class="line"><a name="l00844"></a><span class="lineno">  844</span>&#160;</div><div class="line"><a name="l00845"></a><span class="lineno">  845</span>&#160;    <span class="keywordflow">if</span> (writeBuffer == <span class="keyword">nullptr</span> || reserved &lt; totalSize)</div><div class="line"><a name="l00846"></a><span class="lineno">  846</span>&#160;    {</div><div class="line"><a name="l00847"></a><span class="lineno">  847</span>&#160;        CancelOperationAndThrow&lt;BufferExhaustion&gt;(</div><div class="line"><a name="l00848"></a><span class="lineno">  848</span>&#160;            writeBuffer,</div><div class="line"><a name="l00849"></a><span class="lineno">  849</span>&#160;            fmt::format(<span class="stringliteral">&quot;No space left in buffer. Unable to reserve ({}) bytes.&quot;</span>, totalSize));</div><div class="line"><a name="l00850"></a><span class="lineno">  850</span>&#160;    }</div><div class="line"><a name="l00851"></a><span class="lineno">  851</span>&#160;</div><div class="line"><a name="l00852"></a><span class="lineno">  852</span>&#160;    <span class="comment">// Create header.</span></div><div class="line"><a name="l00853"></a><span class="lineno">  853</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(writeBuffer,</div><div class="line"><a name="l00854"></a><span class="lineno">  854</span>&#160;                offset,</div><div class="line"><a name="l00855"></a><span class="lineno">  855</span>&#160;                ((packetFamily &amp; 0x0000003F) &lt;&lt; 26) |</div><div class="line"><a name="l00856"></a><span class="lineno">  856</span>&#160;                ((packetClass  &amp; 0x0000007F) &lt;&lt; 19) |</div><div class="line"><a name="l00857"></a><span class="lineno">  857</span>&#160;                ((packetType   &amp; 0x00000007) &lt;&lt; 16));</div><div class="line"><a name="l00858"></a><span class="lineno">  858</span>&#160;    offset += <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>;</div><div class="line"><a name="l00859"></a><span class="lineno">  859</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(writeBuffer, offset, bodySize);</div><div class="line"><a name="l00860"></a><span class="lineno">  860</span>&#160;</div><div class="line"><a name="l00861"></a><span class="lineno">  861</span>&#160;    <span class="comment">// Copy captured Timestamp.</span></div><div class="line"><a name="l00862"></a><span class="lineno">  862</span>&#160;    offset += <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>;</div><div class="line"><a name="l00863"></a><span class="lineno">  863</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a79be042e55fdf16ca562f14cd15d9aa6">WriteUint64</a>(writeBuffer, offset, timestamp);</div><div class="line"><a name="l00864"></a><span class="lineno">  864</span>&#160;</div><div class="line"><a name="l00865"></a><span class="lineno">  865</span>&#160;    <span class="comment">// Copy selectedCounterIds.</span></div><div class="line"><a name="l00866"></a><span class="lineno">  866</span>&#160;    offset += uint64_t_size;</div><div class="line"><a name="l00867"></a><span class="lineno">  867</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; pair: values)</div><div class="line"><a name="l00868"></a><span class="lineno">  868</span>&#160;    {</div><div class="line"><a name="l00869"></a><span class="lineno">  869</span>&#160;        <a class="code" href="namespacearmnn_1_1profiling.xhtml#ae5ace88c65e65ab7cf5572613601a60d">WriteUint16</a>(writeBuffer, offset, pair.counterId);</div><div class="line"><a name="l00870"></a><span class="lineno">  870</span>&#160;        offset += <a class="code" href="namespacearmnn_1_1profiling.xhtml#a2fd55777ec061a6c6df855677c165a03">uint16_t_size</a>;</div><div class="line"><a name="l00871"></a><span class="lineno">  871</span>&#160;        <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(writeBuffer, offset, pair.counterValue);</div><div class="line"><a name="l00872"></a><span class="lineno">  872</span>&#160;        offset += <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>;</div><div class="line"><a name="l00873"></a><span class="lineno">  873</span>&#160;    }</div><div class="line"><a name="l00874"></a><span class="lineno">  874</span>&#160;</div><div class="line"><a name="l00875"></a><span class="lineno">  875</span>&#160;    m_BufferManager.<a class="code" href="classarmnn_1_1profiling_1_1_i_buffer_manager.xhtml#ad0faa8a317506b2e72252f087c7f3c46">Commit</a>(writeBuffer, totalSize);</div><div class="line"><a name="l00876"></a><span class="lineno">  876</span>&#160;}</div><div class="line"><a name="l00877"></a><span class="lineno">  877</span>&#160;</div><div class="line"><a name="l00878"></a><span class="lineno"><a class="line" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#a47406a4d108beb4f20031d370a155a9d">  878</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#a47406a4d108beb4f20031d370a155a9d">SendCounterPacket::SendPeriodicCounterSelectionPacket</a>(uint32_t capturePeriod,</div><div class="line"><a name="l00879"></a><span class="lineno">  879</span>&#160;                                                           <span class="keyword">const</span> std::vector&lt;uint16_t&gt;&amp; selectedCounterIds)</div><div class="line"><a name="l00880"></a><span class="lineno">  880</span>&#160;{</div><div class="line"><a name="l00881"></a><span class="lineno">  881</span>&#160;    uint32_t <a class="code" href="namespacearmnn_1_1profiling.xhtml#a2fd55777ec061a6c6df855677c165a03">uint16_t_size</a> = <span class="keyword">sizeof</span>(uint16_t);</div><div class="line"><a name="l00882"></a><span class="lineno">  882</span>&#160;    uint32_t <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a> = <span class="keyword">sizeof</span>(uint32_t);</div><div class="line"><a name="l00883"></a><span class="lineno">  883</span>&#160;</div><div class="line"><a name="l00884"></a><span class="lineno">  884</span>&#160;    uint32_t packetFamily = 0;</div><div class="line"><a name="l00885"></a><span class="lineno">  885</span>&#160;    uint32_t packetId = 4;</div><div class="line"><a name="l00886"></a><span class="lineno">  886</span>&#160;    uint32_t headerSize = 2 * <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>;</div><div class="line"><a name="l00887"></a><span class="lineno">  887</span>&#160;    uint32_t bodySize = uint32_t_size + <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;uint32_t&gt;(selectedCounterIds.size()) * uint16_t_size;</div><div class="line"><a name="l00888"></a><span class="lineno">  888</span>&#160;    uint32_t totalSize = headerSize + bodySize;</div><div class="line"><a name="l00889"></a><span class="lineno">  889</span>&#160;    uint32_t offset = 0;</div><div class="line"><a name="l00890"></a><span class="lineno">  890</span>&#160;    uint32_t reserved = 0;</div><div class="line"><a name="l00891"></a><span class="lineno">  891</span>&#160;</div><div class="line"><a name="l00892"></a><span class="lineno">  892</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a14328d977cec3abadcfd5935f04f3409">IPacketBufferPtr</a> writeBuffer = m_BufferManager.<a class="code" href="classarmnn_1_1profiling_1_1_i_buffer_manager.xhtml#a49c88b0e052621f30462c3bdbf3e4a7a">Reserve</a>(totalSize, reserved);</div><div class="line"><a name="l00893"></a><span class="lineno">  893</span>&#160;</div><div class="line"><a name="l00894"></a><span class="lineno">  894</span>&#160;    <span class="keywordflow">if</span> (writeBuffer == <span class="keyword">nullptr</span> || reserved &lt; totalSize)</div><div class="line"><a name="l00895"></a><span class="lineno">  895</span>&#160;    {</div><div class="line"><a name="l00896"></a><span class="lineno">  896</span>&#160;        CancelOperationAndThrow&lt;BufferExhaustion&gt;(</div><div class="line"><a name="l00897"></a><span class="lineno">  897</span>&#160;            writeBuffer,</div><div class="line"><a name="l00898"></a><span class="lineno">  898</span>&#160;            fmt::format(<span class="stringliteral">&quot;No space left in buffer. Unable to reserve ({}) bytes.&quot;</span>, totalSize));</div><div class="line"><a name="l00899"></a><span class="lineno">  899</span>&#160;    }</div><div class="line"><a name="l00900"></a><span class="lineno">  900</span>&#160;</div><div class="line"><a name="l00901"></a><span class="lineno">  901</span>&#160;    <span class="comment">// Create header.</span></div><div class="line"><a name="l00902"></a><span class="lineno">  902</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(writeBuffer, offset, ((packetFamily &amp; 0x3F) &lt;&lt; 26) | ((packetId &amp; 0x3FF) &lt;&lt; 16));</div><div class="line"><a name="l00903"></a><span class="lineno">  903</span>&#160;    offset += <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>;</div><div class="line"><a name="l00904"></a><span class="lineno">  904</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(writeBuffer, offset, bodySize);</div><div class="line"><a name="l00905"></a><span class="lineno">  905</span>&#160;</div><div class="line"><a name="l00906"></a><span class="lineno">  906</span>&#160;    <span class="comment">// Copy capturePeriod.</span></div><div class="line"><a name="l00907"></a><span class="lineno">  907</span>&#160;    offset += <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>;</div><div class="line"><a name="l00908"></a><span class="lineno">  908</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">WriteUint32</a>(writeBuffer, offset, capturePeriod);</div><div class="line"><a name="l00909"></a><span class="lineno">  909</span>&#160;</div><div class="line"><a name="l00910"></a><span class="lineno">  910</span>&#160;    <span class="comment">// Copy selectedCounterIds.</span></div><div class="line"><a name="l00911"></a><span class="lineno">  911</span>&#160;    offset += <a class="code" href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">uint32_t_size</a>;</div><div class="line"><a name="l00912"></a><span class="lineno">  912</span>&#160;    <span class="keywordflow">for</span>(<span class="keyword">const</span> uint16_t&amp; <span class="keywordtype">id</span>: selectedCounterIds)</div><div class="line"><a name="l00913"></a><span class="lineno">  913</span>&#160;    {</div><div class="line"><a name="l00914"></a><span class="lineno">  914</span>&#160;        <a class="code" href="namespacearmnn_1_1profiling.xhtml#ae5ace88c65e65ab7cf5572613601a60d">WriteUint16</a>(writeBuffer, offset, <span class="keywordtype">id</span>);</div><div class="line"><a name="l00915"></a><span class="lineno">  915</span>&#160;        offset += <a class="code" href="namespacearmnn_1_1profiling.xhtml#a2fd55777ec061a6c6df855677c165a03">uint16_t_size</a>;</div><div class="line"><a name="l00916"></a><span class="lineno">  916</span>&#160;    }</div><div class="line"><a name="l00917"></a><span class="lineno">  917</span>&#160;</div><div class="line"><a name="l00918"></a><span class="lineno">  918</span>&#160;    m_BufferManager.<a class="code" href="classarmnn_1_1profiling_1_1_i_buffer_manager.xhtml#ad0faa8a317506b2e72252f087c7f3c46">Commit</a>(writeBuffer, totalSize);</div><div class="line"><a name="l00919"></a><span class="lineno">  919</span>&#160;}</div><div class="line"><a name="l00920"></a><span class="lineno">  920</span>&#160;</div><div class="line"><a name="l00921"></a><span class="lineno">  921</span>&#160;} <span class="comment">// namespace profiling</span></div><div class="line"><a name="l00922"></a><span class="lineno">  922</span>&#160;</div><div class="line"><a name="l00923"></a><span class="lineno">  923</span>&#160;} <span class="comment">// namespace armnn</span></div><div class="ttc" id="classarmnn_1_1profiling_1_1_i_buffer_manager_xhtml_a49c88b0e052621f30462c3bdbf3e4a7a"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_i_buffer_manager.xhtml#a49c88b0e052621f30462c3bdbf3e4a7a">armnn::profiling::IBufferManager::Reserve</a></div><div class="ttdeci">virtual IPacketBufferPtr Reserve(unsigned int requestedSize, unsigned int &amp;reservedSize)=0</div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_send_counter_packet_xhtml_a30f18e205737ed0a4057d18b52d48018"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#a30f18e205737ed0a4057d18b52d48018">armnn::profiling::SendCounterPacket::CounterSetRecord</a></div><div class="ttdeci">std::vector&lt; uint32_t &gt; CounterSetRecord</div><div class="ttdef"><b>Definition:</b> <a href="_send_counter_packet_8hpp_source.xhtml#l00026">SendCounterPacket.hpp:26</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_i_send_counter_packet_xhtml_a80cb41c63cb6d3a19870b3a0a8f21ba7"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_i_send_counter_packet.xhtml#a80cb41c63cb6d3a19870b3a0a8f21ba7">armnn::profiling::ISendCounterPacket::IndexValuePairsVector</a></div><div class="ttdeci">std::vector&lt; CounterValue &gt; IndexValuePairsVector</div><div class="ttdef"><b>Definition:</b> <a href="_i_send_counter_packet_8hpp_source.xhtml#l00020">ISendCounterPacket.hpp:20</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_send_counter_packet_xhtml_ae8cb0ed3b5a68b271532e959ec2507d4"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#ae8cb0ed3b5a68b271532e959ec2507d4">armnn::profiling::SendCounterPacket::DeviceRecord</a></div><div class="ttdeci">std::vector&lt; uint32_t &gt; DeviceRecord</div><div class="ttdef"><b>Definition:</b> <a href="_send_counter_packet_8hpp_source.xhtml#l00025">SendCounterPacket.hpp:25</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a66ccd202fa7bf1e52476e61d49a45ee6"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a66ccd202fa7bf1e52476e61d49a45ee6">armnn::profiling::GetHardwareVersion</a></div><div class="ttdeci">std::string GetHardwareVersion()</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00232">ProfilingUtils.cpp:232</a></div></div>
<div class="ttc" id="namespacearmnn_utils_1_1_processes_xhtml_a1d95dea376acbd82dde773e05db454be"><div class="ttname"><a href="namespacearmnn_utils_1_1_processes.xhtml#a1d95dea376acbd82dde773e05db454be">armnnUtils::Processes::GetCurrentId</a></div><div class="ttdeci">int GetCurrentId()</div><div class="ttdef"><b>Definition:</b> <a href="_processes_8cpp_source.xhtml#l00019">Processes.cpp:19</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_ae5ace88c65e65ab7cf5572613601a60d"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#ae5ace88c65e65ab7cf5572613601a60d">armnn::profiling::WriteUint16</a></div><div class="ttdeci">void WriteUint16(const IPacketBufferPtr &amp;packetBuffer, unsigned int offset, uint16_t value)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00128">ProfilingUtils.cpp:128</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a3e638748a39d46e2943dfcef94dcb828"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a3e638748a39d46e2943dfcef94dcb828">armnn::profiling::WriteUint32</a></div><div class="ttdeci">void WriteUint32(const IPacketBufferPtr &amp;packetBuffer, unsigned int offset, uint32_t value)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00121">ProfilingUtils.cpp:121</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_send_counter_packet_xhtml_af18b6d5da883305c751d6ed00bea006a"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#af18b6d5da883305c751d6ed00bea006a">armnn::profiling::SendCounterPacket::CreateDeviceRecord</a></div><div class="ttdeci">bool CreateDeviceRecord(const DevicePtr &amp;device, DeviceRecord &amp;deviceRecord, std::string &amp;errorMessage)</div><div class="ttdef"><b>Definition:</b> <a href="_send_counter_packet_8cpp_source.xhtml#l00296">SendCounterPacket.cpp:296</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_send_counter_packet_xhtml_a3b526a823530443efec886c4305e52de"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#a3b526a823530443efec886c4305e52de">armnn::profiling::SendCounterPacket::SendCounterDirectoryPacket</a></div><div class="ttdeci">void SendCounterDirectoryPacket(const ICounterDirectory &amp;counterDirectory) override</div><div class="ttdoc">Create and write a CounterDirectoryPacket from the parameters to the buffer. </div><div class="ttdef"><b>Definition:</b> <a href="_send_counter_packet_8cpp_source.xhtml#l00548">SendCounterPacket.cpp:548</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a2fd55777ec061a6c6df855677c165a03"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a2fd55777ec061a6c6df855677c165a03">armnn::profiling::uint16_t_size</a></div><div class="ttdeci">uint32_t uint16_t_size</div><div class="ttdef"><b>Definition:</b> <a href="_directory_capture_command_handler_8cpp_source.xhtml#l00021">DirectoryCaptureCommandHandler.cpp:21</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_aeeb6904ffbae435c8d0a7138427688f4"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#aeeb6904ffbae435c8d0a7138427688f4">armnn::profiling::Counters</a></div><div class="ttdeci">std::unordered_map&lt; uint16_t, CounterPtr &gt; Counters</div><div class="ttdef"><b>Definition:</b> <a href="_i_counter_directory_8hpp_source.xhtml#l00038">ICounterDirectory.hpp:38</a></div></div>
<div class="ttc" id="_conversion_8hpp_xhtml_a71cf574f1296e09d0ce16157bdeb6619"><div class="ttname"><a href="_conversion_8hpp.xhtml#a71cf574f1296e09d0ce16157bdeb6619">ARMNN_NO_CONVERSION_WARN_END</a></div><div class="ttdeci">#define ARMNN_NO_CONVERSION_WARN_END</div><div class="ttdef"><b>Definition:</b> <a href="_conversion_8hpp_source.xhtml#l00037">Conversion.hpp:37</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a22a0d730c0d08335585e6e8999be8f8b"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a22a0d730c0d08335585e6e8999be8f8b">armnn::profiling::DevicePtr</a></div><div class="ttdeci">std::unique_ptr&lt; Device &gt; DevicePtr</div><div class="ttdef"><b>Definition:</b> <a href="_i_counter_directory_8hpp_source.xhtml#l00030">ICounterDirectory.hpp:30</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a52fbcd350a9f12a385a7c5562c1efd9a"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a52fbcd350a9f12a385a7c5562c1efd9a">armnn::profiling::GetProcessName</a></div><div class="ttdeci">std::string GetProcessName()</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00243">ProfilingUtils.cpp:243</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_send_counter_packet_xhtml_a2a2e451c4e4963909b8a6dc7e7653cd1"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#a2a2e451c4e4963909b8a6dc7e7653cd1">armnn::profiling::SendCounterPacket::SendStreamMetaDataPacket</a></div><div class="ttdeci">void SendStreamMetaDataPacket() override</div><div class="ttdoc">Create and write a StreamMetaDataPacket in the buffer. </div><div class="ttdef"><b>Definition:</b> <a href="_send_counter_packet_8cpp_source.xhtml#l00027">SendCounterPacket.cpp:27</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_abaedc7fcb8ecb2e086482afe10737fb7"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#abaedc7fcb8ecb2e086482afe10737fb7">armnn::profiling::CounterSetPtr</a></div><div class="ttdeci">std::unique_ptr&lt; CounterSet &gt; CounterSetPtr</div><div class="ttdef"><b>Definition:</b> <a href="_i_counter_directory_8hpp_source.xhtml#l00031">ICounterDirectory.hpp:31</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_i_buffer_manager_xhtml_ad0faa8a317506b2e72252f087c7f3c46"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_i_buffer_manager.xhtml#ad0faa8a317506b2e72252f087c7f3c46">armnn::profiling::IBufferManager::Commit</a></div><div class="ttdeci">virtual void Commit(IPacketBufferPtr &amp;packetBuffer, unsigned int size, bool notifyConsumer=true)=0</div></div>
<div class="ttc" id="namespacearmnn_xhtml"><div class="ttname"><a href="namespacearmnn.xhtml">armnn</a></div><div class="ttdoc">Copyright (c) 2021 ARM Limited and Contributors. </div><div class="ttdef"><b>Definition:</b> <a href="01__00__software__tools_8dox_source.xhtml#l00006">01_00_software_tools.dox:6</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_i_counter_directory_xhtml_a8908490db3b8a0003a639ac56b956cee"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_i_counter_directory.xhtml#a8908490db3b8a0003a639ac56b956cee">armnn::profiling::ICounterDirectory::GetCounterSets</a></div><div class="ttdeci">virtual const CounterSets &amp; GetCounterSets() const =0</div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_af38e9c5d82c9317255665a6315842166"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#af38e9c5d82c9317255665a6315842166">armnn::profiling::GetSoftwareInfo</a></div><div class="ttdeci">std::string GetSoftwareInfo()</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00227">ProfilingUtils.cpp:227</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_i_counter_directory_xhtml_ab43b0472c37fe51694977ae9b4132404"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_i_counter_directory.xhtml#ab43b0472c37fe51694977ae9b4132404">armnn::profiling::ICounterDirectory::GetCategoryCount</a></div><div class="ttdeci">virtual uint16_t GetCategoryCount() const =0</div></div>
<div class="ttc" id="_processes_8hpp_xhtml"><div class="ttname"><a href="_processes_8hpp.xhtml">Processes.hpp</a></div></div>
<div class="ttc" id="_numeric_cast_8hpp_xhtml"><div class="ttname"><a href="_numeric_cast_8hpp.xhtml">NumericCast.hpp</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_acfe20da73b5dc66439a65b49f04f7a21"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#acfe20da73b5dc66439a65b49f04f7a21">armnn::profiling::CounterSets</a></div><div class="ttdeci">std::unordered_map&lt; uint16_t, CounterSetPtr &gt; CounterSets</div><div class="ttdef"><b>Definition:</b> <a href="_i_counter_directory_8hpp_source.xhtml#l00037">ICounterDirectory.hpp:37</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_i_counter_directory_xhtml_a718a75d4c178cf3f687b3f27b8f55091"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_i_counter_directory.xhtml#a718a75d4c178cf3f687b3f27b8f55091">armnn::profiling::ICounterDirectory::GetCategories</a></div><div class="ttdeci">virtual const Categories &amp; GetCategories() const =0</div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_send_counter_packet_xhtml_a7b90a935def976944525581f5f254068"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#a7b90a935def976944525581f5f254068">armnn::profiling::SendCounterPacket::EventRecord</a></div><div class="ttdeci">std::vector&lt; uint32_t &gt; EventRecord</div><div class="ttdef"><b>Definition:</b> <a href="_send_counter_packet_8hpp_source.xhtml#l00027">SendCounterPacket.hpp:27</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_i_counter_directory_xhtml_a98e6769cb933d30bfd3ca25f61bd8438"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_i_counter_directory.xhtml#a98e6769cb933d30bfd3ca25f61bd8438">armnn::profiling::ICounterDirectory::GetDevices</a></div><div class="ttdeci">virtual const Devices &amp; GetDevices() const =0</div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a38de53725b010ce63ea7557bb1d270e7"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a38de53725b010ce63ea7557bb1d270e7">armnn::profiling::CounterPtr</a></div><div class="ttdeci">std::shared_ptr&lt; Counter &gt; CounterPtr</div><div class="ttdef"><b>Definition:</b> <a href="_i_counter_directory_8hpp_source.xhtml#l00032">ICounterDirectory.hpp:32</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_send_counter_packet_xhtml_adae3557b7778010227466ce3eed0edb2"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#adae3557b7778010227466ce3eed0edb2">armnn::profiling::SendCounterPacket::SendPeriodicCounterCapturePacket</a></div><div class="ttdeci">void SendPeriodicCounterCapturePacket(uint64_t timestamp, const IndexValuePairsVector &amp;values) override</div><div class="ttdoc">Create and write a PeriodicCounterCapturePacket from the parameters to the buffer. </div><div class="ttdef"><b>Definition:</b> <a href="_send_counter_packet_8cpp_source.xhtml#l00828">SendCounterPacket.cpp:828</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_send_counter_packet_xhtml_ad0a58db963ae04484cdc3addd8327c3e"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#ad0a58db963ae04484cdc3addd8327c3e">armnn::profiling::SendCounterPacket::CreateCounterSetRecord</a></div><div class="ttdeci">bool CreateCounterSetRecord(const CounterSetPtr &amp;counterSet, CounterSetRecord &amp;counterSetRecord, std::string &amp;errorMessage)</div><div class="ttdef"><b>Definition:</b> <a href="_send_counter_packet_8cpp_source.xhtml#l00346">SendCounterPacket.cpp:346</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_i_counter_directory_xhtml_aecd5912045fd41fe41dc96c9844f6deb"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_i_counter_directory.xhtml#aecd5912045fd41fe41dc96c9844f6deb">armnn::profiling::ICounterDirectory::GetDeviceCount</a></div><div class="ttdeci">virtual uint16_t GetDeviceCount() const =0</div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a750935094e7dc62a6ce69be8688ee9fc"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a750935094e7dc62a6ce69be8688ee9fc">armnn::profiling::ConstructHeader</a></div><div class="ttdeci">uint32_t ConstructHeader(uint32_t packetFamily, uint32_t packetId)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00100">ProfilingUtils.cpp:100</a></div></div>
<div class="ttc" id="_assert_8hpp_xhtml_a5698be69cbd5dfe6c28fcd9867e8cbed"><div class="ttname"><a href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a></div><div class="ttdeci">#define ARMNN_ASSERT(COND)</div><div class="ttdef"><b>Definition:</b> <a href="_assert_8hpp_source.xhtml#l00014">Assert.hpp:14</a></div></div>
<div class="ttc" id="_i_buffer_manager_8hpp_xhtml_aa710a41e4e10ec3243e29e74dacae3c0"><div class="ttname"><a href="_i_buffer_manager_8hpp.xhtml#aa710a41e4e10ec3243e29e74dacae3c0">MAX_METADATA_PACKET_LENGTH</a></div><div class="ttdeci">#define MAX_METADATA_PACKET_LENGTH</div><div class="ttdef"><b>Definition:</b> <a href="_i_buffer_manager_8hpp_source.xhtml#l00013">IBufferManager.hpp:13</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a79be042e55fdf16ca562f14cd15d9aa6"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a79be042e55fdf16ca562f14cd15d9aa6">armnn::profiling::WriteUint64</a></div><div class="ttdeci">void WriteUint64(const std::unique_ptr&lt; IPacketBuffer &gt; &amp;packetBuffer, unsigned int offset, uint64_t value)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00114">ProfilingUtils.cpp:114</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_af55bc6e5233a4720fe8a813db470b06f"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#af55bc6e5233a4720fe8a813db470b06f">armnn::profiling::Categories</a></div><div class="ttdeci">std::unordered_set&lt; CategoryPtr &gt; Categories</div><div class="ttdef"><b>Definition:</b> <a href="_i_counter_directory_8hpp_source.xhtml#l00035">ICounterDirectory.hpp:35</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_i_counter_directory_xhtml_aef59fdca57a5bb822e22cacfc5836fab"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_i_counter_directory.xhtml#aef59fdca57a5bb822e22cacfc5836fab">armnn::profiling::ICounterDirectory::GetCounterSetCount</a></div><div class="ttdeci">virtual uint16_t GetCounterSetCount() const =0</div></div>
<div class="ttc" id="_conversion_8hpp_xhtml_aeaf555aa7f39f7ba192a3812cb1b7d07"><div class="ttname"><a href="_conversion_8hpp.xhtml#aeaf555aa7f39f7ba192a3812cb1b7d07">ARMNN_NO_CONVERSION_WARN_BEGIN</a></div><div class="ttdeci">#define ARMNN_NO_CONVERSION_WARN_BEGIN</div><div class="ttdef"><b>Definition:</b> <a href="_conversion_8hpp_source.xhtml#l00036">Conversion.hpp:36</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a1a90cae723e311b3b71272a7f5ecccbb"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a1a90cae723e311b3b71272a7f5ecccbb">armnn::profiling::GetSoftwareVersion</a></div><div class="ttdeci">std::string GetSoftwareVersion()</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_utils_8cpp_source.xhtml#l00237">ProfilingUtils.cpp:237</a></div></div>
<div class="ttc" id="_assert_8hpp_xhtml"><div class="ttname"><a href="_assert_8hpp.xhtml">Assert.hpp</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_aabcf5c25522e8a0542c95174056cfcac"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#aabcf5c25522e8a0542c95174056cfcac">armnn::profiling::uint32_t_size</a></div><div class="ttdeci">uint32_t uint32_t_size</div><div class="ttdef"><b>Definition:</b> <a href="_directory_capture_command_handler_8cpp_source.xhtml#l00022">DirectoryCaptureCommandHandler.cpp:22</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c"><div class="ttname"><a href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">armnn::BoostLogSeverityMapping::info</a></div></div>
<div class="ttc" id="_exceptions_8hpp_xhtml"><div class="ttname"><a href="_exceptions_8hpp.xhtml">Exceptions.hpp</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_send_counter_packet_xhtml_a47406a4d108beb4f20031d370a155a9d"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#a47406a4d108beb4f20031d370a155a9d">armnn::profiling::SendCounterPacket::SendPeriodicCounterSelectionPacket</a></div><div class="ttdeci">void SendPeriodicCounterSelectionPacket(uint32_t capturePeriod, const std::vector&lt; uint16_t &gt; &amp;selectedCounterIds) override</div><div class="ttdoc">Create and write a PeriodicCounterSelectionPacket from the parameters to the buffer. </div><div class="ttdef"><b>Definition:</b> <a href="_send_counter_packet_8cpp_source.xhtml#l00878">SendCounterPacket.cpp:878</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_send_counter_packet_xhtml_acc3cd9f22519728404bf47992ea01f77"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#acc3cd9f22519728404bf47992ea01f77">armnn::profiling::SendCounterPacket::CategoryRecord</a></div><div class="ttdeci">std::vector&lt; uint32_t &gt; CategoryRecord</div><div class="ttdef"><b>Definition:</b> <a href="_send_counter_packet_8hpp_source.xhtml#l00024">SendCounterPacket.hpp:24</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a8adee535828386656b4c8acfa8bcf871"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a8adee535828386656b4c8acfa8bcf871">armnn::profiling::CategoryPtr</a></div><div class="ttdeci">std::unique_ptr&lt; Category &gt; CategoryPtr</div><div class="ttdef"><b>Definition:</b> <a href="_i_counter_directory_8hpp_source.xhtml#l00029">ICounterDirectory.hpp:29</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a375ca3cff9f1b005d1412dc5f3cf5b6e"><div class="ttname"><a href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a></div><div class="ttdeci">std::enable_if_t&lt; std::is_unsigned&lt; Source &gt;::value &amp;&amp;std::is_unsigned&lt; Dest &gt;::value, Dest &gt; numeric_cast(Source source)</div><div class="ttdef"><b>Definition:</b> <a href="_numeric_cast_8hpp_source.xhtml#l00035">NumericCast.hpp:35</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_i_counter_directory_xhtml_ad9fa9b8364fcaa2c940ef8e78eff8df2"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_i_counter_directory.xhtml#ad9fa9b8364fcaa2c940ef8e78eff8df2">armnn::profiling::ICounterDirectory::GetCounters</a></div><div class="ttdeci">virtual const Counters &amp; GetCounters() const =0</div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a3ff1066867cb9bd3b08338957c414401"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a3ff1066867cb9bd3b08338957c414401">armnn::profiling::Devices</a></div><div class="ttdeci">std::unordered_map&lt; uint16_t, DevicePtr &gt; Devices</div><div class="ttdef"><b>Definition:</b> <a href="_i_counter_directory_8hpp_source.xhtml#l00036">ICounterDirectory.hpp:36</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_send_counter_packet_xhtml_ac134e8d175e305297b729b4461d9f34f"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#ac134e8d175e305297b729b4461d9f34f">armnn::profiling::SendCounterPacket::CreateEventRecord</a></div><div class="ttdeci">bool CreateEventRecord(const CounterPtr &amp;counter, EventRecord &amp;eventRecord, std::string &amp;errorMessage)</div><div class="ttdef"><b>Definition:</b> <a href="_send_counter_packet_8cpp_source.xhtml#l00396">SendCounterPacket.cpp:396</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_i_counter_directory_xhtml"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_i_counter_directory.xhtml">armnn::profiling::ICounterDirectory</a></div><div class="ttdef"><b>Definition:</b> <a href="_i_counter_directory_8hpp_source.xhtml#l00137">ICounterDirectory.hpp:137</a></div></div>
<div class="ttc" id="_conversion_8hpp_xhtml"><div class="ttname"><a href="_conversion_8hpp.xhtml">Conversion.hpp</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a14328d977cec3abadcfd5935f04f3409"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a14328d977cec3abadcfd5935f04f3409">armnn::profiling::IPacketBufferPtr</a></div><div class="ttdeci">std::unique_ptr&lt; IPacketBuffer &gt; IPacketBufferPtr</div><div class="ttdef"><b>Definition:</b> <a href="_i_packet_buffer_8hpp_source.xhtml#l00044">IPacketBuffer.hpp:44</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_send_counter_packet_xhtml_acd58fc16d0b9e0a3983e3e8719c0f95a"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_send_counter_packet.xhtml#acd58fc16d0b9e0a3983e3e8719c0f95a">armnn::profiling::SendCounterPacket::CreateCategoryRecord</a></div><div class="ttdeci">bool CreateCategoryRecord(const CategoryPtr &amp;category, const Counters &amp;counters, CategoryRecord &amp;categoryRecord, std::string &amp;errorMessage)</div><div class="ttdef"><b>Definition:</b> <a href="_send_counter_packet_8cpp_source.xhtml#l00173">SendCounterPacket.cpp:173</a></div></div>
<div class="ttc" id="_send_counter_packet_8hpp_xhtml"><div class="ttname"><a href="_send_counter_packet_8hpp.xhtml">SendCounterPacket.hpp</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.xhtml">src</a></li><li class="navelem"><a class="el" href="dir_637c692f14729569dd2eac0c18e2a54a.xhtml">profiling</a></li><li class="navelem"><a class="el" href="_send_counter_packet_8cpp.xhtml">SendCounterPacket.cpp</a></li>
    <li class="footer">Generated on Thu Feb 25 2021 17:27:53 for ArmNN by
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
  </ul>
</div>
</body>
</html>