ArmNN
 21.11
BufferTests.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include "BufferManager.hpp"
7 #include "PacketBuffer.hpp"
8 #include "ProfilingUtils.hpp"
9 
10 #include <common/include/SwTrace.hpp>
11 
12 #include <armnn/Exceptions.hpp>
13 
14 #include <doctest/doctest.h>
15 
16 using namespace armnn::profiling;
17 
18 TEST_SUITE("BufferTests")
19 {
20 TEST_CASE("PacketBufferTest0")
21 {
22  IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512);
23 
24  CHECK(packetBuffer->GetSize() == 0);
25 
26  // Write data to the buffer
27  WriteUint32(packetBuffer, 0, 10);
28  WriteUint32(packetBuffer, 4, 20);
29  WriteUint32(packetBuffer, 8, 30);
30  WriteUint32(packetBuffer, 12, 40);
31 
32  // Commit
33  packetBuffer->Commit(16);
34 
35  // Size of buffer is equal to committed data
36  CHECK(packetBuffer->GetSize() == 16);
37 
38  // Read data from the buffer
39  auto readBuffer = packetBuffer->GetReadableData();
40  uint32_t readData0 = ReadUint32(readBuffer, 0);
41  uint32_t readData1 = ReadUint32(readBuffer, 4);
42  uint32_t readData2 = ReadUint32(readBuffer, 8);
43  uint32_t readData3 = ReadUint32(readBuffer, 12);
44 
45  // Check that data is correct
46  CHECK(readData0 == 10);
47  CHECK(readData1 == 20);
48  CHECK(readData2 == 30);
49  CHECK(readData3 == 40);
50 
51  // Mark read
52  packetBuffer->MarkRead();
53 
54  // Size of buffer become 0 after marked read
55  CHECK(packetBuffer->GetSize() == 0);
56 }
57 
58 TEST_CASE("PacketBufferTest1")
59 {
60  IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512);
61 
62  CHECK(packetBuffer->GetSize() == 0);
63 
64  // Write data to the buffer using GetWritableData
65  auto writeBuffer = packetBuffer->GetWritableData();
66  WriteUint32(writeBuffer, 0, 10);
67  WriteUint32(writeBuffer, 4, 20);
68  WriteUint32(writeBuffer, 8, 30);
69  WriteUint32(writeBuffer, 12, 40);
70 
71  packetBuffer->Commit(16);
72 
73  CHECK(packetBuffer->GetSize() == 16);
74 
75  // Read data from the buffer
76  auto readBuffer = packetBuffer->GetReadableData();
77  uint32_t readData0 = ReadUint32(readBuffer, 0);
78  uint32_t readData1 = ReadUint32(readBuffer, 4);
79  uint32_t readData2 = ReadUint32(readBuffer, 8);
80  uint32_t readData3 = ReadUint32(readBuffer, 12);
81 
82  CHECK(readData0 == 10);
83  CHECK(readData1 == 20);
84  CHECK(readData2 == 30);
85  CHECK(readData3 == 40);
86 
87  packetBuffer->MarkRead();
88 
89  CHECK(packetBuffer->GetSize() == 0);
90 }
91 
92 TEST_CASE("PacketBufferReleaseTest")
93 {
94  IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512);
95 
96  CHECK(packetBuffer->GetSize() == 0);
97 
98  auto writeBuffer = packetBuffer->GetWritableData();
99 
100  WriteUint32(writeBuffer, 0, 10);
101  WriteUint32(writeBuffer, 4, 20);
102  WriteUint32(writeBuffer, 8, 30);
103  WriteUint32(writeBuffer, 12, 40);
104 
105  packetBuffer->Release();
106 
107  // Size of buffer become 0 after release
108  CHECK(packetBuffer->GetSize() == 0);
109 }
110 
111 TEST_CASE("PacketBufferCommitErrorTest")
112 {
113  IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(8);
114 
115  // Cannot commit data bigger than the max size of the buffer
116  CHECK_THROWS_AS(packetBuffer->Commit(16);, armnn::RuntimeException);
117 }
118 
119 TEST_CASE("BufferReserveTest")
120 {
121  BufferManager bufferManager(1, 512);
122  unsigned int reservedSize = 0;
123  auto packetBuffer = bufferManager.Reserve(512, reservedSize);
124 
125  // Successfully reserved the buffer with requested size
126  CHECK(reservedSize == 512);
127  CHECK(packetBuffer.get());
128 }
129 
130 TEST_CASE("BufferReserveExceedingSpaceTest")
131 {
132  BufferManager bufferManager(1, 512);
133  unsigned int reservedSize = 0;
134 
135  // Cannot reserve buffer bigger than maximum buffer size
136  auto reservedBuffer = bufferManager.Reserve(1024, reservedSize);
137  CHECK(reservedSize == 0);
138  CHECK(!reservedBuffer.get());
139 }
140 
141 TEST_CASE("BufferExhaustionTest")
142 {
143  BufferManager bufferManager(1, 512);
144  unsigned int reservedSize = 0;
145  auto packetBuffer = bufferManager.Reserve(512, reservedSize);
146 
147  // Successfully reserved the buffer with requested size
148  CHECK(reservedSize == 512);
149  CHECK(packetBuffer.get());
150 
151  // Cannot reserve buffer when buffer is not available
152  // NOTE: because the buffer manager now has surge capacity of
153  // initial size * 3 we should be able to reserve three
154  // buffers before exhaustion
155  packetBuffer = bufferManager.Reserve(512, reservedSize);
156 
157  // Successfully reserved the second buffer with requested size
158  CHECK(reservedSize == 512);
159  CHECK(packetBuffer.get());
160 
161  packetBuffer = bufferManager.Reserve(512, reservedSize);
162 
163  // Successfully reserved the third buffer with requested size
164  CHECK(reservedSize == 512);
165  CHECK(packetBuffer.get());
166 
167  auto reservedBuffer = bufferManager.Reserve(512, reservedSize);
168  CHECK(reservedSize == 0);
169  CHECK(!reservedBuffer.get());
170 }
171 
172 TEST_CASE("BufferReserveMultipleTest")
173 {
174  BufferManager bufferManager(3, 512);
175  unsigned int reservedSize0 = 0;
176  auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
177 
178  // Successfully reserved the buffer with requested size
179  CHECK(reservedSize0 == 512);
180  CHECK(packetBuffer0.get());
181 
182  unsigned int reservedSize1 = 0;
183  auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
184 
185  // Successfully reserved the buffer with requested size
186  CHECK(reservedSize1 == 128);
187  CHECK(packetBuffer1.get());
188 
189  unsigned int reservedSize2 = 0;
190  auto packetBuffer2 = bufferManager.Reserve(512, reservedSize2);
191 
192  // Successfully reserved the buffer with requested size
193  CHECK(reservedSize2 == 512);
194  CHECK(packetBuffer2.get());
195 
196  // NOTE: the buffer now has a surge capacity of initial size * 3
197  // so we can grab 9 of them prior to exhaustion now
198  for (unsigned int i = 0; i < 6 ; ++i)
199  {
200  // grab another six buffers to exhaust the surge capacity
201  unsigned int reservedSize = 0;
202  auto packetBuffer = bufferManager.Reserve(512, reservedSize);
203 
204  // Successfully reserved the third buffer with requested size
205  CHECK(reservedSize == 512);
206  CHECK(packetBuffer.get());
207  }
208 
209  // Cannot reserve when buffer is not available
210  unsigned int reservedSize3 = 0;
211  auto reservedBuffer = bufferManager.Reserve(512, reservedSize3);
212  CHECK(reservedSize3 == 0);
213  CHECK(!reservedBuffer.get());
214 }
215 
216 TEST_CASE("BufferReleaseTest")
217 {
218  BufferManager bufferManager(2, 512);
219  unsigned int reservedSize0 = 0;
220  auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
221 
222  // Successfully reserved the buffer with requested size
223  CHECK(reservedSize0 == 512);
224  CHECK(packetBuffer0.get());
225 
226  unsigned int reservedSize1 = 0;
227  auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
228 
229  // Successfully reserved the buffer with requested size
230  CHECK(reservedSize1 == 128);
231  CHECK(packetBuffer1.get());
232 
233  // NOTE: now that we have a surge capacity of up to
234  // initial size * 3 we need to allocate four more
235  // buffers to exhaust the manager
236  for (unsigned int i = 0; i < 4 ; ++i)
237  {
238  // grab another six buffers to exhaust the surge capacity
239  unsigned int reservedSize = 0;
240  auto packetBuffer = bufferManager.Reserve(512, reservedSize);
241 
242  // Successfully reserved the third buffer with requested size
243  CHECK(reservedSize == 512);
244  CHECK(packetBuffer.get());
245  }
246 
247  // Cannot reserve when buffer is not available
248  unsigned int reservedSize2 = 0;
249  auto reservedBuffer = bufferManager.Reserve(512, reservedSize2);
250  CHECK(reservedSize2 == 0);
251  CHECK(!reservedBuffer.get());
252 
253  bufferManager.Release(packetBuffer0);
254 
255  // Buffer should become available after release
256  auto packetBuffer2 = bufferManager.Reserve(128, reservedSize2);
257 
258  CHECK(reservedSize2 == 128);
259  CHECK(packetBuffer2.get());
260 }
261 
262 TEST_CASE("BufferCommitTest")
263 {
264  BufferManager bufferManager(2, 512);
265  unsigned int reservedSize0 = 0;
266  auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
267 
268  CHECK(reservedSize0 == 512);
269  CHECK(packetBuffer0.get());
270 
271  unsigned int reservedSize1 = 0;
272  auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
273 
274  CHECK(reservedSize1 == 128);
275  CHECK(packetBuffer1.get());
276 
277  // NOTE: now that we have a surge capacity of up to
278  // initial size * 3 we need to allocate four more
279  // buffers to exhaust the manager
280  for (unsigned int i = 0; i < 4 ; ++i)
281  {
282  // grab another six buffers to exhaust the surge capacity
283  unsigned int reservedSize = 0;
284  auto packetBuffer = bufferManager.Reserve(512, reservedSize);
285 
286  // Successfully reserved the third buffer with requested size
287  CHECK(reservedSize == 512);
288  CHECK(packetBuffer.get());
289  }
290 
291  unsigned int reservedSize2 = 0;
292  auto reservedBuffer = bufferManager.Reserve(512, reservedSize2);
293  CHECK(reservedSize2 == 0);
294  CHECK(!reservedBuffer.get());
295 
296  bufferManager.Commit(packetBuffer0, 256);
297 
298  // Buffer should become readable after commit
299  auto packetBuffer2 = bufferManager.GetReadableBuffer();
300  CHECK(packetBuffer2.get());
301  CHECK(packetBuffer2->GetSize() == 256);
302 
303  // Buffer not set back to available list after commit
304  unsigned int reservedSize = 0;
305  reservedBuffer = bufferManager.Reserve(512, reservedSize);
306  CHECK(reservedSize == 0);
307  CHECK(!reservedBuffer.get());
308 }
309 
310 TEST_CASE("BufferMarkReadTest")
311 {
312  BufferManager bufferManager(2, 512);
313  unsigned int reservedSize0 = 0;
314  auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
315 
316  CHECK(reservedSize0 == 512);
317  CHECK(packetBuffer0.get());
318 
319  unsigned int reservedSize1 = 0;
320  auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
321 
322  CHECK(reservedSize1 == 128);
323  CHECK(packetBuffer1.get());
324 
325  // NOTE: now that we have a surge capacity of up to
326  // initial size * 3 we need to allocate four more
327  // buffers to exhaust the manager
328  for (unsigned int i = 0; i < 4 ; ++i)
329  {
330  // grab another six buffers to exhaust the surge capacity
331  unsigned int reservedSize = 0;
332  auto packetBuffer = bufferManager.Reserve(512, reservedSize);
333 
334  // Successfully reserved the third buffer with requested size
335  CHECK(reservedSize == 512);
336  CHECK(packetBuffer.get());
337  }
338 
339  // Cannot reserve when buffer is not available
340  unsigned int reservedSize2 = 0;
341  auto reservedBuffer = bufferManager.Reserve(512, reservedSize2);
342  CHECK(reservedSize2 == 0);
343  CHECK(!reservedBuffer.get());
344 
345  bufferManager.Commit(packetBuffer0, 256);
346 
347  // Buffer should become readable after commit
348  auto packetBuffer2 = bufferManager.GetReadableBuffer();
349  CHECK(packetBuffer2.get());
350  CHECK(packetBuffer2->GetSize() == 256);
351 
352  // Buffer not set back to available list after commit
353  reservedBuffer = bufferManager.Reserve(512, reservedSize2);
354  CHECK(reservedSize2 == 0);
355  CHECK(!reservedBuffer.get());
356 
357  bufferManager.MarkRead(packetBuffer2);
358 
359  //Buffer should set back to available list after marked read and can be reserved
360  auto readBuffer = bufferManager.GetReadableBuffer();
361  CHECK(!readBuffer);
362  unsigned int reservedSize3 = 0;
363  auto packetBuffer3 = bufferManager.Reserve(56, reservedSize3);
364 
365  CHECK(reservedSize3 == 56);
366  CHECK(packetBuffer3.get());
367 }
368 
369 TEST_CASE("ReadSwTraceMessageExceptionTest0")
370 {
371  IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512);
372 
373  CHECK(packetBuffer->GetSize() == 0);
374 
375  // Write zero data to the buffer
376  WriteUint32(packetBuffer, 0, 0);
377  WriteUint32(packetBuffer, 4, 0);
378  WriteUint32(packetBuffer, 8, 0);
379  WriteUint32(packetBuffer, 12, 0);
380 
381  // Commit
382  packetBuffer->Commit(16);
383 
384  unsigned int uint32_t_size = sizeof(uint32_t);
385  unsigned int offset = uint32_t_size;
386  CHECK_THROWS_AS(arm::pipe::ReadSwTraceMessage(packetBuffer->GetReadableData(), offset, packetBuffer->GetSize()),
387  arm::pipe::ProfilingException);
388 
389 }
390 
391 TEST_CASE("ReadSwTraceMessageExceptionTest1")
392 {
393  IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512);
394 
395  CHECK(packetBuffer->GetSize() == 0);
396 
397  // Write data to the buffer
398  WriteUint32(packetBuffer, 0, 10);
399  WriteUint32(packetBuffer, 4, 20);
400  WriteUint32(packetBuffer, 8, 30);
401  WriteUint32(packetBuffer, 12, 40);
402 
403  // Commit
404  packetBuffer->Commit(16);
405 
406  unsigned int uint32_t_size = sizeof(uint32_t);
407  unsigned int offset = uint32_t_size;
408  CHECK_THROWS_AS(arm::pipe::ReadSwTraceMessage(packetBuffer->GetReadableData(), offset, packetBuffer->GetSize()),
409  arm::pipe::ProfilingException);
410 
411 }
412 
413 }
TEST_SUITE("TestConstTensorLayerVisitor")
void WriteUint32(const IPacketBufferPtr &packetBuffer, unsigned int offset, uint32_t value)
void Commit(IPacketBufferPtr &packetBuffer, unsigned int size, bool notifyConsumer=true) override
IPacketBufferPtr Reserve(unsigned int requestedSize, unsigned int &reservedSize) override
IPacketBufferPtr GetReadableBuffer() override
uint32_t ReadUint32(const IPacketBufferPtr &packetBuffer, unsigned int offset)
void MarkRead(IPacketBufferPtr &packetBuffer) override
std::unique_ptr< IPacketBuffer > IPacketBufferPtr
void Release(IPacketBufferPtr &packetBuffer) override