blob: 0225d750a758fbd5cd47964605b9c88a893aab11 [file] [log] [blame]
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +01001//
2// Copyright © 2019 Arm Ltd. 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 <armnn/Exceptions.hpp>
11
12#include <boost/test/unit_test.hpp>
13
14using namespace armnn::profiling;
15
16BOOST_AUTO_TEST_SUITE(BufferTests)
17
18BOOST_AUTO_TEST_CASE(PacketBufferTest0)
19{
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000020 IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512);
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010021
22 BOOST_TEST(packetBuffer->GetSize() == 0);
23
24 // Write data to the buffer
25 WriteUint32(packetBuffer, 0, 10);
26 WriteUint32(packetBuffer, 4, 20);
27 WriteUint32(packetBuffer, 8, 30);
28 WriteUint32(packetBuffer, 12, 40);
29
30 // Commit
31 packetBuffer->Commit(16);
32
33 // Size of buffer is equal to committed data
34 BOOST_TEST(packetBuffer->GetSize() == 16);
35
36 // Read data from the buffer
37 auto readBuffer = packetBuffer->GetReadableData();
38 uint32_t readData0 = ReadUint32(readBuffer, 0);
39 uint32_t readData1 = ReadUint32(readBuffer, 4);
40 uint32_t readData2 = ReadUint32(readBuffer, 8);
41 uint32_t readData3 = ReadUint32(readBuffer, 12);
42
43 // Check that data is correct
44 BOOST_TEST(readData0 == 10);
45 BOOST_TEST(readData1 == 20);
46 BOOST_TEST(readData2 == 30);
47 BOOST_TEST(readData3 == 40);
48
49 // Mark read
50 packetBuffer->MarkRead();
51
52 // Size of buffer become 0 after marked read
53 BOOST_TEST(packetBuffer->GetSize() == 0);
54}
55
56BOOST_AUTO_TEST_CASE(PacketBufferTest1)
57{
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000058 IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512);
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010059
60 BOOST_TEST(packetBuffer->GetSize() == 0);
61
62 // Write data to the buffer using GetWritableData
63 auto writeBuffer = packetBuffer->GetWritableData();
64 WriteUint32(writeBuffer, 0, 10);
65 WriteUint32(writeBuffer, 4, 20);
66 WriteUint32(writeBuffer, 8, 30);
67 WriteUint32(writeBuffer, 12, 40);
68
69 packetBuffer->Commit(16);
70
71 BOOST_TEST(packetBuffer->GetSize() == 16);
72
73 // Read data from the buffer
74 auto readBuffer = packetBuffer->GetReadableData();
75 uint32_t readData0 = ReadUint32(readBuffer, 0);
76 uint32_t readData1 = ReadUint32(readBuffer, 4);
77 uint32_t readData2 = ReadUint32(readBuffer, 8);
78 uint32_t readData3 = ReadUint32(readBuffer, 12);
79
80 BOOST_TEST(readData0 == 10);
81 BOOST_TEST(readData1 == 20);
82 BOOST_TEST(readData2 == 30);
83 BOOST_TEST(readData3 == 40);
84
85 packetBuffer->MarkRead();
86
87 BOOST_TEST(packetBuffer->GetSize() == 0);
88}
89
90BOOST_AUTO_TEST_CASE(PacketBufferReleaseTest) {
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000091 IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512);
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010092
93 BOOST_TEST(packetBuffer->GetSize() == 0);
94
95 auto writeBuffer = packetBuffer->GetWritableData();
96
97 WriteUint32(writeBuffer, 0, 10);
98 WriteUint32(writeBuffer, 4, 20);
99 WriteUint32(writeBuffer, 8, 30);
100 WriteUint32(writeBuffer, 12, 40);
101
102 packetBuffer->Release();
103
104 // Size of buffer become 0 after release
105 BOOST_TEST(packetBuffer->GetSize() == 0);
106}
107
108BOOST_AUTO_TEST_CASE(PacketBufferCommitErrorTest)
109{
Matteo Martincigh2ffcc412019-11-05 11:47:40 +0000110 IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(8);
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100111
112 // Cannot commit data bigger than the max size of the buffer
113 BOOST_CHECK_THROW(packetBuffer->Commit(16);, armnn::RuntimeException);
114}
115
116BOOST_AUTO_TEST_CASE(BufferReserveTest)
117{
118 BufferManager bufferManager(1, 512);
119 unsigned int reservedSize = 0;
120 auto packetBuffer = bufferManager.Reserve(512, reservedSize);
121
122 // Successfully reserved the buffer with requested size
123 BOOST_TEST(reservedSize == 512);
124 BOOST_TEST(packetBuffer.get());
125}
126
127BOOST_AUTO_TEST_CASE(BufferReserveExceedingSpaceTest)
128{
129 BufferManager bufferManager(1, 512);
130 unsigned int reservedSize = 0;
131
132 // Cannot reserve buffer bigger than maximum buffer size
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +0100133 auto reservedBuffer = bufferManager.Reserve(1024, reservedSize);
134 BOOST_TEST(reservedSize == 0);
135 BOOST_TEST(!reservedBuffer.get());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100136}
137
138BOOST_AUTO_TEST_CASE(BufferExhaustionTest)
139{
140 BufferManager bufferManager(1, 512);
141 unsigned int reservedSize = 0;
142 auto packetBuffer = bufferManager.Reserve(512, reservedSize);
143
144 // Successfully reserved the buffer with requested size
145 BOOST_TEST(reservedSize == 512);
146 BOOST_TEST(packetBuffer.get());
147
148 // Cannot reserve buffer when buffer is not available
Jim Flynn0204f092020-06-22 20:41:43 +0100149 // NOTE: because the buffer manager now has surge capacity of
150 // initial size * 3 we should be able to reserve three
151 // buffers before exhaustion
152 packetBuffer = bufferManager.Reserve(512, reservedSize);
153
154 // Successfully reserved the second buffer with requested size
155 BOOST_TEST(reservedSize == 512);
156 BOOST_TEST(packetBuffer.get());
157
158 packetBuffer = bufferManager.Reserve(512, reservedSize);
159
160 // Successfully reserved the third buffer with requested size
161 BOOST_TEST(reservedSize == 512);
162 BOOST_TEST(packetBuffer.get());
163
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +0100164 auto reservedBuffer = bufferManager.Reserve(512, reservedSize);
165 BOOST_TEST(reservedSize == 0);
166 BOOST_TEST(!reservedBuffer.get());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100167}
168
169BOOST_AUTO_TEST_CASE(BufferReserveMultipleTest)
170{
171 BufferManager bufferManager(3, 512);
172 unsigned int reservedSize0 = 0;
173 auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
174
175 // Successfully reserved the buffer with requested size
176 BOOST_TEST(reservedSize0 == 512);
177 BOOST_TEST(packetBuffer0.get());
178
179 unsigned int reservedSize1 = 0;
180 auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
181
182 // Successfully reserved the buffer with requested size
183 BOOST_TEST(reservedSize1 == 128);
184 BOOST_TEST(packetBuffer1.get());
185
186 unsigned int reservedSize2 = 0;
187 auto packetBuffer2 = bufferManager.Reserve(512, reservedSize2);
188
189 // Successfully reserved the buffer with requested size
190 BOOST_TEST(reservedSize2 == 512);
191 BOOST_TEST(packetBuffer2.get());
192
Jim Flynn0204f092020-06-22 20:41:43 +0100193 // NOTE: the buffer now has a surge capacity of initial size * 3
194 // so we can grab 9 of them prior to exhaustion now
195 for (unsigned int i = 0; i < 6 ; ++i)
196 {
197 // grab another six buffers to exhaust the surge capacity
198 unsigned int reservedSize = 0;
199 auto packetBuffer = bufferManager.Reserve(512, reservedSize);
200
201 // Successfully reserved the third buffer with requested size
202 BOOST_TEST(reservedSize == 512);
203 BOOST_TEST(packetBuffer.get());
204 }
205
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100206 // Cannot reserve when buffer is not available
207 unsigned int reservedSize3 = 0;
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +0100208 auto reservedBuffer = bufferManager.Reserve(512, reservedSize3);
209 BOOST_TEST(reservedSize3 == 0);
210 BOOST_TEST(!reservedBuffer.get());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100211}
212
213BOOST_AUTO_TEST_CASE(BufferReleaseTest)
214{
215 BufferManager bufferManager(2, 512);
216 unsigned int reservedSize0 = 0;
217 auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
218
219 // Successfully reserved the buffer with requested size
220 BOOST_TEST(reservedSize0 == 512);
221 BOOST_TEST(packetBuffer0.get());
222
223 unsigned int reservedSize1 = 0;
224 auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
225
226 // Successfully reserved the buffer with requested size
227 BOOST_TEST(reservedSize1 == 128);
228 BOOST_TEST(packetBuffer1.get());
229
Jim Flynn0204f092020-06-22 20:41:43 +0100230 // NOTE: now that we have a surge capacity of up to
231 // initial size * 3 we need to allocate four more
232 // buffers to exhaust the manager
233 for (unsigned int i = 0; i < 4 ; ++i)
234 {
235 // grab another six buffers to exhaust the surge capacity
236 unsigned int reservedSize = 0;
237 auto packetBuffer = bufferManager.Reserve(512, reservedSize);
238
239 // Successfully reserved the third buffer with requested size
240 BOOST_TEST(reservedSize == 512);
241 BOOST_TEST(packetBuffer.get());
242 }
243
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100244 // Cannot reserve when buffer is not available
245 unsigned int reservedSize2 = 0;
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +0100246 auto reservedBuffer = bufferManager.Reserve(512, reservedSize2);
247 BOOST_TEST(reservedSize2 == 0);
248 BOOST_TEST(!reservedBuffer.get());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100249
250 bufferManager.Release(packetBuffer0);
251
252 // Buffer should become available after release
253 auto packetBuffer2 = bufferManager.Reserve(128, reservedSize2);
254
255 BOOST_TEST(reservedSize2 == 128);
256 BOOST_TEST(packetBuffer2.get());
257}
258
259BOOST_AUTO_TEST_CASE(BufferCommitTest)
260{
261 BufferManager bufferManager(2, 512);
262 unsigned int reservedSize0 = 0;
263 auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
264
265 BOOST_TEST(reservedSize0 == 512);
266 BOOST_TEST(packetBuffer0.get());
267
268 unsigned int reservedSize1 = 0;
269 auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
270
271 BOOST_TEST(reservedSize1 == 128);
272 BOOST_TEST(packetBuffer1.get());
273
Jim Flynn0204f092020-06-22 20:41:43 +0100274 // NOTE: now that we have a surge capacity of up to
275 // initial size * 3 we need to allocate four more
276 // buffers to exhaust the manager
277 for (unsigned int i = 0; i < 4 ; ++i)
278 {
279 // grab another six buffers to exhaust the surge capacity
280 unsigned int reservedSize = 0;
281 auto packetBuffer = bufferManager.Reserve(512, reservedSize);
282
283 // Successfully reserved the third buffer with requested size
284 BOOST_TEST(reservedSize == 512);
285 BOOST_TEST(packetBuffer.get());
286 }
287
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100288 unsigned int reservedSize2 = 0;
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +0100289 auto reservedBuffer = bufferManager.Reserve(512, reservedSize2);
290 BOOST_TEST(reservedSize2 == 0);
291 BOOST_TEST(!reservedBuffer.get());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100292
293 bufferManager.Commit(packetBuffer0, 256);
294
295 // Buffer should become readable after commit
296 auto packetBuffer2 = bufferManager.GetReadableBuffer();
297 BOOST_TEST(packetBuffer2.get());
298 BOOST_TEST(packetBuffer2->GetSize() == 256);
299
300 // Buffer not set back to available list after commit
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +0100301 unsigned int reservedSize = 0;
302 reservedBuffer = bufferManager.Reserve(512, reservedSize);
303 BOOST_TEST(reservedSize == 0);
304 BOOST_TEST(!reservedBuffer.get());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100305}
306
307BOOST_AUTO_TEST_CASE(BufferMarkReadTest)
308{
309 BufferManager bufferManager(2, 512);
310 unsigned int reservedSize0 = 0;
311 auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
312
313 BOOST_TEST(reservedSize0 == 512);
314 BOOST_TEST(packetBuffer0.get());
315
316 unsigned int reservedSize1 = 0;
317 auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
318
319 BOOST_TEST(reservedSize1 == 128);
320 BOOST_TEST(packetBuffer1.get());
321
Jim Flynn0204f092020-06-22 20:41:43 +0100322 // NOTE: now that we have a surge capacity of up to
323 // initial size * 3 we need to allocate four more
324 // buffers to exhaust the manager
325 for (unsigned int i = 0; i < 4 ; ++i)
326 {
327 // grab another six buffers to exhaust the surge capacity
328 unsigned int reservedSize = 0;
329 auto packetBuffer = bufferManager.Reserve(512, reservedSize);
330
331 // Successfully reserved the third buffer with requested size
332 BOOST_TEST(reservedSize == 512);
333 BOOST_TEST(packetBuffer.get());
334 }
335
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100336 // Cannot reserve when buffer is not available
337 unsigned int reservedSize2 = 0;
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +0100338 auto reservedBuffer = bufferManager.Reserve(512, reservedSize2);
339 BOOST_TEST(reservedSize2 == 0);
340 BOOST_TEST(!reservedBuffer.get());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100341
342 bufferManager.Commit(packetBuffer0, 256);
343
344 // Buffer should become readable after commit
345 auto packetBuffer2 = bufferManager.GetReadableBuffer();
346 BOOST_TEST(packetBuffer2.get());
347 BOOST_TEST(packetBuffer2->GetSize() == 256);
348
349 // Buffer not set back to available list after commit
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +0100350 reservedBuffer = bufferManager.Reserve(512, reservedSize2);
351 BOOST_TEST(reservedSize2 == 0);
352 BOOST_TEST(!reservedBuffer.get());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100353
354 bufferManager.MarkRead(packetBuffer2);
355
356 //Buffer should set back to available list after marked read and can be reserved
357 auto readBuffer = bufferManager.GetReadableBuffer();
358 BOOST_TEST(!readBuffer);
359 unsigned int reservedSize3 = 0;
360 auto packetBuffer3 = bufferManager.Reserve(56, reservedSize3);
361
362 BOOST_TEST(reservedSize3 == 56);
363 BOOST_TEST(packetBuffer3.get());
364}
365
366BOOST_AUTO_TEST_SUITE_END()