28 #include <gtest/gtest.h>
41 const unsigned int dblamount = 1024;
42 const unsigned int dblsize = dblamount *
sizeof ( double );
43 const unsigned int swapmem = dblsize * 10;
54 for (
int n = 0; n < 100; ++n ) {
56 double *loc = locGlue;
64 for (
int m = 0; m < 1000; ++m ) {
65 for (
int n = 0; n < 100; ++n ) {
67 const double *loc = locGlue;
68 EXPECT_EQ ( n, *loc );
73 for (
int m = 0; m < 1000; ++m ) {
74 for (
int n = 0; n < 100; ++n ) {
76 double *loc = locGlue;
77 EXPECT_EQ ( n, *loc );
83 infomsgf (
"Const access ran for %ld ms", durations[0] );
84 infomsgf (
"Non-Const access ran for %ld ms", durations[1] );
85 infomsgf (
"Non-Const access cost %g as much time as const access", 1.0 * durations[1] / durations[0] );
86 EXPECT_TRUE ( durations[1] > durations[0] );
94 const unsigned int dblamount = 100;
95 const unsigned int dblsize = dblamount *
sizeof ( double );
96 const unsigned int swapmem = dblsize * 10;
104 #ifdef PARENTAL_CONTROL
110 chunk->
locPtr = malloc ( dblsize );
111 chunk->
size = dblsize;
114 EXPECT_TRUE ( swap.
swapOut ( chunk ) );
120 EXPECT_TRUE ( swap.
swapIn ( chunk ) ) ;
135 const unsigned int dblamount = 100;
136 const unsigned int dblsize = dblamount *
sizeof ( double );
137 const unsigned int swapmem = dblsize * 10;
149 for (
int i = 0; i < 2; ++i ) {
150 #ifdef PARENTAL_CONTROL
157 chunks[i]->
locPtr = malloc ( dblsize );
158 chunks[i]->
size = dblsize;
165 swap.
swapIn ( chunks, 2 );
170 for (
int i = 0; i < 2; ++i ) {
172 free ( chunks[i]->swapBuf );
174 free ( chunks[i]->locPtr );
186 const unsigned int dblamount = 100;
187 const unsigned int dblsize = dblamount *
sizeof ( double );
188 const unsigned int swapmem = dblsize * 10;
198 #ifdef PARENTAL_CONTROL
204 chunk->
locPtr = malloc ( dblsize );
205 chunk->
size = dblsize;
227 const unsigned int memsize = 15 *
sizeof ( double );
228 const unsigned int swapsize = 10 * memsize;
244 const unsigned int dblamount = 100;
245 const unsigned int dblsize = dblamount *
sizeof ( double );
246 const unsigned int swapmem = dblsize * 10;
247 const unsigned int memsize = dblsize * 1.5;
313 for (
unsigned int n = 0; n < obj_no; ++n ) {
316 for (
unsigned int n = 0; n < 10 * obj_no; ++n ) {
319 if ( objmask[no] == NULL ) {
324 double *darr = objoloc;
331 double *darr = objoloc;
332 ASSERT_EQ ( no, darr[0] );
339 for (
unsigned int n = 0; n < obj_no; ++n ) {
340 if ( objmask[n] != NULL ) {
374 for (
unsigned int n = 0; n < obj_no; ++n ) {
377 for (
unsigned int n = 0; n < 10 * obj_no; ++n ) {
381 if ( objmask[no] == NULL ) {
383 unsigned int varsize = ( test.
random() + 0.5 ) * 102400;
384 if ( ( varsize + 102400 * 2. ) *
sizeof ( double ) > swap.
getFreeSwap() ) {
390 double *darr = objoloc;
391 for (
unsigned int k = 0; k < varsize; k++ ) {
392 darr[k] = k + varsize;
399 double *darr = objoloc;
400 for (
int k = 0; k < darr[0]; k++ ) {
401 ASSERT_EQ ( k + darr[0], darr[k] );
409 for (
unsigned int n = 0; n < obj_no; ++n ) {
410 if ( objmask[n] != NULL ) {
427 unsigned int oneswap = 1024 * 1024 * 16;
428 unsigned int totalswap = 16 * oneswap;
429 managedFileSwap swap ( totalswap,
"/tmp/rambrainswap-%d-%d", oneswap );
431 snprintf ( firstname, 70,
"/tmp/rambrainswap-%d-%d", getpid(), 0 );
433 for (
int n = 0; n < 16; n++ ) {
435 snprintf ( fname, 70,
"/tmp/rambrainswap-%d-%d", getpid(), n );
437 stat ( fname, &mstat );
438 ASSERT_TRUE ( S_ISREG ( mstat.st_mode ) );
439 ASSERT_EQ ( 0, mstat.st_size );
442 ASSERT_EQ ( 16u, swap.
all_space.size() );
446 manager.setPreemptiveUnloading (
false );
449 for (
int n = 0; n < 16; n++ ) {
451 snprintf ( fname, 70,
"/tmp/rambrainswap-%d-%d", getpid(), n );
453 stat ( fname, &mstat );
454 ASSERT_TRUE ( S_ISREG ( mstat.st_mode ) );
455 ASSERT_EQ ( 0, mstat.st_size );
460 stat ( firstname, &first );
461 ASSERT_TRUE ( S_ISREG ( first.st_mode ) );
462 ASSERT_EQ ( ( (
unsigned int ) ( ( 1024 * 1024 * 16 ) * swap.
swapFileResizeFrac ) ), first.st_size );
463 for (
int n = 1; n < 16; n++ ) {
465 snprintf ( fname, 70,
"/tmp/rambrainswap-%d-%d", getpid(), n );
467 stat ( fname, &mstat );
468 ASSERT_TRUE ( S_ISREG ( mstat.st_mode ) );
469 ASSERT_EQ ( 0, mstat.st_size );
473 ASSERT_EQ ( 8 * 1024u * 2, manager.getSwappedMemory() );
474 stat ( firstname, &first );
475 ASSERT_TRUE ( S_ISREG ( first.st_mode ) );
476 ASSERT_EQ ( ( (
unsigned int ) ( ( 1024 * 1024 * 16 ) * swap.
swapFileResizeFrac ) ), first.st_size );
477 for (
int n = 1; n < 16; n++ ) {
479 snprintf ( fname, 70,
"/tmp/rambrainswap-%d-%d", getpid(), n );
481 stat ( fname, &mstat );
482 ASSERT_TRUE ( S_ISREG ( mstat.st_mode ) );
483 ASSERT_EQ ( 0, mstat.st_size );
490 ASSERT_EQ ( 0, manager.getSwappedMemory() );
498 const unsigned int tenkbdoublearrsize = 1024 / 8 * 10;
499 const unsigned int doublearrsize = tenkbdoublearrsize *
sizeof ( double );
501 for (
unsigned int n = 0; n < 1639; n++ ) {
503 ASSERT_TRUE ( manager.checkCycle() );
505 ASSERT_EQ ( doublearrsize, manager.getUsedMemory() );
506 ASSERT_EQ ( doublearrsize * 1638, manager.getSwappedMemory() );
507 for (
unsigned int n = 1; n < 1639; n++ ) {
510 ASSERT_EQ ( 0, manager.getUsedMemory() );
511 ASSERT_EQ ( doublearrsize, manager.getSwappedMemory() );
515 for (
unsigned int n = 0; n < 1641; n++ ) {
518 ASSERT_EQ ( doublearrsize, manager.getUsedMemory() );
519 ASSERT_EQ ( doublearrsize * 1640, manager.getSwappedMemory() );
520 for (
unsigned int n = 0; n < 1641; n++ ) {
523 ASSERT_EQ ( 0, manager.getUsedMemory() );
524 ASSERT_EQ ( 0, manager.getSwappedMemory() );
529 manager.printSwapstats();
536 const unsigned int oneswap =
mib;
537 const unsigned int dblamount = 10;
538 const unsigned int arrsize = dblamount *
sizeof ( double );
553 ADHERETOLOCCONST (
double, ptr1, locptr1 );
569 const unsigned int oneswap =
mib;
570 const unsigned int dblamount = oneswap /
sizeof ( double );
571 const unsigned int smalldblamount = dblamount * .2;
572 const unsigned int bigdblamount = dblamount - smalldblamount;
581 ASSERT_EQ ( ( bigdblamount ) *
sizeof (
double ), manager.
getUsedMemory() );
585 ASSERT_EQ ( ( bigdblamount ) *
sizeof (
double ), manager.
getUsedMemory() );
586 ASSERT_EQ ( ( bigdblamount ) *
sizeof (
double ), manager.
getSwappedMemory() );
590 ASSERT_EQ ( ( smalldblamount + bigdblamount ) *
sizeof (
double ), manager.
getUsedMemory() );
591 ASSERT_EQ ( ( bigdblamount ) *
sizeof (
double ), manager.
getSwappedMemory() );
597 ASSERT_EQ ( ( smalldblamount + bigdblamount ) *
sizeof (
double ), manager.
getUsedMemory() );
598 ASSERT_EQ ( ( smalldblamount + bigdblamount ) *
sizeof (
double ), manager.
getSwappedMemory() );
613 const unsigned int oneswap =
mib;
614 const unsigned int dblamount = oneswap /
sizeof ( double );
615 const unsigned int smalldblamount = dblamount * .1;
616 const unsigned int bigdblamount = dblamount - 2 * smalldblamount;
626 ASSERT_EQ ( ( bigdblamount ) *
sizeof (
double ), manager.
getUsedMemory() );
631 ASSERT_EQ ( ( bigdblamount + smalldblamount ) *
sizeof (
double ), manager.
getUsedMemory() );
636 ASSERT_EQ ( ( bigdblamount + smalldblamount ) *
sizeof (
double ), manager.
getUsedMemory() );
637 ASSERT_EQ ( ( bigdblamount ) *
sizeof (
double ), manager.
getSwappedMemory() );
641 ASSERT_EQ ( ( bigdblamount + 2 * smalldblamount ) *
sizeof (
double ), manager.
getUsedMemory() );
642 ASSERT_EQ ( ( bigdblamount ) *
sizeof (
double ), manager.
getSwappedMemory() );
646 ASSERT_EQ ( ( bigdblamount + 2 * smalldblamount ) *
sizeof (
double ), manager.
getUsedMemory() );
647 ASSERT_EQ ( ( bigdblamount + 2 * smalldblamount ) *
sizeof (
double ), manager.
getSwappedMemory() );
662 const unsigned int size = 1000;
663 const unsigned int memlines = 10;
664 const unsigned int mem = size *
sizeof ( double ) * memlines;
665 const unsigned int swapmem = size * size *
sizeof ( double ) * 2;
672 for (
unsigned int i = 0; i < size; ++i ) {
675 double *rowdbl = rowloc;
676 for (
unsigned int j = 0; j < size; ++j ) {
677 rowdbl[j] = i * size + j;
682 for (
unsigned int i = 0; i < size; ++i ) {
684 double *rowdbl1 = rowloc1;
685 for (
unsigned int j = i + 1; j < size; ++j ) {
687 double *rowdbl2 = rowloc2;
689 double buffer = rowdbl1[j];
690 rowdbl1[j] = rowdbl2[i];
696 for (
unsigned int i = 0; i < size; ++i ) {
698 const double *rowdbl = rowloc;
699 for (
unsigned int j = 0; j < size; ++j ) {
700 ASSERT_EQ ( j * size + i, rowdbl[j] );
705 for (
unsigned int i = 0; i < size; ++i ) {
713 const unsigned int size =
mib;
714 const unsigned int swapmem = 1 *
mib;
732 ADHERETOLOC (
char, e1, data );
737 ADHERETOLOC (
char, e2, data );
743 ADHERETOLOC (
char, e2, data );
744 EXPECT_EQ ( 0x13, data[42] ) ;
747 ADHERETOLOC (
char, e1, data );
748 EXPECT_EQ ( 0x42, data[1337] ) ;
757 const unsigned int amount = 1E3;
758 const unsigned int countMem = 10;
759 const unsigned int countSwap = 100;
760 const unsigned int count = countMem + countSwap;
762 const global_bytesize swapmem = amount * countSwap *
sizeof ( double );
767 manager.setPreemptiveUnloading (
false );
768 manager.setPreemptiveLoading (
false );
770 EXPECT_EQ ( 0, manager.n_swap_out );
771 EXPECT_EQ ( 0, manager.n_swap_in );
772 EXPECT_EQ ( 0, manager.swap_out_scheduled_bytes );
773 EXPECT_EQ ( 0, manager.swap_in_scheduled_bytes );
774 EXPECT_EQ ( 0, manager.swap_out_bytes );
775 EXPECT_EQ ( 0, manager.swap_in_bytes );
776 EXPECT_EQ ( 0, manager.swap_out_bytes_last );
777 EXPECT_EQ ( 0, manager.swap_in_bytes_last );
780 for (
unsigned int i = 0; i < countMem; ++i ) {
783 ADHERETOLOC (
double, dat, loc );
784 for (
unsigned int j = 0; j < amount; ++j ) {
785 loc[j] = i * amount + j;
790 swap.waitForCleanExit();
792 EXPECT_EQ ( 0, manager.n_swap_out );
793 EXPECT_EQ ( 0, manager.n_swap_in );
794 EXPECT_EQ ( 0, manager.swap_out_scheduled_bytes );
795 EXPECT_EQ ( 0, manager.swap_in_scheduled_bytes );
796 EXPECT_EQ ( 0, manager.swap_out_bytes );
797 EXPECT_EQ ( 0, manager.swap_in_bytes );
798 EXPECT_EQ ( 0, manager.swap_out_bytes_last );
799 EXPECT_EQ ( 0, manager.swap_in_bytes_last );
801 for (
unsigned int i = countMem; i < count; ++i ) {
804 ADHERETOLOC (
double, dat, loc );
805 for (
unsigned int j = 0; j < amount; ++j ) {
806 loc[j] = i * amount + j;
810 swap.waitForCleanExit();
812 EXPECT_GE ( countSwap, manager.n_swap_out );
813 EXPECT_EQ ( 0, manager.n_swap_in );
814 EXPECT_EQ ( amount * countSwap *
sizeof (
double ), manager.swap_out_scheduled_bytes );
815 EXPECT_EQ ( 0, manager.swap_in_scheduled_bytes );
816 EXPECT_EQ ( amount * countSwap *
sizeof (
double ), manager.swap_out_bytes );
817 EXPECT_EQ ( 0, manager.swap_in_bytes );
820 for (
unsigned int i = 0; i < count; ++i ) {
822 ADHERETOLOC (
double, dat, loc );
823 for (
unsigned int j = 0; j < amount; ++j ) {
828 swap.waitForCleanExit();
830 EXPECT_GE ( countSwap + count, manager.n_swap_out );
831 EXPECT_GE ( count, manager.n_swap_in );
832 EXPECT_EQ ( amount * ( countSwap + count ) *
sizeof (
double ), manager.swap_out_scheduled_bytes );
833 EXPECT_EQ ( amount * count *
sizeof (
double ), manager.swap_in_scheduled_bytes );
834 EXPECT_EQ ( amount * ( countSwap + count ) *
sizeof (
double ), manager.swap_out_bytes );
835 EXPECT_EQ ( amount * count *
sizeof (
double ), manager.swap_in_bytes );
841 for (
unsigned int i = 0; i < count; ++i ) {
843 ADHERETOLOC (
double, dat, loc );
844 for (
unsigned int j = 0; j < amount; ++j ) {
849 swap.waitForCleanExit();
852 EXPECT_LE ( manager.swap_out_bytes, manager.swap_out_scheduled_bytes );
853 EXPECT_LE ( manager.swap_in_bytes , manager.swap_in_scheduled_bytes );
855 for (
unsigned int i = 0; i < count; ++i ) {
867 managedFileSwap swap (
sizeof (
double ) * 100,
"./rambrainswap-%d-%d" );
872 ADHERETOLOC (
double, ptr1, loc );
873 for (
int i = 0; i < 10; ++i ) {
878 ASSERT_NO_FATAL_FAILURE (
884 ADHERETOLOC (
double, ptr1, loc );
885 for (
int i = 0; i < 10; ++i ) {
886 ASSERT_EQ ( i, loc[i] );
897 managedFileSwap swap (
sizeof (
double ) * 100,
"./rambrainswap-%d-%d" );
902 ADHERETOLOC (
double, ptr1, loc );
903 for (
int i = 0; i < 10; ++i ) {
908 ASSERT_NO_FATAL_FAILURE (
913 ADHERETOLOC (
double, ptr1, loc );
914 for (
int i = 0; i < 10; ++i ) {
915 ASSERT_EQ ( i, loc[i] );
Exception for errors with the memory.
global_bytesize getSwappedMemory() const
returns current swap usage
void addTimeMeasurement()
Saves the current timestamp.
void * locPtr
pointer to the actual data in RAM
Main class to fetch memory that is managed by rambrain for actual usage.
global_bytesize getUsedMemory() const
returns current ram usage
virtual global_bytesize getUsedSwap() const
Simple getter.
void setSeed(unsigned int seed=time(NULL))
Set a new seed for random number generation.
int random(int max) const
Get a random number (integer)
void startNewTimeCycle()
Starts a new cycle of time measurements.
Main class to allocate memory that is managed by the rambrain memory defaultManager.
virtual global_bytesize getSwapSize() const
Simple getter.
bool checkCycle()
checks whether the scheduler believes to be sane and prints an error message if not ...
virtual swapPolicy getSwapPolicy() const
An implementation of managedSwap that is capable of kernel asynchronousIO.
std::vector< int64_t > getDurationsForCurrentCycle() const
Take the current cycle of time measurements and calculate all durations in betwen.
virtual global_bytesize getFreeSwap() const
Simple getter.
const global_bytesize gig
static pthread_mutex_t stateChangeMutex
A basic class to be used by tests. Provides helper methods and functionality e.g. time measurements...
manages all managed Chunks of raw memory
void waitForCleanExit()
Function waits for all asynchronous IO to complete. The wait is implemented non-performant as a norma...
void printSwapstats() const
print statistic about the number, size and efficiency of swapping actions
bool setPreemptiveUnloading(bool preemptive)
sets whether scheduler should swap out elements without strict need
virtual global_bytesize swapOut(managedMemoryChunk **chunklist, unsigned int nchunks)
Trigger swap out of the chunks pointed to by chunklist.
scheduler working with a double linked cycle. Details see paper.
virtual swapPolicy setSwapPolicy(swapPolicy newPolicy)
std::map< global_offset, pageFileLocation * > free_space
global_bytesize size
Size of actual object in bytes.
virtual void swapDelete(managedMemoryChunk *chunk)
Mark chunk as deleted.
A dummy swap that just copies swapped out chunks to a different location in ram.
TEST(managedFileSwap, Unit_LazyPffree)
std::map< global_offset, pageFileLocation * > all_space
Backend class to handle raw memory and interaction/storage with managedSwap.
const global_bytesize mib
virtual global_bytesize swapIn(managedMemoryChunk **chunklist, unsigned int nchunks)
Trigger swap in of the chunks pointed to by chunklist.