23 #include <gtest/gtest.h>
30 #ifndef OpenMP_NOT_FOUND
50 #ifdef PARENTAL_CONTROL
117 EXPECT_NO_THROW ( ptr.getLocPtr() );
134 for (
int n = 0; n < 5; n++ ) {
137 ADHERETOLOC (
double, ptr, lptr );
143 for (
int n = 0; n < 5; n++ ) {
147 ADHERETOLOC (
double, ptr, lptr );
148 ADHERETOLOC (
double, ptr2, lptr2 );
155 EXPECT_EQ ( 5 *
sizeof (
double ) * 2, managedMemory.
getUsedMemory() );
161 EXPECT_EQ ( 5 *
sizeof (
double ), managedMemory.
getUsedMemory() );
165 for (
int n = 0; n < 5; n++ ) {
166 ADHERETOLOCCONST (
double, ptr, lptr );
167 ADHERETOLOCCONST (
double, ptr2, lptr2 );
169 EXPECT_EQ ( 1 - n, lptr[n] );
170 EXPECT_EQ ( 1 - n, lptr2[n] );
177 for (
int n = 0; n < 5; n++ ) {
178 ADHERETOLOC (
double, ptr, lptr );
179 ADHERETOLOC (
double, ptr2, lptr2 );
181 EXPECT_EQ ( 1 - n, lptr[n] );
182 EXPECT_EQ ( 1 - n, lptr2[n] );
187 for (
int n = 0; n < 5; n++ ) {
188 ADHERETOLOCCONST (
double, ptr, lptr );
189 ADHERETOLOCCONST (
double, ptr2, lptr2 );
191 EXPECT_EQ ( 1 - n, lptr[n] );
192 EXPECT_EQ ( 1 - n, lptr2[n] );
197 for (
int n = 0; n < 5; n++ ) {
198 ADHERETOLOC (
double, ptr, lptr );
199 ADHERETOLOC (
double, ptr2, lptr2 );
200 ADHERETOLOC (
double, ptr3, lptr3 );
202 EXPECT_EQ ( 1 - n, lptr[n] );
203 EXPECT_EQ ( 1 - n, lptr2[n] );
204 EXPECT_EQ ( 1 - n, lptr3[n] );
229 ASSERT_DEATH (
delete ptr,
"terminate called after throwing an instance of 'rambrain::memoryException'" );
230 printf (
"Hello from below" );
247 for (
int n = 0; n < 5; n++ ) {
251 for (
int n = 0; n < 5; n++ ) {
252 EXPECT_EQ ( n, ptr[n] );
262 const unsigned int alloc = 10u;
263 const unsigned int memsize = 1.5 * alloc *
sizeof ( double );
264 const unsigned int swapsize = 10 * memsize;
271 for (
unsigned int n = 0; n < alloc; n++ ) {
276 for (
unsigned int n = 0; n < alloc; n++ ) {
277 EXPECT_EQ ( n, ptr1[n] );
278 EXPECT_EQ ( 2 * n, ptr2[n] );
289 class nurfuerspassclass
292 nurfuerspassclass (
int a ) : val ( a ) {};
296 const unsigned int alloc = 10u;
297 const unsigned int memsize = 1.5 * alloc *
sizeof ( double );
298 const unsigned int swapsize = 10 * memsize;
305 nurfuerspassclass *hfbuf = hf;
306 for (
int n = 0; n < 5; n++ ) {
307 ASSERT_EQ ( 5, hfbuf[n].val );
324 A (
int a = 42 ) : a ( a ) {}
329 ADHERETOLOC ( A, myA1, A1 );
330 EXPECT_EQ ( 42, A1->a );
333 ADHERETOLOC ( A, myA2, A2 );
334 EXPECT_EQ ( 42, A2->a );
337 ADHERETOLOC ( A, myA3, A3 );
338 EXPECT_EQ ( 43, A3->a );
341 ADHERETOLOC ( A, myA4, A4 );
342 EXPECT_EQ ( 43, A4[0].a );
343 EXPECT_EQ ( 43, A4[1].a );
357 for (
int n = 0; n < 5; n++ ) {
361 for (
int n = 0; n < 5; n++ ) {
362 EXPECT_EQ ( n, ptr[n] );
372 const unsigned int alloc = 20000u;
373 const unsigned int memsize = 1.5 * alloc *
sizeof ( double );
374 const unsigned int swapsize = 10 * memsize;
375 const unsigned int runs = 10;
384 ADHERETOLOC (
double, ptr1, lptr1 );
385 for (
unsigned int n = 0; n < alloc; n++ ) {
391 ADHERETOLOC (
double, ptr2, lptr2 );
392 for (
unsigned int n = 0; n < alloc; n++ ) {
400 ADHERETOLOC (
double, ptr1, lptr1 );
401 for (
unsigned int r = 0; r < runs; ++r ) {
402 for (
unsigned int n = 0; n < alloc; n++ ) {
403 EXPECT_EQ ( n, lptr1[n] );
408 ADHERETOLOC (
double, ptr2, lptr2 );
409 for (
unsigned int r = 0; r < runs; ++r ) {
410 for (
unsigned int n = 0; n < alloc; n++ ) {
411 EXPECT_EQ ( -n, lptr2[n] );
418 for (
unsigned int r = 0; r < runs; ++r ) {
419 for (
unsigned int n = 0; n < alloc; n++ ) {
420 EXPECT_EQ ( n, ptr1[n] );
421 EXPECT_EQ ( -n, ptr2[n] );
428 infomsgf (
"Smart access ran for %ld ms", durations[0] );
429 infomsgf (
"Direct access ran for %ld ms", durations[1] );
430 infomsgf (
"Direct access cost %g as much time as smart access", 1.0 * durations[1] / durations[0] );
434 #ifndef OpenMP_NOT_FOUND
444 const unsigned int arrsize = 200;
446 for (
unsigned int i = 0; i < arrsize; ++i ) {
449 #pragma omp parallel for
450 for (
unsigned int i = 0; i < arrsize; ++i ) {
454 #pragma omp parallel for
455 for (
unsigned int i = 0; i < arrsize; ++i ) {
477 #pragma omp parallel for
478 for (
int i = 0; i < 1000; ++i ) {
480 ADHERETOLOC (
double, a, loc );
481 loc[i % 40] = i % 40;
484 ADHERETOLOC (
double, b, loc );
485 loc[i % 40] = i % 40;
489 for (
int i = 0; i < 40; ++i ) {
491 ADHERETOLOC (
double, a, loc );
492 ASSERT_EQ ( i % 40, loc[i % 40] );
495 ADHERETOLOC (
double, b, loc );
496 ASSERT_EQ ( i % 40, loc[i % 40] );
514 #pragma omp parallel for
515 for (
int i = 0; i < 10000; ++i ) {
516 if ( i % 500 == 0 ) {
561 ASSERT_EQ ( 1, destructorTracker::num_instances );
565 ASSERT_EQ ( 2, destructorTracker::num_instances );
568 ASSERT_EQ ( 1, destructorTracker::num_instances );
571 ASSERT_EQ ( 0, destructorTracker::num_instances );
583 ASSERT_NO_FATAL_FAILURE (
587 EXPECT_TRUE ( NULL == mptr );
603 ASSERT_EQ ( 14, ptr.size() );
619 * ( (
char * ) NULL ) = 0x00;
651 double *data = glue2;
674 ADHERETOLOC (
double, ptr1, loc );
675 for (
int i = 0; i < 5; ++i ) {
682 ADHERETOLOC (
double, ptr2, loc );
683 for (
int i = 0; i < 5; ++i ) {
684 ASSERT_EQ ( i, loc[i] );
690 ADHERETOLOCCONST (
double, ptr1, loc );
691 for (
int i = 0; i < 5; ++i ) {
692 ASSERT_EQ ( i * 10, loc[i] );
698 ADHERETOLOC (
double, ptr3, loc );
699 for (
int i = 0; i < 5; ++i ) {
700 ASSERT_EQ ( i * 10, loc[i] );
706 ADHERETOLOCCONST (
double, ptr1, loc );
707 for (
int i = 0; i < 5; ++i ) {
708 ASSERT_EQ ( i * 100, loc[i] );
723 ADHERETOLOC (
double, ptr1, loc );
724 for (
int i = 0; i < 5; ++i ) {
731 ADHERETOLOC (
double, ptr2, loc );
732 for (
int i = 0; i < 5; ++i ) {
733 ASSERT_EQ ( i, loc[i] );
739 ADHERETOLOCCONST (
double, ptr1, loc );
740 for (
int i = 0; i < 5; ++i ) {
741 ASSERT_EQ ( i * 10, loc[i] );
747 ADHERETOLOC (
double, ptr1, loc );
748 for (
int i = 0; i < 5; ++i ) {
749 ASSERT_EQ ( i * 10, loc[i] );
755 ADHERETOLOCCONST (
double, ptr2, loc );
756 for (
int i = 0; i < 5; ++i ) {
757 ASSERT_EQ ( i * 100, loc[i] );
772 ADHERETOLOC (
double, ptr1, loc );
773 for (
int i = 0; i < 5; ++i ) {
781 ADHERETOLOC (
double, ptr1, loc1 );
782 ADHERETOLOC (
double, ptr2, loc2 );
783 ADHERETOLOC (
double, ptr3, loc3 );
785 ASSERT_EQ ( loc1, loc2 );
786 ASSERT_EQ ( loc1, loc3 );
800 ASSERT_NO_FATAL_FAILURE (
801 for (
int i = 0; i < 3; ++i ) {
804 for (
int j = 0; j < 5; ++j ) {
810 ASSERT_NO_FATAL_FAILURE (
811 for (
int i = 0; i < 3; ++i ) {
813 const double *loc = glue;
814 for (
int j = 0; j < 5; ++j ) {
815 ASSERT_EQ ( i * 5 + j, loc[j] );
822 ASSERT_NO_FATAL_FAILURE (
825 for (
int i = 0; i < 15; ++i ) {
830 ASSERT_NO_FATAL_FAILURE (
831 for (
int i = 0; i < 3; ++i ) {
833 const double *loc = glue;
834 for (
int j = 0; j < 5; ++j ) {
835 ASSERT_EQ ( i * 5 + j, loc[j] );
842 ASSERT_NO_FATAL_FAILURE (
843 for (
int i = 0; i < 3; ++i ) {
846 for (
int j = 0; j < 5; ++j ) {
847 ASSERT_EQ ( i * 5 + j, loc[j] );
853 ASSERT_NO_FATAL_FAILURE (
854 for (
int i = 0; i < 3; ++i ) {
856 const double *loc = glue;
857 for (
int j = 0; j < 5; ++j ) {
858 ASSERT_EQ ( i * 5 + j + 15, loc[j] );
865 ASSERT_NO_FATAL_FAILURE (
866 for (
int i = 0; i < 3; ++i ) {
868 const double *loc = glue;
869 for (
int j = 0; j < 5; ++j ) {
870 ASSERT_EQ ( i * 5 + j + 15, loc[j] );
877 ASSERT_NO_FATAL_FAILURE (
878 for (
int i = 0; i < 3; ++i ) {
881 for (
int j = 0; j < 5; ++j ) {
882 ASSERT_EQ ( i * 5 + j + 15, loc[j] );
888 ASSERT_NO_FATAL_FAILURE (
889 for (
int i = 0; i < 3; ++i ) {
891 const double *loc = glue;
892 for (
int j = 0; j < 5; ++j ) {
893 ASSERT_EQ ( i * 5 + j + 30, loc[j] );
901 ASSERT_NO_FATAL_FAILURE (
902 for (
int i = 0; i < 3; ++i ) {
904 const double *loc = glue;
905 for (
int j = 0; j < 5; ++j ) {
906 ASSERT_EQ ( i * 5 + j + 30, loc[j] );
922 ASSERT_NO_FATAL_FAILURE (
923 for (
int i = 0; i < 3; ++i ) {
924 for (
int j = 0; j < 5; ++j ) {
927 for (
int k = 0; k < 4; ++k ) {
928 loc[k] = i * 5 * 4 + j * 4 + k;
936 ASSERT_NO_FATAL_FAILURE (
937 for (
int i = 0; i < 3; ++i ) {
938 for (
int j = 0; j < 5; ++j ) {
940 double *loc2 = glue2;
942 double *loc3 = glue3;
944 for (
int k = 0; k < 4; ++k ) {
945 ASSERT_EQ ( i * 5 * 4 + j * 4 + k, loc2[k] );
946 ASSERT_EQ ( i * 5 * 4 + j * 4 + k, loc3[k] );
Exception for errors with the memory.
bool setOutOfSwapIsFatal(bool fatal=true)
set policy what to do when out of memory in both ram and swap
void addTimeMeasurement()
Saves the current timestamp.
Main class to fetch memory that is managed by rambrain for actual usage.
global_bytesize getUsedMemory() const
returns current ram usage
void startNewTimeCycle()
Starts a new cycle of time measurements.
Main class to allocate memory that is managed by the rambrain memory defaultManager.
bool checkCycle()
checks whether the scheduler believes to be sane and prints an error message if not ...
static managedMemory * defaultManager
std::vector< int64_t > getDurationsForCurrentCycle() const
Take the current cycle of time measurements and calculate all durations in betwen.
Helper class to track construction and destruction.
A basic class to be used by tests. Provides helper methods and functionality e.g. time measurements...
TEST(managedPtr, Unit_NoMemoryManager)
bool setPreemptiveUnloading(bool preemptive)
sets whether scheduler should swap out elements without strict need
a dummy managed Memory that basically does nothing and throws on everything.
scheduler working with a double linked cycle. Details see paper.
A dummy swap that just copies swapped out chunks to a different location in ram.
Backend class to handle raw memory and interaction/storage with managedSwap.