24 #if defined(HAVE_STRINGS_H) 32 # include <sys/time.h> 33 # include <sys/utsname.h> 37 #include <cuda_runtime.h> 101 MPI_Group orig_group, new_group;
105 "MPI_Comm_group() error");
109 MPI_CHECK(MPI_Group_range_incl(orig_group, 1, &range, &new_group),
110 "MPI_Group_range_incl() error");
112 "MPI_Comm_create() error");
113 MPI_CHECK(MPI_Group_free(&orig_group),
"MPI_Group_Free() error");
114 MPI_CHECK(MPI_Group_free(&new_group),
"MPI_Group_Free() error");
117 if (params->
testComm == MPI_COMM_NULL) {
161 MPI_CHECK(MPI_Comm_rank(world_com, &
rank),
"cannot get rank");
170 for (tptr = tests_head; tptr !=
NULL; tptr = tptr->
next) {
172 if( ! participate )
continue;
203 MPI_CHECK(MPI_Init(&argc, &argv),
"cannot initialize MPI");
205 MPI_CHECK(MPI_Comm_rank(MPI_COMM_WORLD, &
rank),
"cannot get rank");
217 for (tptr = tests_head; tptr !=
NULL; tptr = tptr->
next) {
219 if( ! participate )
continue;
242 MPI_CHECK(MPI_Finalize(),
"cannot finalize MPI");
257 assert (
NULL != default_aiori);
260 p->
api = strdup(default_aiori);
261 p->
platform = strdup(
"HOST(OSTYPE)");
296 char *timeString,
int access,
int outlierThreshold)
305 (&timerVal, &sum, 1, MPI_DOUBLE, MPI_SUM,
testComm),
308 sqrDiff = pow((mean - timerVal), 2);
310 (&sqrDiff, &var, 1, MPI_DOUBLE, MPI_SUM,
testComm),
315 if (access ==
WRITE) {
316 strcpy(accessString,
"write");
318 strcpy(accessString,
"read");
320 if (fabs(timerVal - mean) > (
double)outlierThreshold) {
322 int ret = gethostname(hostname,
MAX_STR);
324 strcpy(hostname,
"unknown");
326 WARNF(
"for %s, task %d, %s %s is %f (mean=%f, stddev=%f)\n",
327 hostname,
rank, accessString, timeString, timerVal, mean, sd);
344 "elapsed transfer time", access,
365 IOR_offset_t aggFileSizeFromStat, tmpMin, tmpMax, tmpSum;
369 MPI_CHECK(MPI_Allreduce(&aggFileSizeFromStat, &tmpSum, 1,
370 MPI_LONG_LONG_INT, MPI_SUM,
testComm),
371 "cannot reduce total data moved");
372 aggFileSizeFromStat = tmpSum;
374 MPI_CHECK(MPI_Allreduce(&aggFileSizeFromStat, &tmpMin, 1,
375 MPI_LONG_LONG_INT, MPI_MIN,
testComm),
376 "cannot reduce total data moved");
377 MPI_CHECK(MPI_Allreduce(&aggFileSizeFromStat, &tmpMax, 1,
378 MPI_LONG_LONG_INT, MPI_MAX,
testComm),
379 "cannot reduce total data moved");
380 if (tmpMin != tmpMax) {
382 WARN(
"inconsistent file size by different tasks");
385 aggFileSizeFromStat = tmpMin;
391 1, MPI_LONG_LONG_INT, MPI_SUM,
testComm),
392 "cannot total data moved");
394 if (strcasecmp(params->
api,
"HDF5") != 0 && strcasecmp(params->
api,
"NCMPI") != 0) {
404 WARN(
"Maybe caused by deadlineForStonewalling");
432 MPI_CHECK(MPI_Reduce(&errors, &allErrors, 1, MPI_INT, MPI_SUM,
433 0,
testComm),
"cannot reduce errors");
435 "cannot broadcast allErrors value");
436 if (allErrors != 0) {
440 if (
rank == 0 && allErrors != 0) {
442 WARN(
"overflow in errors counted");
445 WARNF(
"Incorrect data on %s (%d errors found).\n",
446 access ==
WRITECHECK ?
"write" :
"read", allErrors);
448 "Used Time Stamp %u (0x%x) for Data Signature\n",
483 ERR(
"malloc() of IOR_test_t failed");
484 newTest->
params = *init_params;
503 for (tptr = tests_head; tptr !=
NULL; tptr = next) {
515 int hintCount = 0, i;
519 if (strncmp(
environ[i],
"IOR_HINT", strlen(
"IOR_HINT"))
523 WARN(
"exceeded max hints; reset MAX_HINTS and recompile");
528 strncpy(hint[hintCount - 1],
environ[i],
534 MPI_CHECK(MPI_Bcast(&hintCount,
sizeof(hintCount), MPI_BYTE, 0, com),
"cannot broadcast hints");
535 for (i = 0; i < hintCount; i++) {
537 "cannot broadcast hints");
538 strcpy(fullHint, hint[i]);
539 strcpy(hintVariable, strtok(fullHint,
"="));
540 if (getenv(hintVariable) ==
NULL) {
542 if (putenv(hint[i]) != 0)
543 WARN(
"cannot set environment variable");
557 if (uname(&name) != 0) {
558 WARN(
"cannot get platform name");
559 sprintf(sysName,
"%s",
"Unknown");
560 sprintf(nodeName,
"%s",
"Unknown");
562 sprintf(sysName,
"%s", name.sysname);
563 sprintf(nodeName,
"%s", name.nodename);
567 if (strlen(nodeName) == 0) {
571 p = start + strlen(nodeName) - 1;
578 if (*p < '0' || *p >
'9') {
586 sprintf(platformName,
"%s(%s)", nodeName, sysName);
587 return strdup(platformName);
597 char **fileNames, *tmp, *token;
610 while (*tmp !=
'\0') {
617 fileNames = (
char **)malloc((*count) *
sizeof(
char **));
618 if (fileNames ==
NULL)
619 ERR(
"out of memory");
622 token = strtok(name, delimiterString);
623 while (token !=
NULL) {
624 fileNames[i] = token;
625 token = strtok(
NULL, delimiterString);
640 char testFileNameRoot[
MAX_STR];
649 sprintf(tmpString,
"%s%d/%s",initialTestFileName, socket,
"data");
650 strcpy(initialTestFileName, tmpString);
654 ERR(
"cannot use multiple file names with unique directories");
656 strcpy(testFileNameRoot,
660 strcpy(testFileNameRoot, fileNames[0]);
670 strcpy(testFileNameRoot,
673 sprintf(testFileName,
"%s.%08d", testFileNameRoot,
676 strcpy(testFileName, testFileNameRoot);
682 strcat(testFileName, tmpString);
697 dir = (
char *)malloc(
MAX_STR + 1);
699 ERR(
"out of memory");
702 strcpy(dir, rootDir);
705 if (dir[i] ==
'\0' || dir[i] ==
'/') {
714 fname = rootDir + i + 1;
722 ERRF(
"cannot create directory: %s", dir);
729 ERRF(
"invalid directory permissions: %s", dir);
748 double totalTime, accessTime;
750 double bw, iops, latency, minlatency;
754 assert(access ==
WRITE || access ==
READ);
759 op = i % 2 ? MPI_MAX : MPI_MIN;
760 MPI_CHECK(MPI_Reduce(&timer[i], &reduced[i], 1, MPI_DOUBLE,
765 for (i = 0; i < IOR_NB_TIMERS / 2; i++)
766 diff[i] = reduced[2 * i + 1] - reduced[2 * i];
774 point->
time = totalTime;
791 MPI_CHECK(MPI_Reduce(&latency, &minlatency, 1, MPI_DOUBLE,
792 MPI_MIN, 0,
testComm),
"MPI_Reduce()");
807 int tmpRankOffset = 0;
849 int mpiNumTasksOnNode0 = 0;
870 while (tests !=
NULL) {
880 }
else if (params->
numTasks > mpiNumTasks) {
882 WARNF(
"More tasks requested (%d) than available (%d),",
884 WARNF(
" running with %d tasks.\n", mpiNumTasks);
935 page_size = sysconf(_SC_PAGESIZE);
937 buf = (
char *)malloc(size);
941 for (ptr = buf; ptr < buf+size; ptr += page_size) {
950 int *rankoffs =
NULL;
951 int *filecont =
NULL;
952 int *filehits =
NULL;
957 rankoffs = (
int *)malloc(params->
numTasks *
sizeof(
int));
958 filecont = (
int *)malloc(params->
numTasks *
sizeof(
int));
959 filehits = (
int *)malloc(params->
numTasks *
sizeof(
int));
969 memset((
void *)filecont, 0, params->
numTasks *
sizeof(
int));
970 for (ifile = 0; ifile < params->
numTasks; ifile++) {
971 filecont[(ifile + rankoffs[ifile]) % params->
numTasks]++;
973 memset((
void *)filehits, 0, params->
numTasks *
sizeof(
int));
974 for (ifile = 0; ifile < params->
numTasks; ifile++)
975 for (jfile = 0; jfile < params->
numTasks; jfile++) {
976 if (ifile == filecont[jfile])
984 jfile += filehits[ifile], ifile++;
1017 fprintf(
out_logfile,
"This node hogging %ld bytes of memory\n",
1025 fprintf(
out_logfile,
"This task hogging %ld bytes of memory\n", size);
1029 ERR(
"malloc of simulated applciation buffer failed");
1044 if (access ==
WRITE) {
1047 strcpy(timerName,
"write open start");
1050 strcpy(timerName,
"write open stop");
1053 strcpy(timerName,
"write start");
1056 strcpy(timerName,
"write stop");
1059 strcpy(timerName,
"write close start");
1062 strcpy(timerName,
"write close stop");
1065 strcpy(timerName,
"invalid timer");
1072 strcpy(timerName,
"read open start");
1075 strcpy(timerName,
"read open stop");
1078 strcpy(timerName,
"read start");
1081 strcpy(timerName,
"read stop");
1084 strcpy(timerName,
"read close start");
1087 strcpy(timerName,
"read close stop");
1090 strcpy(timerName,
"invalid timer");
1094 fprintf(
out_logfile,
"Test %d: Iter=%d, Task=%d, Time=%f, %s\n",
1095 test->
id, iteration, (
int)
rank, timer[i],
1104 double times[] = {totalTime, accessTime};
1109 FAIL(
"Cannot open saveRankPerformanceDetailsCSV file for writes!");
1112 MPI_Comm_size(params->
testComm, & size);
1113 double *all_times = malloc(2* size *
sizeof(
double));
1114 MPI_Gather(times, 2, MPI_DOUBLE, all_times, 2, MPI_DOUBLE, 0, params->
testComm);
1118 for(
int i=0; i < size; i++){
1120 sprintf(buff,
"%s,%d,%.10e,%.10e,%.10e,%.10e\n", access==
WRITE ?
"write" :
"read", i, all_times[i*2], all_times[i*2+1], file_size/all_times[i*2], file_size/all_times[i*2+1] );
1121 int ret = fwrite(buff, strlen(buff), 1, fd);
1123 WARN(
"Couln't append to saveRankPerformanceDetailsCSV file\n");
1129 MPI_Gather(& times, 2, MPI_DOUBLE,
NULL, 2, MPI_DOUBLE, 0,
testComm);
1171 "Using reorderTasks '-C' (useful to avoid read cache in client)\n");
1202 WARNF(
"The file \"%s\" exists already and will be %s", testFileName,
1213 if ((currentTime = time(
NULL)) == -1) {
1214 ERR(
"cannot get current time");
1220 "Using Time Stamp %u (0x%x) for Data Signature\n",
1230 testComm),
"cannot broadcast start time value");
1259 if(fd ==
NULL)
FAIL(
"Cannot create file");
1266 "Commencing write performance test: %s",
1272 fprintf(
out_logfile,
"* data moved = %llu\n", dataMoved);
1305 "Verifying contents of the file(s) just written.\n");
1320 if(fd ==
NULL)
FAIL(
"Cannot open file");
1333 WARN(
"Could not read back the stonewalling status from the file!");
1337 int operation_flag =
READ;
1357 unsigned int iseed0;
1359 nodeoffset = (nodeoffset < params->
numNodes) ? nodeoffset : params->
numNodes - 1;
1364 srand(
rank + iseed0);
1389 if(fd ==
NULL)
FAIL(
"Cannot open file");
1396 "Commencing read performance test: %s\n",
1400 dataMoved =
WriteOrRead(params, &results[rep], fd, operation_flag, &ioBuffers);
1418 double start, finish;
1443 if (hog_buf !=
NULL)
1456 ERR(
"GPUDirect requires a non-CPU memory type");
1458 ERR(
"Using GPU Device memory only requires the usage of GPUDirect");
1460 ERR(
"a StoneWallingStatusFile is only sensible when splitting write/read into multiple executions of ior, please use -k");
1462 ERR(
"the StoneWallingStatusFile is only sensible for a write test when using stoneWallingWearOut");
1464 ERR(
"the stoneWallingWearOut is only sensible when setting a stonewall deadline with -D");
1466 WARN(
"the StoneWallingStatusFile only preserves the last experiment, make sure that each run uses a separate status file!");
1469 test, &defaults, repetitions);
1471 ERR(
"too few tasks for testing");
1473 WARN_RESET(
"inter-test delay must be nonnegative value",
1474 test, &defaults, interTestDelay);
1477 ERR(
"test must write, read, or check read/write file");
1479 ERR(
"using readCheck only requires to write a timeStampSignature -- use -G");
1481 ERR(
"segment count must be positive value");
1483 ERR(
"block size must be a multiple of access size");
1485 ERR(
"block size must be non-negative integer");
1487 ERR(
"transfer size must be a multiple of access size");
1489 ERR(
"transfer size must be non-negative integer");
1491 ERR(
"test will not complete with zero transfer size");
1494 ERR(
"block size must be a multiple of transfer size");
1497 ERR(
"block size must not be smaller than transfer size");
1499 ERR(
"IOR will randomize access within a block and repeats the same pattern for all segments, therefore choose blocksize > transferSize");
1501 ERR(
"Setting the randomPrefill option without using random is not useful");
1503 ERR(
"The randomPrefill option must divide the blockSize");
1505 if ((strcasecmp(test->
api,
"MPIIO") == 0)
1508 ERR(
"block/transfer size may not be smaller than IOR_size_t for MPIIO");
1509 if ((strcasecmp(test->
api,
"HDF5") == 0)
1512 ERR(
"block/transfer size may not be smaller than IOR_size_t for HDF5");
1513 if ((strcasecmp(test->
api,
"NCMPI") == 0)
1516 ERR(
"block/transfer size may not be smaller than IOR_size_t for NCMPI");
1517 if (((strcasecmp(test->
api,
"POSIX") != 0)
1518 && (strcasecmp(test->
api,
"MPIIO") != 0)
1519 && (strcasecmp(test->
api,
"HDF5") != 0)
1520 && (strcasecmp(test->
api,
"NCMPI") != 0)
1521 && (strcasecmp(test->
api,
"DUMMY") != 0)
1522 && (strcasecmp(test->
api,
"AIO") != 0)
1523 && (strcasecmp(test->
api,
"PMDK") != 0)
1524 && (strcasecmp(test->
api,
"MMAP") != 0)
1525 && (strcasecmp(test->
api,
"HDFS") != 0)
1526 && (strcasecmp(test->
api,
"DFS") != 0)
1527 && (strcasecmp(test->
api,
"Gfarm") != 0)
1528 && (strcasecmp(test->
api,
"RADOS") != 0)
1529 && (strcasecmp(test->
api,
"CEPHFS") != 0)) && test->
fsync)
1530 WARN_RESET(
"fsync() not supported in selected backend",
1531 test, &defaults, fsync);
1534 ERR(
"Both Constant and Random task re-ordering specified. Choose one and resubmit");
1537 ERR(
"random offset and random reorder tasks specified with single-shared-file. Choose one and resubmit");
1540 ERR(
"random offset and constant reorder tasks specified with single-shared-file. Choose one and resubmit");
1542 ERR(
"random offset with read check option requires to set the random seed");
1544 ERR(
"random offset not available with HDF5");
1546 ERR(
"random offset not available with NCMPI");
1548 ERR(
"file-per-proc not available in current NCMPI");
1556 ERR(
"The backend returned that the test parameters are invalid.");
1597 MPI_CHECK(MPI_Bcast(& seed, 1, MPI_INT, 0, test->
testComm),
"cannot broadcast random seed value");
1612 if ((rand() % test->
numTasks) == pretendRank) {
1621 *out_count = offsets;
1625 for (i = 0; i < offsets; i++) {
1632 if ((rand() % test->
numTasks) == pretendRank) {
1633 offsetArray[offsetCnt] = i;
1639 for (i = 0; i < offsets; i++) {
1641 value = rand() % offsets;
1642 tmp = offsetArray[value];
1643 offsetArray[value] = offsetArray[i];
1644 offsetArray[i] = tmp;
1647 return (offsetArray);
1653 void *buffer = ioBuffers->
buffer;
1654 if (access ==
WRITE) {
1659 if (amtXferred != transfer)
1660 ERR(
"cannot write to file");
1665 nanosleep( & wait,
NULL);
1667 }
else if (access ==
READ) {
1669 if (amtXferred != transfer)
1670 ERR(
"cannot read from file");
1673 nanosleep( & wait,
NULL);
1678 if (amtXferred != transfer)
1679 ERR(
"cannot read from file write check");
1684 if (amtXferred != transfer){
1685 ERR(
"cannot read from file");
1695 void * oldBuffer = ioBuffers->
buffer;
1697 ioBuffers->
buffer = randomPrefillBuffer;
1698 for (
IOR_offset_t i = startSegment; i < endSegment; i++){
1699 for (
int j = 0; j < offsets; j++) {
1709 ioBuffers->
buffer = oldBuffer;
1720 uint64_t pairCnt = 0;
1723 double startForStonewall;
1742 void * randomPrefillBuffer =
NULL;
1764 for (i = 0; i < test->
segmentCount && !hitStonewall; i++) {
1768 prefillSegment(test, randomPrefillBuffer, pretendRank, fd, ioBuffers, i, i+1);
1771 fprintf(
out_logfile,
"Random: synchronizing segment count with barrier and prefill took: %fs\n",
GetTimeStamp() - t_start);
1774 for (j = 0; j < offsets && !hitStonewall ; j++) {
1778 offset = offsets_rnd[j] + (i * test->
blockSize);
1800 MPI_CHECK(MPI_Bcast(&hitStonewall, 1, MPI_INT, 0,
testComm),
"hitStonewall broadcast failed");
1807 fprintf(
out_logfile,
"%d: stonewalling pairs accessed: %lld\n",
rank, (
long long) pairCnt);
1809 long long data_moved_ll = (
long long) dataMoved;
1810 long long pairs_accessed_min = 0;
1812 1, MPI_LONG_LONG_INT, MPI_MAX,
testComm),
"cannot reduce pairs moved");
1813 double stonewall_runtime =
GetTimeStamp() - startForStonewall;
1815 MPI_CHECK(MPI_Reduce(& pairCnt, & pairs_accessed_min,
1816 1, MPI_LONG_LONG_INT, MPI_MIN, 0,
testComm),
"cannot reduce pairs moved");
1818 1, MPI_LONG_LONG_INT, MPI_MIN, 0,
testComm),
"cannot reduce pairs moved");
1820 1, MPI_LONG_LONG_INT, MPI_SUM, 0,
testComm),
"cannot reduce pairs moved");
1824 fprintf(
out_logfile,
"stonewalling pairs accessed min: %lld max: %zu -- min data: %.1f GiB mean data: %.1f GiB time: %.1fs\n",
1841 offset = offsets_rnd[j] + (i * test->
blockSize);
1868 if(randomPrefillBuffer){
void invalidate_buffer_pattern(char *buffer, size_t bytes, ior_memory_flags type)
void init_IOR_Param_t(IOR_param_t *p, MPI_Comm com)
int GetNumTasks(MPI_Comm comm)
IOR_test_t * ParseCommandLine(int argc, char **argv, MPI_Comm com)
int reorderTasksRandomSeed
int ior_main(int argc, char **argv)
long long stonewall_avg_data_accessed
unsigned long GetProcessorAndCore(int *chip, int *core)
static void file_hits_histogram(IOR_param_t *params)
static void DisplayOutliers(int numTasks, double timerVal, char *timeString, int access, int outlierThreshold)
IOR_offset_t segmentCount
unsigned int incompressibleSeed
static void ValidateTests(IOR_param_t *params, MPI_Comm com)
IOR_offset_t aggFileSizeFromStat
unsigned int timeStampSignatureValue
int64_t ReadStoneWallingIterations(char *const filename, MPI_Comm com)
IOR_offset_t segmentCount
void PrintHeader(int argc, char **argv)
static void XferBuffersFree(IOR_io_buffers *ioBuffers, IOR_param_t *test)
void PrintLongSummaryOneTest(IOR_test_t *test)
int test_time_elapsed(IOR_param_t *params, double startTime)
void(* delete)(char *, aiori_mod_opt_t *module_options)
void FreeResults(IOR_test_t *test)
IOR_offset_t transferSize
void PrintLongSummaryHeader()
ior_memory_flags gpuMemoryFlags
int(* mkdir)(const char *path, mode_t mode, aiori_mod_opt_t *module_options)
IOR_offset_t aggFileSizeFromXfer
int QueryNodeMapping(MPI_Comm comm, int print_nodemap)
static int totalErrorCount
static void * HogMemory(IOR_param_t *params)
IOR_offset_t * GetOffsetArrayRandom(IOR_param_t *test, int pretendRank, IOR_offset_t *out_count)
static void DestroyTest(IOR_test_t *test)
static void ReduceIterResults(IOR_test_t *test, double *timer, const int rep, const int access)
int setTimeStampSignature
IOR_offset_t expectedAggFileSize
int(* access)(const char *path, int mode, aiori_mod_opt_t *module_options)
#define WARN_RESET(MSG, TO_STRUCT_PTR, FROM_STRUCT_PTR, MEMBER)
#define MPI_CHECK(MPI_STATUS, MSG)
IOR_test_t * ior_run(int argc, char **argv, MPI_Comm world_com, FILE *world_out)
static IOR_offset_t WriteOrRead(IOR_param_t *test, IOR_results_t *results, aiori_fd_t *fd, const int access, IOR_io_buffers *ioBuffers)
char * stoneWallingStatusFile
void ShowTestStart(IOR_param_t *params)
static char ** ParseFileName(char *, int *)
ior_dataPacketType_e dataPacketType
static void ProcessIterResults(IOR_test_t *test, double *timer, const int rep, const int access)
void GetTestFileName(char *testFileName, IOR_param_t *test)
int(* check_params)(aiori_mod_opt_t *)
static void DistributeHints(MPI_Comm com)
void ShowSetup(IOR_param_t *params)
static aiori_xfer_hint_t * hints
void init_clock(MPI_Comm com)
IOR_offset_t aggFileSizeForBW
void(* initialize)(aiori_mod_opt_t *options)
static void XferBuffersSetup(IOR_io_buffers *ioBuffers, IOR_param_t *test, int pretendRank)
char * CurrentTimeString(void)
void PrintRemoveTiming(double start, double finish, int rep)
void(* fsync)(aiori_fd_t *, aiori_mod_opt_t *module_options)
static int test_initialize(IOR_test_t *test)
static void RemoveFile(char *testFileName, int filePerProc, IOR_param_t *test)
static void CheckForOutliers(IOR_param_t *test, const double *timer, const int access)
IOR_offset_t(* get_file_size)(aiori_mod_opt_t *module_options, char *filename)
IOR_offset_t expectedAggFileSize
int GetNumNodes(MPI_Comm comm)
void initCUDA(int blockMapping, int rank, int numNodes, int tasksPerNode, int useGPUID)
static void DestroyTests(IOR_test_t *tests_head)
static size_t CompareData(void *expectedBuffer, size_t size, IOR_param_t *test, IOR_offset_t offset, int fillrank, int access)
void(* xfer_hints)(aiori_xfer_hint_t *params)
void(* close)(aiori_fd_t *, aiori_mod_opt_t *module_options)
int aiori_warning_as_errors
int(* stat)(const char *path, struct stat *buf, aiori_mod_opt_t *module_options)
static void CheckFileSize(IOR_test_t *test, char *testFilename, IOR_offset_t dataMoved, int rep, const int access)
char * saveRankDetailsCSV
double GetTimeStamp(void)
static void WriteTimes(IOR_param_t *test, const double *timer, const int iteration, const int access)
static void prefillSegment(IOR_param_t *test, void *randomPrefillBuffer, int pretendRank, aiori_fd_t *fd, IOR_io_buffers *ioBuffers, int startSegment, int endSegment)
IOR_offset_t transferSize
void PrintShortSummary(IOR_test_t *test)
static IOR_offset_t WriteOrReadSingle(IOR_offset_t offset, int pretendRank, IOR_offset_t transfer, int *errors, IOR_param_t *test, aiori_fd_t *fd, IOR_io_buffers *ioBuffers, int access)
static const ior_aiori_t * backend
aiori_fd_t *(* create)(char *, int iorflags, aiori_mod_opt_t *)
long long stonewall_min_data_accessed
IOR_offset_t(* xfer)(int access, aiori_fd_t *, IOR_size_t *, IOR_offset_t size, IOR_offset_t offset, aiori_mod_opt_t *module_options)
IOR_test_t * CreateTest(IOR_param_t *init_params, int test_num)
static void TestIoSys(IOR_test_t *)
void PrintLongSummaryAllTests(IOR_test_t *tests_head)
void PrintReducedResult(IOR_test_t *test, int access, double bw, double iops, double latency, double *diff_subset, double totalTime, int rep)
void update_write_memory_pattern(uint64_t item, char *buf, size_t bytes, int rand_seed, int pretendRank, ior_dataPacketType_e dataPacketType, ior_memory_flags type)
static void StoreRankInformation(IOR_test_t *test, double *timer, const int rep, const int access)
#define WARNF(FORMAT,...)
void(* finalize)(aiori_mod_opt_t *options)
const char * aiori_default(void)
void generate_memory_pattern(char *buf, size_t bytes, int rand_seed, int pretendRank, ior_dataPacketType_e dataPacketType, ior_memory_flags type)
uint64_t stoneWallingWearOutIterations
static int CountErrors(IOR_param_t *test, int access, int errors)
IOR_offset_t randomPrefillBlocksize
static void * malloc_and_touch(size_t size)
aiori_fd_t *(* open)(char *, int iorflags, aiori_mod_opt_t *)
const struct ior_aiori * backend
static char * PrependDir(IOR_param_t *, char *)
int verify_memory_pattern(uint64_t item, char *buffer, size_t bytes, int rand_seed, int pretendRank, ior_dataPacketType_e dataPacketType, ior_memory_flags type)
void DelaySecs(int delay)
int deadlineForStonewalling
#define FILENAME_DELIMITER
static void test_finalize(IOR_test_t *test)
long long stonewall_total_data_accessed
void aligned_buffer_free(void *buf, ior_memory_flags gpu)
static void ior_set_xfer_hints(IOR_param_t *p)
static void InitTests(IOR_test_t *)
long long int IOR_offset_t
int GetNumTasksOnNode0(MPI_Comm comm)
void ShowTestEnd(IOR_test_t *tptr)
void * safeMalloc(uint64_t size)
void AllocResults(IOR_test_t *test)
void * aligned_buffer_alloc(size_t size, ior_memory_flags type)