From a0e5e297d6f34284bcd7c5f366205e6fc9bb6b55 Mon Sep 17 00:00:00 2001 From: "Julian M. Kunkel" Date: Fri, 6 Nov 2020 09:52:35 +0000 Subject: [PATCH] Create random for one block (1 segment) only to be repeated. --- src/ior-internal.h | 3 +- src/ior.c | 96 +++++++++++++++++++++++----------------------- src/utilities.c | 21 ---------- src/utilities.h | 1 - 4 files changed, 50 insertions(+), 71 deletions(-) diff --git a/src/ior-internal.h b/src/ior-internal.h index fa7212e..640640d 100644 --- a/src/ior-internal.h +++ b/src/ior-internal.h @@ -25,8 +25,7 @@ void PrintTestEnds(); void PrintTableHeader(); /* End of ior-output */ -IOR_offset_t *GetOffsetArraySequential(IOR_param_t * test, int pretendRank); -IOR_offset_t *GetOffsetArrayRandom(IOR_param_t * test, int pretendRank, int access); +IOR_offset_t *GetOffsetArrayRandom(IOR_param_t * test, int pretendRank); struct results { double min; diff --git a/src/ior.c b/src/ior.c index 52630aa..93c461d 100755 --- a/src/ior.c +++ b/src/ior.c @@ -1025,9 +1025,6 @@ static void InitTests(IOR_test_t *tests, MPI_Comm com) } init_clock(); - - /* seed random number generator */ - SeedRandGen(mpi_comm_world); } /* @@ -1645,11 +1642,10 @@ static void ValidateTests(IOR_param_t * test) } /** - * Returns a precomputed array of IOR_offset_t for the inner benchmark loop. - * They get created sequentially and mixed up in the end. The last array element - * is set to -1 as end marker. - * It should be noted that as the seeds get synchronised across all processes - * every process computes the same random order if used with filePerProc. + * Returns a precomputed array of IOR_offset_t for the inner benchmark loop terminated by offset -1. + * They get created sequentially and mixed up in the end. + * It should be noted that as the seeds get synchronised across all processes if not FilePerProcess is set + * every process computes the same random order. * For a shared file all transfers get randomly assigned to ranks. The processes * can also have differen't numbers of transfers. This might lead to a bigger * diversion in accesse as it dose with filePerProc. This is expected but @@ -1657,73 +1653,79 @@ static void ValidateTests(IOR_param_t * test) * @param test IOR_param_t for getting transferSize, blocksize and SegmentCount * @param pretendRank int pretended Rank for shifting the offsets correctly * @return IOR_offset_t - * @return */ -IOR_offset_t *GetOffsetArrayRandom(IOR_param_t * test, int pretendRank, int access) +IOR_offset_t *GetOffsetArrayRandom(IOR_param_t * test, int pretendRank) { int seed; - IOR_offset_t i, value, tmp; - IOR_offset_t offsets = 0; + IOR_offset_t i; + IOR_offset_t offsets; IOR_offset_t offsetCnt = 0; - IOR_offset_t fileSize; IOR_offset_t *offsetArray; - /* set up seed, each process can determine which regions to access individually */ - if (test->randomSeed == -1) { - test->randomSeed = seed = rand(); - } else { - seed = test->randomSeed + pretendRank; - } - srand(seed); - - fileSize = test->blockSize * test->segmentCount; - if (test->filePerProc == FALSE) { - fileSize *= test->numTasks; + if (test->filePerProc) { + /* set up seed, each process can determine which regions to access individually */ + if (test->randomSeed == -1) { + seed = time(NULL); + test->randomSeed = seed; + } else { + seed = test->randomSeed + pretendRank; + } + }else{ + /* Shared file requires that the seed is synchronized */ + if (test->randomSeed == -1) { + // all processes need to have the same seed. + if(rank == 0){ + seed = time(NULL); + } + MPI_CHECK(MPI_Bcast(& seed, 1, MPI_INT, 0, test->testComm), "cannot broadcast random seed value"); + test->randomSeed = seed; + }else{ + seed = test->randomSeed; + } } + srandom(seed); /* count needed offsets (pass 1) */ if (test->filePerProc == FALSE) { - for (i = 0; i < fileSize; i += test->transferSize) { - // this counts which process get how many transferes in - // a shared file - if ((rand() % test->numTasks) == pretendRank) { - offsets++; - } + offsets = 0; + for (i = 0; i < test->blockSize; i += test->transferSize) { + // this counts which process get how many transferes in the shared file + if ((rand() % test->numTasks) == pretendRank) { + offsets++; + } } } else { - offsets += fileSize / test->transferSize; + offsets = test->blockSize / test->transferSize; } /* setup empty array */ - offsetArray = - (IOR_offset_t *) malloc((offsets + 1) * sizeof(IOR_offset_t)); - if (offsetArray == NULL) - ERR("malloc() failed"); + offsetArray = (IOR_offset_t *) safeMalloc((offsets + 1) * sizeof(IOR_offset_t)); + offsetArray[offsets] = -1; /* set last offset with -1 */ if (test->filePerProc) { - /* fill array */ - for (i = 0; i < offsets; i++) { - offsetArray[i] = i * test->transferSize; - } + /* fill array */ + for (i = 0; i < offsets; i++) { + offsetArray[i] = i * test->transferSize; + } } else { - /* fill with offsets (pass 2) */ - srand(seed); /* need same seedto get same transfers as counted in the beginning*/ - for (i = 0; i < fileSize; i += test->transferSize) { - if ((rand() % test->numTasks) == pretendRank) { - offsetArray[offsetCnt] = i; - offsetCnt++; - } + /* fill with offsets (pass 2) */ + srandom(seed); /* need same seed to get same transfers as counted in the beginning*/ + for (i = 0; i < test->blockSize; i += test->transferSize) { + if ((rand() % test->numTasks) == pretendRank) { + offsetArray[offsetCnt] = i; + offsetCnt++; } + } } /* reorder array */ for (i = 0; i < offsets; i++) { + IOR_offset_t value, tmp; value = rand() % offsets; tmp = offsetArray[value]; offsetArray[value] = offsetArray[i]; offsetArray[i] = tmp; } - SeedRandGen(test->testComm); /* synchronize seeds across tasks */ return (offsetArray); } diff --git a/src/utilities.c b/src/utilities.c index 36db9c9..cc28c93 100755 --- a/src/utilities.c +++ b/src/utilities.c @@ -654,27 +654,6 @@ int Regex(char *string, char *pattern) return (retValue); } -/* - * Seed random generator. - */ -void SeedRandGen(MPI_Comm testComm) -{ - unsigned int randomSeed; - - if (rank == 0) { -#ifdef _WIN32 - rand_s(&randomSeed); -#else - struct timeval randGenTimer; - gettimeofday(&randGenTimer, (struct timezone *)NULL); - randomSeed = randGenTimer.tv_usec; -#endif - } - MPI_CHECK(MPI_Bcast(&randomSeed, 1, MPI_INT, 0, - testComm), "cannot broadcast random seed value"); - srandom(randomSeed); -} - /* * System info for Windows. */ diff --git a/src/utilities.h b/src/utilities.h index 020f27b..5a7d67d 100755 --- a/src/utilities.h +++ b/src/utilities.h @@ -46,7 +46,6 @@ char *CurrentTimeString(void); int Regex(char *, char *); void ShowFileSystemSize(IOR_param_t * test); void DumpBuffer(void *, size_t); -void SeedRandGen(MPI_Comm); void SetHints (MPI_Info *, char *); void ShowHints (MPI_Info *); char *HumanReadable(IOR_offset_t value, int base);