rambrain
testAdhereTo.cpp
Go to the documentation of this file.
1 /* rambrain - a dynamical physical memory extender
2  * Copyright (C) 2015 M. Imgrund, A. Arth
3  * mimgrund (at) mpifr-bonn.mpg.de
4  * arth (at) usm.uni-muenchen.de
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program. If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #include "tester.h"
22 
23 #include <gtest/gtest.h>
24 #include "managedPtr.h"
25 #include "cyclicManagedMemory.h"
26 #include "managedDummySwap.h"
27 
28 #ifndef OpenMP_NOT_FOUND
29 #include <omp.h>
30 #endif
31 
32 using namespace rambrain;
33 
37 TEST ( adhereTo, Unit_LoadUnload )
38 {
39  managedDummySwap swap ( 100 );
40  cyclicManagedMemory managedMemory ( &swap, 100 );
41  managedPtr<double> ptr1 ( 2 ), ptr2 ( 2 ), ptr3 ( 2 );
42 
43  adhereTo<double> *global1 = new adhereTo<double> ( ptr1 );
44  adhereTo<double> *global2 = new adhereTo<double> ( ptr2, true );
45  adhereTo<double> *global3 = new adhereTo<double> ( ptr3, false );
46 
47  ASSERT_FALSE ( global1->loadedReadable );
48  ASSERT_FALSE ( global1->loadedWritable );
49 
50  ASSERT_FALSE ( global2->loadedReadable );
51  ASSERT_FALSE ( global2->loadedWritable );
52 
53  ASSERT_FALSE ( global3->loadedReadable );
54  ASSERT_FALSE ( global3->loadedWritable );
55 
56  double *loc1 = *global1;
57  double *loc2 = *global2;
58  double *loc3 = *global3;
59 
60  for ( unsigned int i = 0; i < 2; ++i ) {
61  ASSERT_NO_FATAL_FAILURE ( loc1[i] = i );
62  ASSERT_NO_FATAL_FAILURE ( loc2[i] = i );
63  ASSERT_NO_FATAL_FAILURE ( loc3[i] = i );
64  }
65 
66 
67  ASSERT_FALSE ( global1->loadedReadable );
68  ASSERT_TRUE ( global1->loadedWritable );
69 
70  ASSERT_FALSE ( global2->loadedReadable );
71  ASSERT_TRUE ( global2->loadedWritable );
72 
73  ASSERT_FALSE ( global3->loadedReadable );
74  ASSERT_TRUE ( global3->loadedWritable );
75 
76  delete global1;
77  delete global2;
78  delete global3;
79 }
80 
84 TEST ( adhereTo, Unit_LoadUnloadConst )
85 {
86  managedDummySwap swap ( 100 );
87  cyclicManagedMemory managedMemory ( &swap, 100 );
88  managedPtr<double> ptr1 ( 2 ), ptr2 ( 2 ), ptr3 ( 2 );
89 
90  adhereTo<double> *global1 = new adhereTo<double> ( ptr1 );
91  adhereTo<double> *global2 = new adhereTo<double> ( ptr2, true );
92  adhereTo<double> *global3 = new adhereTo<double> ( ptr3, false );
93 
94  ASSERT_FALSE ( global1->loadedReadable );
95  ASSERT_FALSE ( global1->loadedWritable );
96 
97  ASSERT_FALSE ( global2->loadedReadable );
98  ASSERT_FALSE ( global2->loadedWritable );
99 
100  ASSERT_FALSE ( global3->loadedReadable );
101  ASSERT_FALSE ( global3->loadedWritable );
102 
103  const double *loc1 = *global1;
104  const double *loc2 = *global2;
105  const double *loc3 = *global3;
106  double dummy = 0.0;
107 
108  for ( unsigned int i = 0; i < 2; ++i ) {
109  ASSERT_NO_FATAL_FAILURE ( dummy = loc1[i] );
110  ASSERT_NO_FATAL_FAILURE ( dummy = loc2[i] );
111  ASSERT_NO_FATAL_FAILURE ( dummy = loc3[i] );
112  }
113 
114  ASSERT_TRUE ( global1->loadedReadable );
115  ASSERT_FALSE ( global1->loadedWritable );
116  ASSERT_TRUE ( global2->loadedReadable );
117  ASSERT_FALSE ( global2->loadedWritable );
118  ASSERT_TRUE ( global3->loadedReadable );
119  ASSERT_FALSE ( global3->loadedWritable );
120 
121  delete global1;
122  delete global2;
123  delete global3;
124 }
125 
129 TEST ( adhereTo, Unit_AccessData )
130 {
131  const unsigned int count = 5;
132  managedDummySwap swap ( 100 );
133  cyclicManagedMemory managedMemory ( &swap, 100 );
134  managedPtr<double> ptr ( count );
135 
136  adhereTo<double> *global = new adhereTo<double> ( ptr );
137  double *loc = *global;
138 
139  for ( unsigned int i = 0; i < count; ++i ) {
140  loc[i] = i;
141  }
142 
143  delete global;
144 
145  global = new adhereTo<double> ( ptr );
146  loc = *global;
147 
148  for ( unsigned int i = 0; i < count; ++i ) {
149  EXPECT_EQ ( i, loc[i] );
150  }
151 
152  delete global;
153 }
154 
155 #ifndef OpenMP_NOT_FOUND
156 
159 TEST ( adhereTo, Unit_Multithreading )
160 {
161  const int count = 100;
162  managedDummySwap swap ( 10000 );
163  cyclicManagedMemory managedMemory ( &swap, 10000 );
164  managedPtr<double> ptr ( count );
165  #pragma omp parallel for
166  for ( int n = 0; n < count; ++n ) {
167  ADHERETO ( double, ptr );
168  ptr[n] = n;
169  }
170  ADHERETOLOC ( double, ptr, ptrloc );
171  for ( int n = 0; n < count; ++n ) {
172  EXPECT_EQ ( n, ptrloc[n] );
173  }
174 
175  adhereTo<double> adh ( ptr );
176  #pragma omp parallel for
177  for ( int n = 0; n < count; ++n ) {
178  double *ptr = adh;
179  ptr[n] *= n;
180  }
181  for ( int n = 0; n < count; ++n ) {
182  EXPECT_EQ ( n * n, ptrloc[n] );
183  }
184 }
185 #endif
186 
190 TEST ( adhereTo, Unit_TwiceAdhered )
191 {
192  const unsigned int count = 5;
193  managedDummySwap swap ( 100 );
194  cyclicManagedMemory managedMemory ( &swap, 100 );
195  managedPtr<double> ptr ( count );
196 
197  adhereTo<double> *global1 = new adhereTo<double> ( ptr );
198  double *loc1 = *global1;
199 
200  ASSERT_TRUE ( global1->loadedWritable );
201 
202  for ( unsigned int i = 0; i < count; ++i ) {
203  loc1[i] = i;
204  }
205 
206  adhereTo<double> *global2 = NULL;
207  double *loc2 = NULL;
208 
209 
210  ASSERT_NO_THROW ( global2 = new adhereTo<double> ( ptr , true ) );
211  ASSERT_FALSE ( global2->loadedReadable );
212  ASSERT_NO_THROW ( loc2 = *global2 );
213  ASSERT_EQ ( loc1, loc2 );
214 
215  for ( unsigned int i = 0; i < count; ++i ) {
216  EXPECT_EQ ( i, loc2[i] );
217  }
218 
219  ASSERT_NO_THROW ( delete global2 );
220 
221  for ( unsigned int i = 0; i < count; ++i ) {
222  EXPECT_EQ ( i, loc2[i] );
223  }
224 
225  ASSERT_NO_THROW ( delete global1 );
226 
227 
228 }
229 
230 TEST ( adhereTo, Unit_TwiceAdheredOnceUsed )
231 {
232  const unsigned int count = 5;
233  managedDummySwap swap ( 100 );
234  cyclicManagedMemory managedMemory ( &swap, 100 );
235  managedPtr<double> ptr ( count );
236 
237  adhereTo<double> *global1 = new adhereTo<double> ( ptr );
238  double *loc1 = *global1;
239 
240  ASSERT_TRUE ( global1->loadedWritable );
241 
242  for ( unsigned int i = 0; i < count; ++i ) {
243  loc1[i] = i;
244  }
245 
246  adhereTo<double> *global2 = NULL;
247 
248 
249 
250  ASSERT_NO_THROW ( global2 = new adhereTo<double> ( ptr , true ) );
251  ASSERT_FALSE ( global2->loadedReadable );
252 
253  ASSERT_NO_THROW ( delete global1 );
254  ASSERT_NO_THROW ( delete global2 );
255 
256 }
257 
258 
262 TEST ( adhereTo, Unit_MacroUsage )
263 {
264  const unsigned int count = 5;
265  managedDummySwap swap ( 100 );
266  cyclicManagedMemory managedMemory ( &swap, 100 );
267  managedPtr<double> ptr ( count );
268 
269  ASSERT_NO_FATAL_FAILURE ( ADHERETOLOC ( double, ptr, loc );
270  for ( unsigned int i = 0; i < count; ++i ) {
271  loc[i] = i;
272  } );
273 
274  ASSERT_NO_FATAL_FAILURE ( ADHERETOLOCCONST ( double, ptr, loc );
275  for ( unsigned int i = 0; i < count; ++i ) {
276  EXPECT_EQ ( i, loc[i] );
277  } );
278 }
279 
283 TEST ( adhereTo, Unit_CopyCorrectness )
284 {
285  const unsigned int count = 5;
286  managedDummySwap swap ( kib );
287 
289  managedPtr<double> ptr ( count );
290 
291  adhereTo<double> global1 ( ptr );
292  {
293  double *loc1 = global1;
294 
295  for ( unsigned int i = 0; i < count; ++i ) {
296  loc1[i] = i;
297  }
298  }
299 
300  ASSERT_NO_THROW (
301  adhereTo<double> global2 = global1;
302  adhereTo<double> global3 ( global1 );
303 
304  for ( unsigned int i = 0; i < count; ++i ) {
305  double *loc2 = global2;
306  double *loc3 = global3;
307 
308  EXPECT_EQ ( i, loc2[i] );
309  EXPECT_EQ ( i, loc3[i] );
310  } );
311 }
312 
314 
Main class to fetch memory that is managed by rambrain for actual usage.
Definition: managedPtr.h:48
Main class to allocate memory that is managed by the rambrain memory defaultManager.
Definition: managedMemory.h:54
RESTORE_WARNINGS
const global_bytesize kib
Definition: common.h:67
scheduler working with a double linked cycle. Details see paper.
IGNORE_TEST_WARNINGS
A dummy swap that just copies swapped out chunks to a different location in ram.
TEST(adhereTo, Unit_LoadUnload)
Backend class to handle raw memory and interaction/storage with managedSwap.
Definition: managedMemory.h:68