rambrain
testCyclicManagedMemory.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 <gtest/gtest.h>
21 #include <time.h>
22 #include <stdlib.h>
23 #include "xmmintrin.h"
24 #include "cyclicManagedMemory.h"
25 #include "managedPtr.h"
26 #include "managedDummySwap.h"
27 #include "exceptions.h"
28 #include <configreader.h>
29 #include "tester.h"
30 #include "rambrainconfig.h"
31 
32 using namespace rambrain;
33 
37 TEST ( cyclicManagedMemory, Unit_AllocatePointers )
38 {
39  //Allocate Dummy swap
40  managedDummySwap swap ( 100 );
41  //Allocate Manager
42  cyclicManagedMemory manager ( &swap, 800 );
43 
44  //Allocate 50% of space for an double array
45  managedPtr<double> gPtr ( 50 );
46 
47  //Try to rad from it
48  adhereTo<double> gPtrI ( gPtr );
49  double *lPtr = gPtrI;
50 
51  ASSERT_TRUE ( lPtr != NULL );
52 
53  ASSERT_EQ ( sizeof ( double ) * 50, manager.getUsedMemory() );
54 
55  ASSERT_NO_FATAL_FAILURE (
56  for ( int n = 0; n < 50; n++ ) {
57  lPtr[n] = 1.; //Should not segfault
58  } );
59 }
60 
61 #ifdef PARENTAL_CONTROL
62 
65 TEST ( cyclicManagedMemory, Unit_DeepAllocatePointers )
66 {
67  class A
68  {
69  public:
70  managedPtr<double> testelements = managedPtr<double> ( 10 );
71  void test() {
72  ADHERETO ( double, testelements );
73  testelements[0] = 3;
74  }
75  };
76 
77  //Allocate Dummy swap
78  managedDummySwap swap ( 100 );
79  //Allocate Manager
80  cyclicManagedMemory manager ( &swap, 800 );
81 
82 
83  managedPtr<A> managedA ( 2 );
84 
85  unsigned int sizeA = sizeof ( A );
86  unsigned int sizeInt = sizeof ( int );
87  unsigned int sizeDouble = sizeof ( double );
88 
89  ADHERETOLOC ( A, managedA, locA );
90 
91  ASSERT_TRUE ( locA != NULL );
92 
93  adhereTo<double> adhTestelements = locA->testelements;
94  double *testelements = adhTestelements;
95  ASSERT_TRUE ( testelements != NULL );
96  ASSERT_TRUE ( manager.checkCycle() );
97 
98  locA->test();
99 
100  EXPECT_EQ ( 1u, manager.getNumberOfChildren ( managedMemory::root ) );
101  EXPECT_EQ ( 2u, manager.getNumberOfChildren ( 2 ) );
102  {
103  managedPtr<int> test ( 10 );
104 
105  EXPECT_EQ ( 2u, manager.getNumberOfChildren ( managedMemory::root ) );
106  EXPECT_EQ ( 2 * ( sizeA + 10 * sizeDouble ) + 10 * sizeInt, manager.getUsedMemory() );
107  }
108  EXPECT_EQ ( 2 * ( sizeA + 10 * sizeDouble ), manager.getUsedMemory() );
109 
110 }
111 #endif
112 
116 TEST ( cyclicManagedMemory, Unit_NotEnoughMemOrSwapSpace )
117 {
118  managedDummySwap swap1 ( 0 ), swap2 ( 1000 );
119  cyclicManagedMemory *manager1 = new cyclicManagedMemory ( &swap1, 0 );
120 
121  EXPECT_THROW ( managedPtr<double> ptr1 ( 10 ), memoryException );
122 
123  manager1->setMemoryLimit ( 1000 );
124 
125  EXPECT_NO_THROW ( managedPtr<double> ptr2 ( 10 ) );
126 
127  cyclicManagedMemory *manager2 = new cyclicManagedMemory ( &swap1, 90 );
128 
129  EXPECT_NO_THROW ( managedPtr<double> ptr3 ( 10 ) );
130  EXPECT_THROW ( managedPtr<double> ptr5 ( 10 ); managedPtr<double> ptr4 ( 10 ), memoryException );
131 
132  manager2->setMemoryLimit ( 1000 );
133 
134  EXPECT_NO_THROW ( managedPtr<double> ptr6 ( 10 ) );
135 
136  delete manager2;
137  delete manager1;
138 }
139 
143 TEST ( cyclicManagedMemory, Integration_ArrayAccess )
144 {
145  const int memsize = 10240;
146  const int allocarrn = 4000;
147  //Allocate Dummy swap
148  managedDummySwap swap ( memsize * 1000 );
149  //Allocate Manager
150  cyclicManagedMemory manager ( &swap, memsize );
151 
152  managedPtr<double> *ptrs[allocarrn];
153  for ( int n = 0; n < allocarrn; n++ ) {
154  ptrs[n] = new managedPtr<double> ( 10 );
155  ASSERT_TRUE ( manager.checkCycle() );
156  }
157 
158  ASSERT_TRUE ( manager.checkCycle() );
159  for ( int o = 0; o < 100; o++ ) {
160  ASSERT_TRUE ( manager.checkCycle() );
161  //Write fun to tree, but require swapping:
162  for ( int n = 0; n < allocarrn; n++ ) {
163  //ASSERT_TRUE(manager.checkCycle());
164  adhereTo<double> aLoc ( *ptrs[n] );
165  double *darr = aLoc;
166  for ( int m = 0; m < 10; m++ ) {
167  darr[m] = n * 13 + m * o;
168  }
169  }
170  //Now check equality:
171  for ( int n = 0; n < allocarrn; n++ ) {
172  adhereTo<double> aLoc ( *ptrs[n] );
173  double *darr = aLoc;
174  for ( int m = 0; m < 10; m++ ) {
175  EXPECT_EQ ( n * 13 + m * o, darr[m] );
176  }
177  }
178  }
179 #ifdef SWAPSTATS
180  manager.printSwapstats();
181  EXPECT_TRUE ( manager.getHitsOverMisses() > 1. );
182 #endif
183 
184  for ( int n = 0; n < allocarrn; n++ ) {
185  delete ptrs[n];
186  }
187 
188 }
189 
193 TEST ( cyclicManagedMemory, Integration_RandomArrayAccess )
194 {
195  const int fac = 1000;
196  const int memsize = 10.240 * fac;
197  const int allocarrn = 4 * fac;
198  tester test;
199  test.setSeed();
200 
201  //Allocate Dummy swap
202  managedDummySwap swap ( allocarrn * 100 );
203  //Allocate Manager
204  cyclicManagedMemory manager ( &swap, memsize );
205 
206 
207  managedPtr<double> *ptrs[allocarrn];
208  for ( int n = 0; n < allocarrn; ++n ) {
209  ptrs[n] = new managedPtr<double> ( 10 );
210  adhereTo<double> aLoc ( *ptrs[n] );
211  double *darr = aLoc;
212  for ( int m = 0; m < 10; ++m ) {
213  darr[m] = -1;
214  }
215  ASSERT_TRUE ( manager.checkCycle() );
216 #ifdef SWAPSTATSLONG
217  manager.printMemUsage();
218 #endif
219  }
220 
221 #ifdef SWAPSTATS
222  double averageRate = 0;
223  double datain = 0, dataout = 0;
224 #endif
225  /* //This should get us somewhere near ideal: (use for testing whether test was written correctly)
226  manager.setPreemptiveLoading(false);
227  manager.setPreemptiveUnloading(false);
228  //*/
229  ASSERT_TRUE ( manager.checkCycle() );
230  for ( int o = 0; o < 10; ++o ) {
231  ASSERT_TRUE ( manager.checkCycle() );
232  //Write fun to tree, but require swapping:
233 #ifdef SWAPSTATS
234  manager.resetSwapstats();
235 #endif
236 
237  for ( int n = 0; n < allocarrn; ++n ) {
238  unsigned int randomi = test.random ( allocarrn );
239  adhereTo<double> aLoc ( *ptrs[randomi] );
240 
241  ASSERT_TRUE ( manager.checkCycle() );
242 
243  double *darr = aLoc;
244  for ( int m = 0; m < 10; m++ ) {
245  darr[m] = randomi * 13 + m * o;
246  }
247 #ifdef SWAPSTATSLONG
248  manager.printMemUsage();
249 #endif
250  }
251 #ifdef SWAPSTATS
252  averageRate += manager.getHitsOverMisses();
253  datain += manager.getTotalSwappedInBytes();
254  dataout += manager.getTotalSwappedInBytes();
255  manager.printSwapstats();
256 #endif
257  //Now check equality:
258  for ( int n = 0; n < allocarrn; n++ ) {
259  adhereTo<double> aLoc ( *ptrs[n] );
260  const double *darr = aLoc;
261  for ( int m = 0; m < 10; ++m ) {
262  EXPECT_TRUE ( darr[m] == -1 || ( darr[m] == n * 13 + m * o ) );
263 
264  }
265 
266 #ifdef SWAPSTATSLONG
267  manager.printMemUsage();
268 #endif
269  }
270  //reset numbers again:
271  for ( int n = 0; n < allocarrn; ++n ) {
272  adhereTo<double> aLoc ( *ptrs[n] );
273  double *darr = aLoc;
274  for ( int m = 0; m < 10; ++m ) {
275  darr[m] = -1;
276  }
277 #ifdef SWAPSTATSLONG
278  manager.printMemUsage();
279 #endif
280  }
281 
282  }
283 
284 #ifdef SWAPSTATS
285  averageRate /= 10.;
286  manager.printSwapstats();
287  double ideal_homirate = ( ( double ) memsize ) / ( allocarrn * 10 * sizeof ( double ) );
288  infomsgf ( "Ideal hits over misses %lf vs. reached: %lf factor of ~ %lf", ideal_homirate, averageRate, ideal_homirate / averageRate );
289  EXPECT_TRUE ( averageRate > .5 * ideal_homirate );
290 
291  double ideal_rate = ( 10 * allocarrn * 10 * sizeof ( double ) ) * ( 1 - ideal_homirate );
292  infomsgf ( "Ideal data rate %lf vs. reached: %lf (in) %lf (out) factor of ~ %lf ", ideal_rate, datain, dataout, ( .5 * ( datain + dataout ) / ideal_rate ) );
293  EXPECT_TRUE ( datain < 4 * ideal_rate );
294  EXPECT_TRUE ( dataout < 4 * ideal_rate );
295 
296 #endif
297 
298  for ( int n = 0; n < allocarrn; n++ ) {
299  delete ptrs[n];
300 #ifdef SWAPSTATSLONG
301  manager.printMemUsage();
302 #endif
303  }
304 
305 }
306 
310 TEST ( cyclicManagedMemory, Unit_VariousSize )
311 {
312  const unsigned int memsize = sizeof ( double ) * 10;
313  const unsigned int swapmem = 100 * memsize;
314 
315  managedDummySwap swap ( swapmem );
316  cyclicManagedMemory manager ( &swap, memsize );
317 
318  for ( unsigned int o = 0; o < 10; ++o ) {
319  const unsigned int targetsize = o + 1;
320  const unsigned int totalspace = 8 * targetsize * sizeof ( double );
321  const unsigned int swappedmin = ( totalspace > memsize ? totalspace - memsize : 0u );
322  managedPtr<double> *arr[8];
323  for ( unsigned int p = 0; p < 8; ++p ) {
324  arr[p] = new managedPtr<double> ( targetsize );
325  ASSERT_TRUE ( manager.checkCycle() );
326  }
327  ASSERT_GE ( swap.getUsedSwap(), swappedmin );
328  ASSERT_EQ ( manager.getSwappedMemory(), swap.getUsedSwap() );
329 
330  for ( unsigned int p = 0; p < 8; ++p ) {
331  managedPtr<double> &a = *arr[p];
332  ADHERETOLOC ( double, a, locA );
333  locA[0] = o + p;
334  ASSERT_TRUE ( manager.checkCycle() );
335  }
336  for ( unsigned int p = 0; p < 8; ++p ) {
337  managedPtr<double> &a = *arr[p];
338  ADHERETOLOC ( double, a, locA );
339  EXPECT_EQ ( o + p, locA[0] );
340  ASSERT_TRUE ( manager.checkCycle() );
341  }
342  for ( unsigned int p = 0; p < 8; ++p ) {
343  delete arr[p];
344  ASSERT_TRUE ( manager.checkCycle() );
345  }
346  ASSERT_EQ ( 0u, swap.getUsedSwap() );
347  ASSERT_EQ ( manager.getSwappedMemory(), swap.getUsedSwap() );
348  }
349 }
350 
354 TEST ( cyclicManagedMemory, Unit_RandomAllocation )
355 {
356  const unsigned int memsize = sizeof ( double ) * 10;
357  const unsigned int swapmem = 10000 * memsize;
358  tester test;
359  test.setSeed();
360 
361  managedDummySwap swap ( swapmem );
362  cyclicManagedMemory manager ( &swap, memsize );
363 
364  for ( unsigned int o = 0; o < 10; ++o ) {
365  const unsigned int arraysize = test.random ( 10 ) + 1;
366  const unsigned int targetsize = test.random ( 10 ) + 1;
367  const unsigned int totalspace = arraysize * targetsize * sizeof ( double );
368  const unsigned int swappedmin = ( totalspace > memsize ? totalspace - memsize : 0u );
369  managedPtr<double> *arr[arraysize];
370 
371  for ( unsigned int p = 0; p < arraysize; ++p ) {
372  arr[p] = new managedPtr<double> ( targetsize );
373  ASSERT_TRUE ( manager.checkCycle() );
374  }
375 
376  ASSERT_GE ( swap.getUsedSwap(), swappedmin );
377  ASSERT_EQ ( manager.getSwappedMemory(), swap.getUsedSwap() );
378 
379  for ( unsigned int p = 0; p < arraysize; ++p ) {
380  managedPtr<double> &a = *arr[p];
381  ADHERETOLOC ( double, a, locA );
382  locA[0] = o + p;
383  ASSERT_TRUE ( manager.checkCycle() );
384  }
385 
386  for ( unsigned int p = 0; p < arraysize; ++p ) {
387  managedPtr<double> &a = *arr[p];
388  ADHERETOLOC ( double, a, locA );
389  EXPECT_EQ ( o + p, locA[0] );
390  ASSERT_TRUE ( manager.checkCycle() );
391  }
392 
393  for ( unsigned int p = 0; p < arraysize; ++p ) {
394  delete arr[p];
395  ASSERT_TRUE ( manager.checkCycle() );
396  }
397 
398  ASSERT_EQ ( 0u, swap.getUsedSwap() );
399  ASSERT_EQ ( manager.getSwappedMemory(), swap.getUsedSwap() );
400  }
401 }
402 
406 TEST ( cyclicManagedMemory, Unit_NotEnoughSpaceForOneElement )
407 {
408  const unsigned int memsize = sizeof ( double ) / 2;
409  const unsigned int swapmem = memsize;
410 
411  managedDummySwap swap ( swapmem );
412  cyclicManagedMemory manager ( &swap, memsize );
413 
414  ASSERT_THROW ( managedPtr<double> ptr ( 1 ), memoryException );
415 }
416 
420 TEST ( cyclicManagedMemory, Unit_NotEnoughSpaceForArray )
421 {
422  const unsigned int memsize = sizeof ( double ) * 2;
423  const unsigned int swapmem = memsize;
424 
425  managedDummySwap swap ( swapmem );
426  cyclicManagedMemory manager ( &swap, memsize );
427 
428  ASSERT_THROW ( managedPtr<double> ptr ( 10 ), memoryException );
429 }
430 
431 TEST ( cyclicManagedMemory, Unit_NotEnoughSpaceInTotal )
432 {
433  const unsigned int memsize = sizeof ( double ) * 20;
434  const unsigned int swapmem = memsize;
435 
436  managedDummySwap swap ( swapmem );
437  cyclicManagedMemory manager ( &swap, memsize );
438  managedPtr<double> *ptr1, *ptr2, *ptr3, *ptr4, *ptr5;
439  ptr1 = ptr2 = ptr3 = ptr4 = ptr5 = NULL;
440 
441  ASSERT_NO_THROW ( ptr1 = new managedPtr<double> ( 10 ) );
442  ASSERT_NO_THROW ( ptr2 = new managedPtr<double> ( 10 ) );
443  ASSERT_NO_THROW ( ptr3 = new managedPtr<double> ( 10 ) );
444  ASSERT_NO_THROW ( ptr4 = new managedPtr<double> ( 10 ) );
445  ASSERT_THROW ( ptr5 = new managedPtr<double> ( 10 ), memoryException );
446 
447  delete ptr1;
448  delete ptr2;
449  delete ptr3;
450  delete ptr4;
451  delete ptr5;
452 }
453 
457 TEST ( cyclicManagedMemory, Unit_WorkingWithSSE )
458 {
459  union sixteen {
460  float f[4];
461  __m128 simd;
462  } __attribute__ ( ( aligned ( 16 ) ) );
463 
464  const unsigned int memsize = sizeof ( double ) * 3;
465  const unsigned int swapmem = memsize * 100;
466 
467  managedDummySwap swap ( swapmem );
468  cyclicManagedMemory manager ( &swap, memsize );
469 
470  managedPtr<sixteen> ptr1 ( 1 );
471  {
472  ADHERETOLOC ( sixteen, ptr1, locptr1 );
473  for ( int i = 0; i < 4; ++i ) {
474  locptr1[0].f[i] = i;
475  }
476  }
477 
478  managedPtr<sixteen> ptr2 ( 1 );
479  {
480  ADHERETOLOC ( sixteen, ptr2, locptr2 );
481  for ( int i = 0; i < 4; ++i ) {
482  locptr2[0].f[i] = i + 5;
483  }
484  }
485 
486  {
487  ADHERETOLOC ( sixteen, ptr1, locptr1 );
488  for ( int i = 0; i < 4; ++i ) {
489  ASSERT_EQ ( i, locptr1[0].f[i] );
490  }
491 
492  sixteen s;
493  for ( int i = 0; i < 4; ++i ) {
494  s.f[i] = 10 * i;
495  }
496  locptr1[0].simd = _mm_add_ps ( locptr1[0].simd, s.simd );
497  }
498 
499  {
500  ADHERETOLOCCONST ( sixteen, ptr2, locptr2 );
501  for ( int i = 0; i < 4; ++i ) {
502  ASSERT_EQ ( i + 5, locptr2[0].f[i] );
503  }
504  }
505 
506  {
507  ADHERETOLOC ( sixteen, ptr1, locptr1 );
508  for ( int i = 0; i < 4; ++i ) {
509  ASSERT_EQ ( 11 * i, locptr1[0].f[i] );
510  }
511  }
512 }
513 
517 TEST ( cyclicManagedMemory, Unit_HandleNestedObjects )
518 {
519  class A
520  {
521  public:
522  double d;
523  int i;
524  };
525 
526  class B
527  {
528  public:
529  B() : a1 ( 2 ), a2 ( new managedPtr<A> ( 2 ) ) {
530  }
531  ~B() {
532  delete a2;
533  }
534 
535  void set ( int i ) {
536  d1 = 10.0 * i;
537  ADHERETO ( A, a1 );
538  for ( int j = 0; j < 2; ++j ) {
539  a1[j].d = 100.0 * i * j;
540  a1[j].i = i * j;
541  }
542  d2 = 20.0 * i;
543  adhereTo<A> a2_glue ( *a2 );
544  A *loca2 = a2_glue;
545  for ( int j = 0; j < 2; ++j ) {
546  loca2[j].d = 1000.0 * i * j;
547  loca2[j].i = 10 * i * j;
548  }
549  d3 = 30.0 * i;
550  }
551 
552  double d1;
553  managedPtr<A> a1;
554  double d2;
555  managedPtr<A> *a2;
556  double d3;
557  };
558 
559 
560  const unsigned int memsize = ( sizeof ( B ) + sizeof ( A ) * 4 ) * 2;
561  const unsigned int swapmem = memsize * 2;
562 
563  managedDummySwap swap ( swapmem );
564  cyclicManagedMemory manager ( &swap, memsize );
565 
566  managedPtr<B> b ( 2 );
567  {
568  ADHERETOLOC ( B, b, locb );
569  ASSERT_NO_THROW ( locb[0].set ( 1 ) );
570  ASSERT_NO_THROW ( locb[1].set ( 2 ) );
571  }
572 
573  ASSERT_NO_THROW (
574  managedPtr<int> i ( 5 );
575  ADHERETOLOC ( int, i, loci );
576  for ( int j = 0; j < 5; ++j ) {
577  loci[j] = j;
578  }
579  );
580 
581  ASSERT_NO_THROW (
582  ADHERETOLOCCONST ( B, b, locb );
583  for ( int i = 0, k = 1; i < 2; ++i, ++k ) {
584  ASSERT_EQ ( 10.0 * k, locb[i].d1 );
585 
586  const adhereTo<A> a1 ( locb[i].a1 );
587  const A *loca1 = a1;
588  for ( int j = 0; j < 2; ++j ) {
589  ASSERT_EQ ( 100.0 * k * j, loca1[j].d );
590  ASSERT_EQ ( k * j, loca1[j].i );
591  }
592 
593  ASSERT_EQ ( 20.0 * k, locb[i].d2 );
594  ASSERT_EQ ( 30.0 * k, locb[i].d3 );
595 
596  const adhereTo<A> a2 ( *locb[i].a2 );
597  const A *loca2 = a2;
598  for ( int j = 0; j < 2; ++j ) {
599  ASSERT_EQ ( 1000.0 * k * j, loca2[j].d );
600  ASSERT_EQ ( 10 * k * j, loca2[j].i );
601  }
602  }
603  );
604 }
605 
609 TEST ( cyclicManagedMemory, Unit_CleanupOfForgottenPointers )
610 {
611  const unsigned int memsize = 10 * sizeof ( double );
612  const unsigned int swapmem = memsize * 10;
613 
614  managedDummySwap *swap = new managedDummySwap ( swapmem );
615  cyclicManagedMemory *manager = new cyclicManagedMemory ( swap, memsize );
616 
617  managedPtr<double> *A = new managedPtr<double> ( 10 );
618  {
619  adhereTo<double> loca ( *A );
620  double *a = loca;
621  for ( int i = 0; i < 10; ++i ) {
622  a[i] = 1.0 * i;
623  }
624  }
625 
626  managedPtr<double> *B = new managedPtr<double> ( 10 );
627  {
628  adhereTo<double> locb ( *B );
629  double *b = locb;
630  for ( int i = 0; i < 10; ++i ) {
631  b[i] = 2.0 * i;
632  }
633  }
634 
635  A = NULL;
636  B = NULL;
637 
638  ASSERT_NO_FATAL_FAILURE ( delete manager );
639  ASSERT_NO_FATAL_FAILURE ( delete swap );
640 
641  //This test breaks default manager.
643 }
644 
648 #ifdef SWAPSTATS
649 TEST ( cyclicManagedMemory, Unit_RecoveryFromRandomAccess )
650 {
651  const unsigned int n_el = 1024;
652  const unsigned int memsize = n_el * sizeof ( char ) / 2;
653  const unsigned int swapsize = 10 * memsize;
654 
655  managedDummySwap swap ( swapsize );
656  cyclicManagedMemory manager ( &swap, memsize );
657 
658  managedPtr<char> randomAccess[n_el];
659  managedPtr<char> consecutiveAccess[n_el];
660 
661  tester test;
662  test.setSeed();
663 
664  manager.resetSwapstats();
665  //Set consecutive order and check whether scheduler works correctly
666  for ( unsigned int n = 0; n < n_el * 10; ++n ) {
667  adhereTo<char> glue ( consecutiveAccess[n % n_el] );
668  char *loc = glue;
669  *loc = n % 256;
670  }
671  double homi_rate = manager.getHitsOverMisses();
672  infomsgf ( "HoMrate = %lf ", homi_rate );
673  EXPECT_TRUE ( homi_rate > 50 );
674  manager.resetSwapstats();
675  //Fill up preemptives with random access to object group randomAccess;
676  for ( unsigned int n = 0; n < n_el * 10; ++n ) {
677  unsigned int idx = test.random ( ( int ) n_el - 1 );
678  adhereTo<char> glue ( randomAccess[idx] );
679  char *loc = glue;
680  *loc = n % 256;
681  }
682  homi_rate = manager.getHitsOverMisses();
683  infomsgf ( "HoMrate = %lf", homi_rate );
684  EXPECT_TRUE ( homi_rate < 1 );
685  manager.resetSwapstats();
686 
687  //Now, try to access consecutive object group again
688  for ( unsigned int n = 0; n < n_el * 10; ++n ) {
689  adhereTo<char> glue ( consecutiveAccess[n % n_el] );
690  char *loc = glue;
691  *loc = n % 256;
692  }
693  //And see if we recovered from preemptives:
694  homi_rate = manager.getHitsOverMisses();
695  infomsgf ( "HoMrate = %lf", homi_rate );
696  EXPECT_TRUE ( homi_rate > 40 );
697  manager.resetSwapstats();
698 
699 }
700 #endif
701 
702 
703 
Exception for errors with the memory.
Definition: exceptions.h:87
global_bytesize getSwappedMemory() const
returns current swap usage
Main class to fetch memory that is managed by rambrain for actual usage.
Definition: managedPtr.h:48
void printMemUsage() const
prints out current memory usage
global_bytesize getUsedMemory() const
returns current ram usage
virtual global_bytesize getUsedSwap() const
Simple getter.
Definition: managedSwap.h:86
void setSeed(unsigned int seed=time(NULL))
Set a new seed for random number generation.
Definition: tester.cpp:64
int random(int max) const
Get a random number (integer)
Definition: tester.cpp:74
Main class to allocate memory that is managed by the rambrain memory defaultManager.
Definition: managedMemory.h:54
bool checkCycle()
checks whether the scheduler believes to be sane and prints an error message if not ...
void resetSwapstats()
reset statistic about the number, size and efficiency of swapping actions
static const memoryID root
TEST(cyclicManagedMemory, Unit_AllocatePointers)
double getTotalSwappedInBytes()
simple Getter
A basic class to be used by tests. Provides helper methods and functionality e.g. time measurements...
Definition: tester.h:32
rambrainConfig config
You will find the object in managedMemory.cpp as we have to define it in some 'used' file in the link...
void reinit(bool reread=true)
Reinitialises the system.
void printSwapstats() const
print statistic about the number, size and efficiency of swapping actions
scheduler working with a double linked cycle. Details see paper.
unsigned int getNumberOfChildren(const memoryID &id)
conveniently returns number of children of the memoryChunk with id id
bool setMemoryLimit(global_bytesize size)
dynamically adjusts allowed ram usage
A dummy swap that just copies swapped out chunks to a different location in ram.
double getHitsOverMisses()
returns current hits over misses rate for accessing elements.