24 #if defined(HAVE_STRINGS_H) 32 # include <sys/time.h> 33 # include <sys/utsname.h> 44 #define IOR_NB_TIMERS 6 58 void *fd,
const int access,
78 for (tptr = tests_head; tptr !=
NULL; tptr = tptr->
next) {
115 MPI_CHECK(MPI_Init(&argc, &argv),
"cannot initialize MPI");
133 for (tptr = tests_head; tptr !=
NULL; tptr = tptr->
next) {
163 MPI_CHECK(MPI_Finalize(),
"cannot finalize MPI");
180 assert (
NULL != default_aiori);
187 p->
api = strdup(default_aiori);
188 p->
platform = strdup(
"HOST(OSTYPE)");
215 hdfs_user = getenv(
"USER");
235 char *timeString,
int access,
int outlierThreshold)
244 (&timerVal, &sum, 1, MPI_DOUBLE, MPI_SUM,
testComm),
247 sqrDiff = pow((mean - timerVal), 2);
249 (&sqrDiff, &var, 1, MPI_DOUBLE, MPI_SUM,
testComm),
254 if (access ==
WRITE) {
255 strcpy(accessString,
"write");
257 strcpy(accessString,
"read");
259 if (fabs(timerVal - mean) > (
double)outlierThreshold) {
261 int ret = gethostname(hostname,
MAX_STR);
263 strcpy(hostname,
"unknown");
265 fprintf(
out_logfile,
"WARNING: for %s, task %d, %s %s is %f\n",
266 hostname,
rank, accessString, timeString, timerVal);
267 fprintf(
out_logfile,
" (mean=%f, stddev=%f)\n", mean, sd);
285 "elapsed transfer time", access,
307 1, MPI_LONG_LONG_INT, MPI_SUM,
testComm),
308 "cannot total data moved");
310 if (strcasecmp(params->
api,
"HDF5") != 0 && strcasecmp(params->
api,
"NCMPI") != 0 &&
311 strcasecmp(params->
api,
"DAOS") != 0) {
318 "WARNING: Expected aggregate file size = %lld.\n",
321 "WARNING: Stat() of aggregate file size = %lld.\n",
324 "WARNING: Using actual aggregate bytes moved = %lld.\n",
328 "WARNING: maybe caused by deadlineForStonewalling\n");
350 size_t i, j, length, first, last;
351 size_t errorCount = 0;
353 unsigned long long *goodbuf = (
unsigned long long *)expectedBuffer;
354 unsigned long long *testbuf = (
unsigned long long *)unknownBuffer;
357 strcpy(bufferLabel1,
"Expected: ");
358 strcpy(bufferLabel2,
"Actual: ");
360 ERR(
"incorrect argument for CompareBuffers()");
367 "[%d] At file byte offset %lld, comparing %llu-byte transfer\n",
370 for (i = 0; i < length; i++) {
371 if (testbuf[i] != goodbuf[i]) {
375 "[%d] At transfer buffer #%lld, index #%lld (file byte offset %lld):\n",
376 rank, transferCount - 1, (
long long)i,
393 "[%d] PASSED offset = %lld bytes, transfer %lld\n",
395 ((i *
sizeof(
unsigned long long)) +
396 test->
offset), transferCount);
398 for (j = 0; j < 4; j++)
401 for (j = 0; j < 4; j++)
410 "[%d] FAILED comparison of buffer containing %d-byte ints:\n",
411 rank, (
int)
sizeof(
unsigned long long int));
416 "%lld errors between buffer indices %lld and %lld.\n",
417 (
long long)errorCount, (
long long)first,
420 ((first *
sizeof(
unsigned long long)) + test->
offset));
423 for (j = first; j < length && j < first + 4; j++)
428 for (j = first; j < length && j < first + 4; j++)
434 ERR(
"data check error, aborting execution");
447 MPI_CHECK(MPI_Reduce(&errors, &allErrors, 1, MPI_INT, MPI_SUM,
448 0,
testComm),
"cannot reduce errors");
450 "cannot broadcast allErrors value");
451 if (allErrors != 0) {
455 if (
rank == 0 && allErrors != 0) {
457 WARN(
"overflow in errors counted");
460 fprintf(
out_logfile,
"WARNING: incorrect data on %s (%d errors found).\n",
461 access ==
WRITECHECK ?
"write" :
"read", allErrors);
463 "Used Time Stamp %u (0x%x) for Data Signature\n",
481 long pageSize = sysconf(_SC_PAGESIZE);
483 size_t pageSize = getpagesize();
486 pageMask = pageSize - 1;
487 buf = malloc(size + pageSize +
sizeof(
void *));
489 ERR(
"out of memory");
491 tmp = buf +
sizeof(
char *);
492 aligned = tmp + pageSize - ((size_t) tmp & pageMask);
495 tmp = aligned -
sizeof(
void *);
498 return (
void *)aligned;
506 free(*(
void **)((
char *)buf -
sizeof(
char *)));
536 ERR(
"malloc() of IOR_test_t failed");
537 newTest->
params = *init_params;
556 for (tptr = tests_head; tptr !=
NULL; tptr = next) {
568 int hintCount = 0, i;
572 if (strncmp(
environ[i],
"IOR_HINT", strlen(
"IOR_HINT"))
576 WARN(
"exceeded max hints; reset MAX_HINTS and recompile");
581 strncpy(hint[hintCount - 1],
environ[i],
587 MPI_CHECK(MPI_Bcast(&hintCount,
sizeof(hintCount), MPI_BYTE,
588 0, MPI_COMM_WORLD),
"cannot broadcast hints");
589 for (i = 0; i < hintCount; i++) {
592 "cannot broadcast hints");
593 strcpy(fullHint, hint[i]);
594 strcpy(hintVariable, strtok(fullHint,
"="));
595 if (getenv(hintVariable) ==
NULL) {
597 if (putenv(hint[i]) != 0)
598 WARN(
"cannot set environment variable");
616 unsigned long long hi, lo;
617 unsigned long long *buf = (
unsigned long long *)buffer;
619 for (i = 0; i < test->
transferSize /
sizeof(
unsigned long long); i++) {
633 unsigned long long hi, lo;
634 unsigned long long *buf = (
unsigned long long *)buffer;
647 hi = ((
unsigned long long)fillrank) << 32;
649 for (i = 0; i < test->
transferSize /
sizeof(
unsigned long long); i++) {
655 buf[i] = offset + (i *
sizeof(
unsigned long long));
670 if (uname(&name) != 0) {
671 EWARN(
"cannot get platform name");
672 sprintf(sysName,
"%s",
"Unknown");
673 sprintf(nodeName,
"%s",
"Unknown");
675 sprintf(sysName,
"%s", name.sysname);
676 sprintf(nodeName,
"%s", name.nodename);
680 if (strlen(nodeName) == 0) {
684 p = start + strlen(nodeName) - 1;
691 if (*p < '0' || *p >
'9') {
699 sprintf(platformName,
"%s(%s)", nodeName, sysName);
700 return strdup(platformName);
710 char **fileNames, *tmp, *token;
723 while (*tmp !=
'\0') {
730 fileNames = (
char **)malloc((*count) *
sizeof(
char **));
731 if (fileNames ==
NULL)
732 ERR(
"out of memory");
735 token = strtok(name, delimiterString);
736 while (token !=
NULL) {
737 fileNames[i] = token;
738 token = strtok(
NULL, delimiterString);
753 char testFileNameRoot[
MAX_STR];
761 ERR(
"cannot use multiple file names with unique directories");
763 strcpy(testFileNameRoot,
767 strcpy(testFileNameRoot, fileNames[0]);
777 strcpy(testFileNameRoot,
780 sprintf(testFileName,
"%s.%08d", testFileNameRoot,
783 strcpy(testFileName, testFileNameRoot);
789 strcat(testFileName, tmpString);
804 dir = (
char *)malloc(
MAX_STR + 1);
806 ERR(
"out of memory");
809 strcpy(dir, rootDir);
812 if (dir[i] ==
'\0' || dir[i] ==
'/') {
821 fname = rootDir + i + 1;
827 if (backend->
access(dir, F_OK, test) != 0) {
828 if (backend->
mkdir(dir, S_IRWXU, test) < 0) {
829 ERRF(
"cannot create directory: %s", dir);
833 }
else if (backend->
access(dir, R_OK, test) != 0 ||
834 backend->
access(dir, W_OK, test) != 0 ||
835 backend->
access(dir, X_OK, test) != 0) {
836 ERRF(
"invalid directory permissions: %s", dir);
855 double totalTime, accessTime;
857 double bw, iops, latency, minlatency;
861 assert(access ==
WRITE || access ==
READ);
866 op = i % 2 ? MPI_MAX : MPI_MIN;
867 MPI_CHECK(MPI_Reduce(&timer[i], &reduced[i], 1, MPI_DOUBLE,
872 for (i = 0; i < IOR_NB_TIMERS / 2; i++)
873 diff[i] = reduced[2 * i + 1] - reduced[2 * i];
875 totalTime = reduced[5] - reduced[0];
876 accessTime = reduced[3] - reduced[2];
881 point->
time = totalTime;
898 MPI_CHECK(MPI_Reduce(&latency, &minlatency, 1, MPI_DOUBLE,
899 MPI_MIN, 0,
testComm),
"MPI_Reduce()");
914 int tmpRankOffset = 0;
922 if (backend->
access(testFileName, F_OK, test) == 0) {
927 backend->
delete(testFileName, test);
934 if ((
rank == 0) && (backend->
access(testFileName, F_OK, test) == 0)) {
939 backend->
delete(testFileName, test);
952 int mpiNumTasksOnNode0 = 0;
970 while (tests !=
NULL) {
980 }
else if (params->
numTasks > mpiNumTasks) {
983 "WARNING: More tasks requested (%d) than available (%d),",
1058 page_size = sysconf(_SC_PAGESIZE);
1060 buf = (
char *)malloc(size);
1064 for (ptr = buf; ptr < buf+
size; ptr += page_size) {
1073 int *rankoffs =
NULL;
1074 int *filecont =
NULL;
1075 int *filehits =
NULL;
1080 rankoffs = (
int *)malloc(params->
numTasks *
sizeof(
int));
1081 filecont = (
int *)malloc(params->
numTasks *
sizeof(
int));
1082 filehits = (
int *)malloc(params->
numTasks *
sizeof(
int));
1087 "MPI_Gather error");
1092 memset((
void *)filecont, 0, params->
numTasks *
sizeof(
int));
1093 for (ifile = 0; ifile < params->
numTasks; ifile++) {
1094 filecont[(ifile + rankoffs[ifile]) % params->
numTasks]++;
1096 memset((
void *)filehits, 0, params->
numTasks *
sizeof(
int));
1097 for (ifile = 0; ifile < params->
numTasks; ifile++)
1098 for (jfile = 0; jfile < params->
numTasks; jfile++) {
1099 if (ifile == filecont[jfile])
1107 jfile += filehits[ifile], ifile++;
1140 fprintf(
out_logfile,
"This node hogging %ld bytes of memory\n",
1148 fprintf(
out_logfile,
"This task hogging %ld bytes of memory\n", size);
1152 ERR(
"malloc of simulated applciation buffer failed");
1167 if (access ==
WRITE) {
1170 strcpy(timerName,
"write open start");
1173 strcpy(timerName,
"write open stop");
1176 strcpy(timerName,
"write start");
1179 strcpy(timerName,
"write stop");
1182 strcpy(timerName,
"write close start");
1185 strcpy(timerName,
"write close stop");
1188 strcpy(timerName,
"invalid timer");
1195 strcpy(timerName,
"read open start");
1198 strcpy(timerName,
"read open stop");
1201 strcpy(timerName,
"read start");
1204 strcpy(timerName,
"read stop");
1207 strcpy(timerName,
"read close start");
1210 strcpy(timerName,
"read close stop");
1213 strcpy(timerName,
"invalid timer");
1217 fprintf(
out_logfile,
"Test %d: Iter=%d, Task=%d, Time=%f, %s\n",
1218 test->
id, iteration, (
int)
rank, timer[i],
1235 MPI_Group orig_group, new_group;
1243 "MPI_Comm_group() error");
1247 MPI_CHECK(MPI_Group_range_incl(orig_group, 1, &range, &new_group),
1248 "MPI_Group_range_incl() error");
1250 "MPI_Comm_create() error");
1251 MPI_CHECK(MPI_Group_free(&orig_group),
"MPI_Group_Free() error");
1252 MPI_CHECK(MPI_Group_free(&new_group),
"MPI_Group_Free() error");
1265 "Using reorderTasks '-C' (useful to avoid read cache in client)\n");
1296 if ((currentTime = time(
NULL)) == -1) {
1297 ERR(
"cannot get current time");
1300 (
unsigned int) currentTime;
1303 "Using Time Stamp %u (0x%x) for Data Signature\n",
1314 testComm),
"cannot broadcast start time value");
1341 fd = backend->
create(testFileName, params);
1348 "Commencing write performance test: %s",
1354 fprintf(
out_logfile,
"* data moved = %llu\n", dataMoved);
1362 backend->
close(fd, params);
1396 "Verifying contents of the file(s) just written.\n");
1415 fd = backend->
open(testFileName, params);
1417 backend->
close(fd, params);
1428 fprintf(
out_logfile,
"WARNING: Could not read back the stonewalling status from the file!\n");
1432 int operation_flag =
READ;
1452 unsigned int iseed0;
1454 nodeoffset = (nodeoffset < params->
numNodes) ? nodeoffset : params->
numNodes - 1;
1459 srand(
rank + iseed0);
1487 fd = backend->
open(testFileName, params);
1494 "Commencing read performance test: %s\n",
1498 dataMoved =
WriteOrRead(params, &results[rep], fd, operation_flag, &ioBuffers);
1504 backend->
close(fd, params);
1526 double start, finish;
1553 if (hog_buf !=
NULL)
1571 test, &defaults, repetitions);
1573 ERR(
"too few tasks for testing");
1575 WARN_RESET(
"inter-test delay must be nonnegative value",
1576 test, &defaults, interTestDelay);
1579 ERR(
"test must write, read, or check read/write file");
1581 ERR(
"using readCheck only requires to write a timeStampSignature -- use -G");
1583 ERR(
"segment count must be positive value");
1585 ERR(
"block size must be a multiple of access size");
1587 ERR(
"block size must be non-negative integer");
1589 ERR(
"transfer size must be a multiple of access size");
1591 ERR(
"alignment must be non-negative integer");
1593 ERR(
"transfer size must be non-negative integer");
1595 ERR(
"test will not complete with zero transfer size");
1598 ERR(
"block size must be a multiple of transfer size");
1601 ERR(
"block size must not be smaller than transfer size");
1604 if ((strcasecmp(test->
api,
"MPIIO") == 0)
1607 ERR(
"block/transfer size may not be smaller than IOR_size_t for MPIIO");
1608 if ((strcasecmp(test->
api,
"HDF5") == 0)
1611 ERR(
"block/transfer size may not be smaller than IOR_size_t for HDF5");
1612 if ((strcasecmp(test->
api,
"NCMPI") == 0)
1615 ERR(
"block/transfer size may not be smaller than IOR_size_t for NCMPI");
1617 && (
sizeof(MPI_Aint) < 8)
1620 ERR(
"segment size must be < 2GiB");
1623 test, &defaults, singleXferAttempt);
1624 if (((strcasecmp(test->
api,
"POSIX") != 0)
1625 && (strcasecmp(test->
api,
"MPIIO") != 0)
1626 && (strcasecmp(test->
api,
"MMAP") != 0)
1627 && (strcasecmp(test->
api,
"HDFS") != 0)
1628 && (strcasecmp(test->
api,
"DFS") != 0)
1629 && (strcasecmp(test->
api,
"DAOS") != 0)
1630 && (strcasecmp(test->
api,
"Gfarm") != 0)
1631 && (strcasecmp(test->
api,
"RADOS") != 0)
1632 && (strcasecmp(test->
api,
"CEPHFS") != 0)) && test->
fsync)
1633 WARN_RESET(
"fsync() not supported in selected backend",
1634 test, &defaults, fsync);
1636 WARN_RESET(
"preallocation only available in MPIIO",
1637 test, &defaults, preallocate);
1639 WARN_RESET(
"file view only available in MPIIO",
1640 test, &defaults, useFileView);
1642 WARN_RESET(
"shared file pointer only available in MPIIO",
1643 test, &defaults, useSharedFilePointer);
1645 WARN_RESET(
"shared file pointer not implemented",
1646 test, &defaults, useSharedFilePointer);
1648 WARN_RESET(
"strided datatype only available in MPIIO",
1649 test, &defaults, useStridedDatatype);
1651 WARN_RESET(
"strided datatype not implemented",
1652 test, &defaults, useStridedDatatype);
1653 if ((strcasecmp(test->
api,
"MPIIO") == 0)
1657 ERR(
"need larger file size for strided datatype in MPIIO");
1658 if ((strcasecmp(test->
api,
"POSIX") == 0) && test->
showHints)
1660 test, &defaults, showHints);
1661 if ((strcasecmp(test->
api,
"POSIX") == 0) && test->
collective)
1662 WARN_RESET(
"collective not available in POSIX",
1663 test, &defaults, collective);
1666 ERR(
"transfer size must be aligned with PAGESIZE for MMAP with fsyncPerWrite");
1670 ERR(
"Both Constant and Random task re-ordering specified. Choose one and resubmit");
1673 ERR(
"random offset and random reorder tasks specified with single-shared-file. Choose one and resubmit");
1676 ERR(
"random offset and constant reorder tasks specified with single-shared-file. Choose one and resubmit");
1678 ERR(
"random offset not available with read check option (use write check)");
1680 ERR(
"random offset not available with store file offset option)");
1685 ERR(
"random offset not available with collective MPIIO");
1688 ERR(
"random offset not available with MPIIO fileviews");
1690 ERR(
"random offset not available with HDF5");
1692 ERR(
"random offset not available with NCMPI");
1694 WARN_RESET(
"individual datasets only available in HDF5",
1695 test, &defaults, individualDataSets);
1697 WARN_RESET(
"individual data sets not implemented",
1698 test, &defaults, individualDataSets);
1700 ERR(
"file-per-proc not available in current NCMPI");
1702 if (strcasecmp(test->
api,
"HDF5") != 0) {
1703 ERR(
"'no fill' option only available in HDF5");
1706 #if defined (H5_VERS_MAJOR) && defined (H5_VERS_MINOR) 1708 #if (H5_VERS_MAJOR > 0 && H5_VERS_MINOR > 5) 1711 ERRF(
"'no fill' option not available in %s",
1715 WARN(
"unable to determine HDF5 version for 'no fill' usage");
1720 ERR(
"Lustre stripe options are incompatible with useExistingTestFile");
1726 ERR(
"The backend returned that the test parameters are invalid.");
1750 if (offsetArray ==
NULL)
1751 ERR(
"malloc() failed");
1752 offsetArray[offsets] = -1;
1769 return (offsetArray);
1797 if (access ==
WRITE || access ==
READ) {
1814 if ((rand() % test->
numTasks) == pretendRank) {
1825 if (offsetArray ==
NULL)
1826 ERR(
"malloc() failed");
1827 offsetArray[offsets] = -1;
1831 for (i = 0; i < offsets; i++) {
1838 if ((rand() % test->
numTasks) == pretendRank) {
1839 offsetArray[offsetCnt] = i;
1845 for (i = 0; i < offsets; i++) {
1846 value = rand() % offsets;
1847 tmp = offsetArray[value];
1848 offsetArray[value] = offsetArray[i];
1849 offsetArray[i] = tmp;
1853 return (offsetArray);
1861 void *buffer = ioBuffers->
buffer;
1865 test->
offset = offsetArray[pairCnt];
1868 if (access ==
WRITE) {
1875 backend->
xfer(access, fd, buffer, transfer, test);
1876 if (amtXferred != transfer)
1877 ERR(
"cannot write to file");
1880 nanosleep( & wait,
NULL);
1882 }
else if (access ==
READ) {
1884 backend->
xfer(access, fd, buffer, transfer, test);
1885 if (amtXferred != transfer)
1886 ERR(
"cannot read from file");
1889 nanosleep( & wait,
NULL);
1892 memset(checkBuffer,
'a', transfer);
1898 amtXferred = backend->
xfer(access, fd, checkBuffer, transfer, test);
1899 if (amtXferred != transfer)
1900 ERR(
"cannot read from file write check");
1902 *errors +=
CompareBuffers(readCheckBuffer, checkBuffer, transfer,
1903 *transferCount, test,
1906 memset(checkBuffer,
'a', transfer);
1908 amtXferred = backend->
xfer(access, fd, checkBuffer, transfer, test);
1909 if (amtXferred != transfer){
1910 ERR(
"cannot read from file");
1929 uint64_t pairCnt = 0;
1933 double startForStonewall;
1951 while ((offsetArray[pairCnt] != -1) && !hitStonewall ) {
1952 dataMoved +=
WriteOrReadSingle(pairCnt, offsetArray, pretendRank, & transferCount, & errors, test, fd, ioBuffers, access);
1962 MPI_CHECK(MPI_Bcast(&hitStonewall, 1, MPI_INT, 0, MPI_COMM_WORLD),
"hitStonewall broadcast failed");
1968 fprintf(
out_logfile,
"%d: stonewalling pairs accessed: %lld\n",
rank, (
long long) pairCnt);
1970 long long data_moved_ll = (
long long) dataMoved;
1971 long long pairs_accessed_min = 0;
1973 1, MPI_LONG_LONG_INT, MPI_MAX,
testComm),
"cannot reduce pairs moved");
1974 double stonewall_runtime =
GetTimeStamp() - startForStonewall;
1976 MPI_CHECK(MPI_Reduce(& pairCnt, & pairs_accessed_min,
1977 1, MPI_LONG_LONG_INT, MPI_MIN, 0,
testComm),
"cannot reduce pairs moved");
1979 1, MPI_LONG_LONG_INT, MPI_MIN, 0,
testComm),
"cannot reduce pairs moved");
1981 1, MPI_LONG_LONG_INT, MPI_SUM, 0,
testComm),
"cannot reduce pairs moved");
1984 fprintf(
out_logfile,
"stonewalling pairs accessed min: %lld max: %zu -- min data: %.1f GiB mean data: %.1f GiB time: %.1fs\n",
1992 dataMoved +=
WriteOrReadSingle(pairCnt, offsetArray, pretendRank, & transferCount, & errors, test, fd, ioBuffers, access);
2005 backend->
fsync(fd, test);
IOR_offset_t setAlignment
IOR_offset_t(* get_file_size)(IOR_param_t *, MPI_Comm, char *)
int GetNumTasks(MPI_Comm comm)
int reorderTasksRandomSeed
int ior_main(int argc, char **argv)
long long stonewall_avg_data_accessed
void(* delete)(char *, IOR_param_t *)
static IOR_offset_t WriteOrRead(IOR_param_t *test, IOR_results_t *results, void *fd, const int access, IOR_io_buffers *ioBuffers)
IOR_offset_t * GetOffsetArraySequential(IOR_param_t *test, int pretendRank)
static void file_hits_histogram(IOR_param_t *params)
static void DisplayOutliers(int numTasks, double timerVal, char *timeString, int access, int outlierThreshold)
unsigned int incompressibleSeed
IOR_offset_t aggFileSizeFromStat
unsigned int timeStampSignatureValue
static void InitTests(IOR_test_t *, MPI_Comm)
int64_t ReadStoneWallingIterations(char *const filename)
IOR_offset_t segmentCount
static void aligned_buffer_free(void *buf)
#define WARN_RESET(MSG, TO_STRUCT_PTR, FROM_STRUCT_PTR, MEMBER)
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 FreeResults(IOR_test_t *test)
static void ValidateTests(IOR_param_t *)
IOR_offset_t transferSize
int(* check_params)(IOR_param_t *)
void PrintLongSummaryHeader()
IOR_offset_t aggFileSizeFromXfer
int QueryNodeMapping(MPI_Comm comm, int print_nodemap)
static IOR_offset_t WriteOrReadSingle(IOR_offset_t pairCnt, IOR_offset_t *offsetArray, int pretendRank, IOR_offset_t *transferCount, int *errors, IOR_param_t *test, int *fd, IOR_io_buffers *ioBuffers, int access)
static int totalErrorCount
static void * HogMemory(IOR_param_t *params)
static void DestroyTest(IOR_test_t *test)
static void ReduceIterResults(IOR_test_t *test, double *timer, const int rep, const int access)
int setTimeStampSignature
int(* access)(const char *path, int mode, IOR_param_t *param)
IOR_test_t * ior_run(int argc, char **argv, MPI_Comm world_com, FILE *world_out)
void(* close)(void *, IOR_param_t *)
char * stoneWallingStatusFile
void ShowTestStart(IOR_param_t *params)
static char ** ParseFileName(char *, int *)
void *(* open)(char *, IOR_param_t *)
void aiori_initialize(IOR_test_t *tests)
IOR_offset_t * GetOffsetArrayRandom(IOR_param_t *test, int pretendRank, int access)
tPort hdfs_name_node_port
void GetTestFileName(char *testFileName, IOR_param_t *test)
void aiori_finalize(IOR_test_t *tests)
unsigned int reseed_incompressible_prng
void(* fsync)(void *, IOR_param_t *)
void ShowSetup(IOR_param_t *params)
void SeedRandGen(MPI_Comm testComm)
IOR_offset_t aggFileSizeForBW
static void XferBuffersSetup(IOR_io_buffers *ioBuffers, IOR_param_t *test, int pretendRank)
char * CurrentTimeString(void)
void PrintRemoveTiming(double start, double finish, int rep)
#define MPI_CHECK(MPI_STATUS, MSG)
static void FillBuffer(void *buffer, IOR_param_t *test, unsigned long long offset, int fillrank)
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 expectedAggFileSize
int GetNumNodes(MPI_Comm comm)
static void DestroyTests(IOR_test_t *tests_head)
double GetTimeStamp(void)
static void WriteTimes(IOR_param_t *test, const double *timer, const int iteration, const int access)
void PrintShortSummary(IOR_test_t *test)
static const ior_aiori_t * backend
int(* mkdir)(const char *path, mode_t mode, IOR_param_t *param)
long long stonewall_min_data_accessed
IOR_test_t * CreateTest(IOR_param_t *init_params, int test_num)
static void TestIoSys(IOR_test_t *)
void DistributeHints(void)
void PrintLongSummaryAllTests(IOR_test_t *tests_head)
static size_t CompareBuffers(void *expectedBuffer, void *unknownBuffer, size_t size, IOR_offset_t transferCount, IOR_param_t *test, int access)
static char hostname[MAX_PATHLEN]
void PrintReducedResult(IOR_test_t *test, int access, double bw, double iops, double latency, double *diff_subset, double totalTime, int rep)
enum PACKET_TYPE dataPacketType
void init_IOR_Param_t(IOR_param_t *p)
void *(* create)(char *, IOR_param_t *)
const char * aiori_default(void)
static void * aligned_buffer_alloc(size_t size)
uint64_t stoneWallingWearOutIterations
static int CountErrors(IOR_param_t *test, int access, int errors)
static void * malloc_and_touch(size_t size)
const struct ior_aiori * backend
static void FillIncompressibleBuffer(void *buffer, IOR_param_t *test)
static char * PrependDir(IOR_param_t *, char *)
void DelaySecs(int delay)
IOR_test_t * ParseCommandLine(int argc, char **argv)
int deadlineForStonewalling
#define FILENAME_DELIMITER
static void CheckFileSize(IOR_test_t *test, IOR_offset_t dataMoved, int rep, const int access)
long long int IOR_offset_t
int GetNumTasksOnNode0(MPI_Comm comm)
IOR_offset_t(* xfer)(int, void *, IOR_size_t *, IOR_offset_t, IOR_param_t *)
void ShowTestEnd(IOR_test_t *tptr)
const char * hdfs_name_node
void * safeMalloc(uint64_t size)
void AllocResults(IOR_test_t *test)