ArmNN
 20.02
BufferTests.cpp
Go to the documentation of this file.
1 //
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 
14 using namespace armnn::profiling;
15 
16 BOOST_AUTO_TEST_SUITE(BufferTests)
17 
18 BOOST_AUTO_TEST_CASE(PacketBufferTest0)
19 {
20  IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512);
21 
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 
56 BOOST_AUTO_TEST_CASE(PacketBufferTest1)
57 {
58  IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512);
59 
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 
90 BOOST_AUTO_TEST_CASE(PacketBufferReleaseTest) {
91  IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512);
92 
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 
108 BOOST_AUTO_TEST_CASE(PacketBufferCommitErrorTest)
109 {
110  IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(8);
111 
112  // Cannot commit data bigger than the max size of the buffer
113  BOOST_CHECK_THROW(packetBuffer->Commit(16);, armnn::RuntimeException);
114 }
115 
116 BOOST_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 
127 BOOST_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
133  auto reservedBuffer = bufferManager.Reserve(1024, reservedSize);
134  BOOST_TEST(reservedSize == 0);
135  BOOST_TEST(!reservedBuffer.get());
136 }
137 
138 BOOST_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
149  auto reservedBuffer = bufferManager.Reserve(512, reservedSize);
150  BOOST_TEST(reservedSize == 0);
151  BOOST_TEST(!reservedBuffer.get());
152 }
153 
154 BOOST_AUTO_TEST_CASE(BufferReserveMultipleTest)
155 {
156  BufferManager bufferManager(3, 512);
157  unsigned int reservedSize0 = 0;
158  auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
159 
160  // Successfully reserved the buffer with requested size
161  BOOST_TEST(reservedSize0 == 512);
162  BOOST_TEST(packetBuffer0.get());
163 
164  unsigned int reservedSize1 = 0;
165  auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
166 
167  // Successfully reserved the buffer with requested size
168  BOOST_TEST(reservedSize1 == 128);
169  BOOST_TEST(packetBuffer1.get());
170 
171  unsigned int reservedSize2 = 0;
172  auto packetBuffer2 = bufferManager.Reserve(512, reservedSize2);
173 
174  // Successfully reserved the buffer with requested size
175  BOOST_TEST(reservedSize2 == 512);
176  BOOST_TEST(packetBuffer2.get());
177 
178  // Cannot reserve when buffer is not available
179  unsigned int reservedSize3 = 0;
180  auto reservedBuffer = bufferManager.Reserve(512, reservedSize3);
181  BOOST_TEST(reservedSize3 == 0);
182  BOOST_TEST(!reservedBuffer.get());
183 }
184 
185 BOOST_AUTO_TEST_CASE(BufferReleaseTest)
186 {
187  BufferManager bufferManager(2, 512);
188  unsigned int reservedSize0 = 0;
189  auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
190 
191  // Successfully reserved the buffer with requested size
192  BOOST_TEST(reservedSize0 == 512);
193  BOOST_TEST(packetBuffer0.get());
194 
195  unsigned int reservedSize1 = 0;
196  auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
197 
198  // Successfully reserved the buffer with requested size
199  BOOST_TEST(reservedSize1 == 128);
200  BOOST_TEST(packetBuffer1.get());
201 
202  // Cannot reserve when buffer is not available
203  unsigned int reservedSize2 = 0;
204  auto reservedBuffer = bufferManager.Reserve(512, reservedSize2);
205  BOOST_TEST(reservedSize2 == 0);
206  BOOST_TEST(!reservedBuffer.get());
207 
208  bufferManager.Release(packetBuffer0);
209 
210  // Buffer should become available after release
211  auto packetBuffer2 = bufferManager.Reserve(128, reservedSize2);
212 
213  BOOST_TEST(reservedSize2 == 128);
214  BOOST_TEST(packetBuffer2.get());
215 }
216 
217 BOOST_AUTO_TEST_CASE(BufferCommitTest)
218 {
219  BufferManager bufferManager(2, 512);
220  unsigned int reservedSize0 = 0;
221  auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
222 
223  BOOST_TEST(reservedSize0 == 512);
224  BOOST_TEST(packetBuffer0.get());
225 
226  unsigned int reservedSize1 = 0;
227  auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
228 
229  BOOST_TEST(reservedSize1 == 128);
230  BOOST_TEST(packetBuffer1.get());
231 
232  unsigned int reservedSize2 = 0;
233  auto reservedBuffer = bufferManager.Reserve(512, reservedSize2);
234  BOOST_TEST(reservedSize2 == 0);
235  BOOST_TEST(!reservedBuffer.get());
236 
237  bufferManager.Commit(packetBuffer0, 256);
238 
239  // Buffer should become readable after commit
240  auto packetBuffer2 = bufferManager.GetReadableBuffer();
241  BOOST_TEST(packetBuffer2.get());
242  BOOST_TEST(packetBuffer2->GetSize() == 256);
243 
244  // Buffer not set back to available list after commit
245  unsigned int reservedSize = 0;
246  reservedBuffer = bufferManager.Reserve(512, reservedSize);
247  BOOST_TEST(reservedSize == 0);
248  BOOST_TEST(!reservedBuffer.get());
249 }
250 
251 BOOST_AUTO_TEST_CASE(BufferMarkReadTest)
252 {
253  BufferManager bufferManager(2, 512);
254  unsigned int reservedSize0 = 0;
255  auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
256 
257  BOOST_TEST(reservedSize0 == 512);
258  BOOST_TEST(packetBuffer0.get());
259 
260  unsigned int reservedSize1 = 0;
261  auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
262 
263  BOOST_TEST(reservedSize1 == 128);
264  BOOST_TEST(packetBuffer1.get());
265 
266  // Cannot reserve when buffer is not available
267  unsigned int reservedSize2 = 0;
268  auto reservedBuffer = bufferManager.Reserve(512, reservedSize2);
269  BOOST_TEST(reservedSize2 == 0);
270  BOOST_TEST(!reservedBuffer.get());
271 
272  bufferManager.Commit(packetBuffer0, 256);
273 
274  // Buffer should become readable after commit
275  auto packetBuffer2 = bufferManager.GetReadableBuffer();
276  BOOST_TEST(packetBuffer2.get());
277  BOOST_TEST(packetBuffer2->GetSize() == 256);
278 
279  // Buffer not set back to available list after commit
280  reservedBuffer = bufferManager.Reserve(512, reservedSize2);
281  BOOST_TEST(reservedSize2 == 0);
282  BOOST_TEST(!reservedBuffer.get());
283 
284  bufferManager.MarkRead(packetBuffer2);
285 
286  //Buffer should set back to available list after marked read and can be reserved
287  auto readBuffer = bufferManager.GetReadableBuffer();
288  BOOST_TEST(!readBuffer);
289  unsigned int reservedSize3 = 0;
290  auto packetBuffer3 = bufferManager.Reserve(56, reservedSize3);
291 
292  BOOST_TEST(reservedSize3 == 56);
293  BOOST_TEST(packetBuffer3.get());
294 }
295 
BOOST_AUTO_TEST_SUITE(TensorflowLiteParser)
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
BOOST_AUTO_TEST_CASE(CheckConvolution2dLayer)
IPacketBufferPtr GetReadableBuffer() override
uint32_t ReadUint32(const IPacketBufferPtr &packetBuffer, unsigned int offset)
void MarkRead(IPacketBufferPtr &packetBuffer) override
BOOST_AUTO_TEST_SUITE_END()
std::unique_ptr< IPacketBuffer > IPacketBufferPtr
void Release(IPacketBufferPtr &packetBuffer) override