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) {
317 "WARNING: Expected aggregate file size = %lld.\n",
320 "WARNING: Stat() of aggregate file size = %lld.\n",
323 "WARNING: Using actual aggregate bytes moved = %lld.\n",
327 "WARNING: maybe caused by deadlineForStonewalling\n");
349 size_t i, j, length, first, last;
350 size_t errorCount = 0;
352 unsigned long long *goodbuf = (
unsigned long long *)expectedBuffer;
353 unsigned long long *testbuf = (
unsigned long long *)unknownBuffer;
356 strcpy(bufferLabel1,
"Expected: ");
357 strcpy(bufferLabel2,
"Actual: ");
359 ERR(
"incorrect argument for CompareBuffers()");
366 "[%d] At file byte offset %lld, comparing %llu-byte transfer\n",
369 for (i = 0; i < length; i++) {
370 if (testbuf[i] != goodbuf[i]) {
374 "[%d] At transfer buffer #%lld, index #%lld (file byte offset %lld):\n",
375 rank, transferCount - 1, (
long long)i,
392 "[%d] PASSED offset = %lld bytes, transfer %lld\n",
394 ((i *
sizeof(
unsigned long long)) +
395 test->
offset), transferCount);
397 for (j = 0; j < 4; j++)
400 for (j = 0; j < 4; j++)
409 "[%d] FAILED comparison of buffer containing %d-byte ints:\n",
410 rank, (
int)
sizeof(
unsigned long long int));
415 "%lld errors between buffer indices %lld and %lld.\n",
416 (
long long)errorCount, (
long long)first,
419 ((first *
sizeof(
unsigned long long)) + test->
offset));
422 for (j = first; j < length && j < first + 4; j++)
427 for (j = first; j < length && j < first + 4; j++)
433 ERR(
"data check error, aborting execution");
446 MPI_CHECK(MPI_Reduce(&errors, &allErrors, 1, MPI_INT, MPI_SUM,
447 0,
testComm),
"cannot reduce errors");
449 "cannot broadcast allErrors value");
450 if (allErrors != 0) {
454 if (
rank == 0 && allErrors != 0) {
456 WARN(
"overflow in errors counted");
459 fprintf(
out_logfile,
"WARNING: incorrect data on %s (%d errors found).\n",
460 access ==
WRITECHECK ?
"write" :
"read", allErrors);
462 "Used Time Stamp %u (0x%x) for Data Signature\n",
480 long pageSize = sysconf(_SC_PAGESIZE);
482 size_t pageSize = getpagesize();
485 pageMask = pageSize - 1;
486 buf = malloc(size + pageSize +
sizeof(
void *));
488 ERR(
"out of memory");
490 tmp = buf +
sizeof(
char *);
491 aligned = tmp + pageSize - ((size_t) tmp & pageMask);
494 tmp = aligned -
sizeof(
void *);
497 return (
void *)aligned;
505 free(*(
void **)((
char *)buf -
sizeof(
char *)));
535 ERR(
"malloc() of IOR_test_t failed");
536 newTest->
params = *init_params;
555 for (tptr = tests_head; tptr !=
NULL; tptr = next) {
567 int hintCount = 0, i;
571 if (strncmp(
environ[i],
"IOR_HINT", strlen(
"IOR_HINT"))
575 WARN(
"exceeded max hints; reset MAX_HINTS and recompile");
580 strncpy(hint[hintCount - 1],
environ[i],
586 MPI_CHECK(MPI_Bcast(&hintCount,
sizeof(hintCount), MPI_BYTE,
587 0, MPI_COMM_WORLD),
"cannot broadcast hints");
588 for (i = 0; i < hintCount; i++) {
591 "cannot broadcast hints");
592 strcpy(fullHint, hint[i]);
593 strcpy(hintVariable, strtok(fullHint,
"="));
594 if (getenv(hintVariable) ==
NULL) {
596 if (putenv(hint[i]) != 0)
597 WARN(
"cannot set environment variable");
615 unsigned long long hi, lo;
616 unsigned long long *buf = (
unsigned long long *)buffer;
618 for (i = 0; i < test->
transferSize /
sizeof(
unsigned long long); i++) {
632 unsigned long long hi, lo;
633 unsigned long long *buf = (
unsigned long long *)buffer;
646 hi = ((
unsigned long long)fillrank) << 32;
648 for (i = 0; i < test->
transferSize /
sizeof(
unsigned long long); i++) {
654 buf[i] = offset + (i *
sizeof(
unsigned long long));
669 if (uname(&name) != 0) {
670 EWARN(
"cannot get platform name");
671 sprintf(sysName,
"%s",
"Unknown");
672 sprintf(nodeName,
"%s",
"Unknown");
674 sprintf(sysName,
"%s", name.sysname);
675 sprintf(nodeName,
"%s", name.nodename);
679 if (strlen(nodeName) == 0) {
683 p = start + strlen(nodeName) - 1;
690 if (*p < '0' || *p >
'9') {
698 sprintf(platformName,
"%s(%s)", nodeName, sysName);
699 return strdup(platformName);
709 char **fileNames, *tmp, *token;
722 while (*tmp !=
'\0') {
729 fileNames = (
char **)malloc((*count) *
sizeof(
char **));
730 if (fileNames ==
NULL)
731 ERR(
"out of memory");
734 token = strtok(name, delimiterString);
735 while (token !=
NULL) {
736 fileNames[i] = token;
737 token = strtok(
NULL, delimiterString);
752 char testFileNameRoot[
MAX_STR];
760 ERR(
"cannot use multiple file names with unique directories");
762 strcpy(testFileNameRoot,
766 strcpy(testFileNameRoot, fileNames[0]);
776 strcpy(testFileNameRoot,
779 sprintf(testFileName,
"%s.%08d", testFileNameRoot,
782 strcpy(testFileName, testFileNameRoot);
788 strcat(testFileName, tmpString);
803 dir = (
char *)malloc(
MAX_STR + 1);
805 ERR(
"out of memory");
808 strcpy(dir, rootDir);
811 if (dir[i] ==
'\0' || dir[i] ==
'/') {
820 fname = rootDir + i + 1;
826 if (backend->
access(dir, F_OK, test) != 0) {
827 if (backend->
mkdir(dir, S_IRWXU, test) < 0) {
828 ERRF(
"cannot create directory: %s", dir);
832 }
else if (backend->
access(dir, R_OK, test) != 0 ||
833 backend->
access(dir, W_OK, test) != 0 ||
834 backend->
access(dir, X_OK, test) != 0) {
835 ERRF(
"invalid directory permissions: %s", dir);
854 double totalTime, accessTime;
856 double bw, iops, latency, minlatency;
860 assert(access ==
WRITE || access ==
READ);
865 op = i % 2 ? MPI_MAX : MPI_MIN;
866 MPI_CHECK(MPI_Reduce(&timer[i], &reduced[i], 1, MPI_DOUBLE,
871 for (i = 0; i < IOR_NB_TIMERS / 2; i++)
872 diff[i] = reduced[2 * i + 1] - reduced[2 * i];
874 totalTime = reduced[5] - reduced[0];
875 accessTime = reduced[3] - reduced[2];
880 point->
time = totalTime;
897 MPI_CHECK(MPI_Reduce(&latency, &minlatency, 1, MPI_DOUBLE,
898 MPI_MIN, 0,
testComm),
"MPI_Reduce()");
913 int tmpRankOffset = 0;
921 if (backend->
access(testFileName, F_OK, test) == 0) {
926 backend->
delete(testFileName, test);
933 if ((
rank == 0) && (backend->
access(testFileName, F_OK, test) == 0)) {
938 backend->
delete(testFileName, test);
951 int mpiNumTasksOnNode0 = 0;
969 while (tests !=
NULL) {
979 }
else if (params->
numTasks > mpiNumTasks) {
982 "WARNING: More tasks requested (%d) than available (%d),",
1057 page_size = sysconf(_SC_PAGESIZE);
1059 buf = (
char *)malloc(size);
1063 for (ptr = buf; ptr < buf+
size; ptr += page_size) {
1072 int *rankoffs =
NULL;
1073 int *filecont =
NULL;
1074 int *filehits =
NULL;
1079 rankoffs = (
int *)malloc(params->
numTasks *
sizeof(
int));
1080 filecont = (
int *)malloc(params->
numTasks *
sizeof(
int));
1081 filehits = (
int *)malloc(params->
numTasks *
sizeof(
int));
1086 "MPI_Gather error");
1091 memset((
void *)filecont, 0, params->
numTasks *
sizeof(
int));
1092 for (ifile = 0; ifile < params->
numTasks; ifile++) {
1093 filecont[(ifile + rankoffs[ifile]) % params->
numTasks]++;
1095 memset((
void *)filehits, 0, params->
numTasks *
sizeof(
int));
1096 for (ifile = 0; ifile < params->
numTasks; ifile++)
1097 for (jfile = 0; jfile < params->
numTasks; jfile++) {
1098 if (ifile == filecont[jfile])
1106 jfile += filehits[ifile], ifile++;
1139 fprintf(
out_logfile,
"This node hogging %ld bytes of memory\n",
1147 fprintf(
out_logfile,
"This task hogging %ld bytes of memory\n", size);
1151 ERR(
"malloc of simulated applciation buffer failed");
1166 if (access ==
WRITE) {
1169 strcpy(timerName,
"write open start");
1172 strcpy(timerName,
"write open stop");
1175 strcpy(timerName,
"write start");
1178 strcpy(timerName,
"write stop");
1181 strcpy(timerName,
"write close start");
1184 strcpy(timerName,
"write close stop");
1187 strcpy(timerName,
"invalid timer");
1194 strcpy(timerName,
"read open start");
1197 strcpy(timerName,
"read open stop");
1200 strcpy(timerName,
"read start");
1203 strcpy(timerName,
"read stop");
1206 strcpy(timerName,
"read close start");
1209 strcpy(timerName,
"read close stop");
1212 strcpy(timerName,
"invalid timer");
1216 fprintf(
out_logfile,
"Test %d: Iter=%d, Task=%d, Time=%f, %s\n",
1217 test->
id, iteration, (
int)
rank, timer[i],
1234 MPI_Group orig_group, new_group;
1242 "MPI_Comm_group() error");
1246 MPI_CHECK(MPI_Group_range_incl(orig_group, 1, &range, &new_group),
1247 "MPI_Group_range_incl() error");
1249 "MPI_Comm_create() error");
1250 MPI_CHECK(MPI_Group_free(&orig_group),
"MPI_Group_Free() error");
1251 MPI_CHECK(MPI_Group_free(&new_group),
"MPI_Group_Free() error");
1264 "Using reorderTasks '-C' (useful to avoid read cache in client)\n");
1295 if ((currentTime = time(
NULL)) == -1) {
1296 ERR(
"cannot get current time");
1299 (
unsigned int) currentTime;
1302 "Using Time Stamp %u (0x%x) for Data Signature\n",
1313 testComm),
"cannot broadcast start time value");
1340 fd = backend->
create(testFileName, params);
1347 "Commencing write performance test: %s",
1353 fprintf(
out_logfile,
"* data moved = %llu\n", dataMoved);
1361 backend->
close(fd, params);
1395 "Verifying contents of the file(s) just written.\n");
1414 fd = backend->
open(testFileName, params);
1416 backend->
close(fd, params);
1427 fprintf(
out_logfile,
"WARNING: Could not read back the stonewalling status from the file!\n");
1431 int operation_flag =
READ;
1451 unsigned int iseed0;
1453 nodeoffset = (nodeoffset < params->
numNodes) ? nodeoffset : params->
numNodes - 1;
1458 srand(
rank + iseed0);
1486 fd = backend->
open(testFileName, params);
1493 "Commencing read performance test: %s\n",
1497 dataMoved =
WriteOrRead(params, &results[rep], fd, operation_flag, &ioBuffers);
1503 backend->
close(fd, params);
1525 double start, finish;
1552 if (hog_buf !=
NULL)
1570 test, &defaults, repetitions);
1572 ERR(
"too few tasks for testing");
1574 WARN_RESET(
"inter-test delay must be nonnegative value",
1575 test, &defaults, interTestDelay);
1578 ERR(
"test must write, read, or check read/write file");
1580 ERR(
"using readCheck only requires to write a timeStampSignature -- use -G");
1582 ERR(
"segment count must be positive value");
1584 ERR(
"block size must be a multiple of access size");
1586 ERR(
"block size must be non-negative integer");
1588 ERR(
"transfer size must be a multiple of access size");
1590 ERR(
"alignment must be non-negative integer");
1592 ERR(
"transfer size must be non-negative integer");
1594 ERR(
"test will not complete with zero transfer size");
1597 ERR(
"block size must be a multiple of transfer size");
1600 ERR(
"block size must not be smaller than transfer size");
1603 if ((strcasecmp(test->
api,
"MPIIO") == 0)
1606 ERR(
"block/transfer size may not be smaller than IOR_size_t for MPIIO");
1607 if ((strcasecmp(test->
api,
"HDF5") == 0)
1610 ERR(
"block/transfer size may not be smaller than IOR_size_t for HDF5");
1611 if ((strcasecmp(test->
api,
"NCMPI") == 0)
1614 ERR(
"block/transfer size may not be smaller than IOR_size_t for NCMPI");
1616 && (
sizeof(MPI_Aint) < 8)
1619 ERR(
"segment size must be < 2GiB");
1622 test, &defaults, singleXferAttempt);
1623 if (((strcasecmp(test->
api,
"POSIX") != 0)
1624 && (strcasecmp(test->
api,
"MPIIO") != 0)
1625 && (strcasecmp(test->
api,
"MMAP") != 0)
1626 && (strcasecmp(test->
api,
"HDFS") != 0)
1627 && (strcasecmp(test->
api,
"DFS") != 0)
1628 && (strcasecmp(test->
api,
"Gfarm") != 0)
1629 && (strcasecmp(test->
api,
"RADOS") != 0)
1630 && (strcasecmp(test->
api,
"CEPHFS") != 0)) && test->
fsync)
1631 WARN_RESET(
"fsync() not supported in selected backend",
1632 test, &defaults, fsync);
1634 WARN_RESET(
"preallocation only available in MPIIO",
1635 test, &defaults, preallocate);
1637 WARN_RESET(
"file view only available in MPIIO",
1638 test, &defaults, useFileView);
1640 WARN_RESET(
"shared file pointer only available in MPIIO",
1641 test, &defaults, useSharedFilePointer);
1643 WARN_RESET(
"shared file pointer not implemented",
1644 test, &defaults, useSharedFilePointer);
1646 WARN_RESET(
"strided datatype only available in MPIIO",
1647 test, &defaults, useStridedDatatype);
1649 WARN_RESET(
"strided datatype not implemented",
1650 test, &defaults, useStridedDatatype);
1651 if ((strcasecmp(test->
api,
"MPIIO") == 0)
1655 ERR(
"need larger file size for strided datatype in MPIIO");
1656 if ((strcasecmp(test->
api,
"POSIX") == 0) && test->
showHints)
1658 test, &defaults, showHints);
1659 if ((strcasecmp(test->
api,
"POSIX") == 0) && test->
collective)
1660 WARN_RESET(
"collective not available in POSIX",
1661 test, &defaults, collective);
1664 ERR(
"transfer size must be aligned with PAGESIZE for MMAP with fsyncPerWrite");
1668 ERR(
"Both Constant and Random task re-ordering specified. Choose one and resubmit");
1671 ERR(
"random offset and random reorder tasks specified with single-shared-file. Choose one and resubmit");
1674 ERR(
"random offset and constant reorder tasks specified with single-shared-file. Choose one and resubmit");
1676 ERR(
"random offset not available with read check option (use write check)");
1678 ERR(
"random offset not available with store file offset option)");
1683 ERR(
"random offset not available with collective MPIIO");
1686 ERR(
"random offset not available with MPIIO fileviews");
1688 ERR(
"random offset not available with HDF5");
1690 ERR(
"random offset not available with NCMPI");
1692 WARN_RESET(
"individual datasets only available in HDF5",
1693 test, &defaults, individualDataSets);
1695 WARN_RESET(
"individual data sets not implemented",
1696 test, &defaults, individualDataSets);
1698 ERR(
"file-per-proc not available in current NCMPI");
1700 if (strcasecmp(test->
api,
"HDF5") != 0) {
1701 ERR(
"'no fill' option only available in HDF5");
1704 #if defined (H5_VERS_MAJOR) && defined (H5_VERS_MINOR) 1706 #if (H5_VERS_MAJOR > 0 && H5_VERS_MINOR > 5) 1709 ERRF(
"'no fill' option not available in %s",
1713 WARN(
"unable to determine HDF5 version for 'no fill' usage");
1718 ERR(
"Lustre stripe options are incompatible with useExistingTestFile");
1724 ERR(
"The backend returned that the test parameters are invalid.");
1748 if (offsetArray ==
NULL)
1749 ERR(
"malloc() failed");
1750 offsetArray[offsets] = -1;
1767 return (offsetArray);
1795 if (access ==
WRITE || access ==
READ) {
1812 if ((rand() % test->
numTasks) == pretendRank) {
1823 if (offsetArray ==
NULL)
1824 ERR(
"malloc() failed");
1825 offsetArray[offsets] = -1;
1829 for (i = 0; i < offsets; i++) {
1836 if ((rand() % test->
numTasks) == pretendRank) {
1837 offsetArray[offsetCnt] = i;
1843 for (i = 0; i < offsets; i++) {
1844 value = rand() % offsets;
1845 tmp = offsetArray[value];
1846 offsetArray[value] = offsetArray[i];
1847 offsetArray[i] = tmp;
1851 return (offsetArray);
1859 void *buffer = ioBuffers->
buffer;
1863 test->
offset = offsetArray[pairCnt];
1866 if (access ==
WRITE) {
1873 backend->
xfer(access, fd, buffer, transfer, test);
1874 if (amtXferred != transfer)
1875 ERR(
"cannot write to file");
1878 nanosleep( & wait,
NULL);
1880 }
else if (access ==
READ) {
1882 backend->
xfer(access, fd, buffer, transfer, test);
1883 if (amtXferred != transfer)
1884 ERR(
"cannot read from file");
1887 nanosleep( & wait,
NULL);
1890 memset(checkBuffer,
'a', transfer);
1896 amtXferred = backend->
xfer(access, fd, checkBuffer, transfer, test);
1897 if (amtXferred != transfer)
1898 ERR(
"cannot read from file write check");
1900 *errors +=
CompareBuffers(readCheckBuffer, checkBuffer, transfer,
1901 *transferCount, test,
1904 memset(checkBuffer,
'a', transfer);
1906 amtXferred = backend->
xfer(access, fd, checkBuffer, transfer, test);
1907 if (amtXferred != transfer){
1908 ERR(
"cannot read from file");
1927 uint64_t pairCnt = 0;
1931 double startForStonewall;
1949 while ((offsetArray[pairCnt] != -1) && !hitStonewall ) {
1950 dataMoved +=
WriteOrReadSingle(pairCnt, offsetArray, pretendRank, & transferCount, & errors, test, fd, ioBuffers, access);
1960 MPI_CHECK(MPI_Bcast(&hitStonewall, 1, MPI_INT, 0, MPI_COMM_WORLD),
"hitStonewall broadcast failed");
1966 fprintf(
out_logfile,
"%d: stonewalling pairs accessed: %lld\n",
rank, (
long long) pairCnt);
1968 long long data_moved_ll = (
long long) dataMoved;
1969 long long pairs_accessed_min = 0;
1971 1, MPI_LONG_LONG_INT, MPI_MAX,
testComm),
"cannot reduce pairs moved");
1972 double stonewall_runtime =
GetTimeStamp() - startForStonewall;
1974 MPI_CHECK(MPI_Reduce(& pairCnt, & pairs_accessed_min,
1975 1, MPI_LONG_LONG_INT, MPI_MIN, 0,
testComm),
"cannot reduce pairs moved");
1977 1, MPI_LONG_LONG_INT, MPI_MIN, 0,
testComm),
"cannot reduce pairs moved");
1979 1, MPI_LONG_LONG_INT, MPI_SUM, 0,
testComm),
"cannot reduce pairs moved");
1982 fprintf(
out_logfile,
"stonewalling pairs accessed min: %lld max: %zu -- min data: %.1f GiB mean data: %.1f GiB time: %.1fs\n",
1990 dataMoved +=
WriteOrReadSingle(pairCnt, offsetArray, pretendRank, & transferCount, & errors, test, fd, ioBuffers, access);
2003 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)