/**** Function: r250n Description: returns a random unsigned integer k uniformly distributed in the interval 0 <= k < n ****/ unsigned int r250n(unsigned n) { /*---------------------------------------------------------------------------*/ register int j; register unsigned int new_rand, limit; /*---------------------------------------------------------------------------*/ limit = (65535U / n) * n; do { new_rand = r250(); if (r250_index >= 147) j = r250_index - 147; /* Wrap pointer around */ else j = r250_index + 103; new_rand = r250_buffer[r250_index] ^= r250_buffer[j]; if (r250_index >= 249) /* Increment pointer for next time */ r250_index = 0; else r250_index++; } while (new_rand >= limit); return new_rand % n; }
unsigned int r250n(unsigned n) { register int j; register unsigned int new_rand,limit; limit=(65535U/n)*n; do { (void)r250(); if(r250_index>=147) j=r250_index-147; else j=r250_index+103; new_rand=r250_buffer[r250_index]^=r250_buffer[j]; if(r250_index>=249) r250_index=0; else r250_index++; } while(new_rand>=limit); return new_rand % n; }
int main(int argc, char** argv) { unsigned int* __restrict address; unsigned int* __restrict memory; unsigned int i, j; unsigned int t=0; unsigned int numberOfMemoryLocation; dictionary *programInput; double startTime; double elapsedTime = 0, totalElapsedTime = 0; double initializationTime, experimentTime; programInput = ParseInput(argc, argv); ValidateParameters(); // Initialize memory manager MMMasterInitialize(0, 0, FALSE, NULL); numberOfMemoryLocation = MemorySize / sizeof(int); // Allocate memory address = MMUnitAllocate((NumberOfAccess + 8) * sizeof(unsigned int)); memory = MMUnitAllocate((numberOfMemoryLocation + 32) * sizeof(unsigned int)); // Set random seed r250_init(getRandomSeed()); // Set start time startTime = setStartTime(); printf("Initialize memory pointers with random values.."); for (i=0; i<numberOfMemoryLocation + 32; i++) { memory[i] = r250(); } // Initialize address and memory for (i=0; i<NumberOfAccess + 8; i++) { address[i] = (r250() % numberOfMemoryLocation) / 4 * 4; } printf("finished.\n"); elapsedTime = getElapsedTime(startTime) - totalElapsedTime; totalElapsedTime += elapsedTime; initializationTime = elapsedTime; // Test memory speed for read if (ReadWrite[0] == 'R' || ReadWrite[0] == 'r') { for (i=0; i<NumberOfIteration; i++) { for (j=0; j<NumberOfAccess; j++) { t += memory[address[j]]; } } } // Test memory speed for write if (ReadWrite[0] == 'W' || ReadWrite[0] == 'w') { for (i=0; i<NumberOfIteration; i++) { for (j=0; j<NumberOfAccess; j++) { memory[address[j]] += address[j]; } } } elapsedTime = getElapsedTime(startTime) - totalElapsedTime; totalElapsedTime += elapsedTime; experimentTime = elapsedTime; // So that compiler does not remove code for variables t and r if (t==0) { printf("\n"); } printf("Experiment completed.\n"); printf("Initialization time = "); printElapsedTime(stdout, FALSE, FALSE, TRUE, 2, initializationTime); printf("Experiment time = "); printElapsedTime(stdout, FALSE, FALSE, TRUE, 2, experimentTime); MMUnitFree(address, (NumberOfAccess + 8) * sizeof(unsigned int)); MMUnitFree(memory, (numberOfMemoryLocation + 32) * sizeof(unsigned int)); iniparser_freedict(programInput); return 0; }