Commit c11168eb authored by Rob Latham's avatar Rob Latham
Browse files

merge with trunk


git-svn-id: https://svn.mcs.anl.gov/repos/darshan/branches/more-pnetcdf@312 3b7491f3-a168-0410-bf4b-c445ed680a29
parents ccb11887 b7e1f5d3
......@@ -2,13 +2,26 @@
Darshan Release Change Log
--------------------------
darshan-2.0.0-pre1
==================
* introduce new output file format that is portable across architectures, with
reader-makes-right byte swapping
* enable darshan-job-summary.pl to open output files directly without using
intermediate darshan-parser output
* backwards compatibility to version 1.1.0
darshan-2.0.0
=============
* new output file format that is portable across architectures
NOTE: Darshan 1.x output files are incompatible with the tools in this
release unless they were generated on a ppc32 architecture (Blue Gene)
* 8 new counters that record the rank of the fastest and slowest process that
opened each shared file, along with the number of seconds and number of
bytes consumed by those processes. It also reports the variance in both
time and amount of data.
* new --with-jobid-env configure argument to support recording job identifiers
from different schedulers
* job ID is now recorded within the Darshan log in addition to in the file
name
* darshan-job-summary.pl:
* opens output files directly without using intermediate darshan-parser output
* table showing data usage per file system
* table showing I/O balance in shared files
* Fixes for bugs reported by Noah Watkins:
* avoid name collision in hashing function
* divide by zero error in darshan-job-summary.pl
darshan-1.1.14
==============
......
This diff is collapsed.
......@@ -66,7 +66,9 @@ AC_ARG_WITH(log-path,
)
AC_ARG_WITH(jobid-env,
[ --with-jobid-env=<name> Name of environment variable that stores the jobid ],
[ --with-jobid-env=<name> Name of environment variable that stores the jobid
(specify "NONE" if no appropriate environment variable is available:
Darshan will use rank 0's pid instead)],
if test x$withval = xyes; then
AC_MSG_ERROR(--with-jobid-env must be given a name)
else
......
/* darshan-config.h.in. Generated from configure.in by autoheader. */
/* Define if building universal (internal helper macro) */
#undef AC_APPLE_UNIVERSAL_BUILD
/* Name of the environment variable that stores the jobid */
#undef CP_JOBID
......@@ -48,18 +51,29 @@
/* Define to the one symbol short name of this package. */
#undef PACKAGE_TARNAME
/* Define to the home page for this package. */
#undef PACKAGE_URL
/* Define to the version of this package. */
#undef PACKAGE_VERSION
/* The size of a `long int', as computed by sizeof. */
/* The size of `long int', as computed by sizeof. */
#undef SIZEOF_LONG_INT
/* Define to 1 if you have the ANSI C header files. */
#undef STDC_HEADERS
/* Define to 1 if your processor stores words with the most significant byte
first (like Motorola and SPARC, unlike Intel and VAX). */
#undef WORDS_BIGENDIAN
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
significant byte first (like Motorola and SPARC, unlike Intel). */
#if defined AC_APPLE_UNIVERSAL_BUILD
# if defined __BIG_ENDIAN__
# define WORDS_BIGENDIAN 1
# endif
#else
# ifndef WORDS_BIGENDIAN
# undef WORDS_BIGENDIAN
# endif
#endif
/* Location to store log files at run time */
#undef __CP_LOG_PATH
......
......@@ -182,6 +182,10 @@ enum darshan_indices
CP_ACCESS4_COUNT,
CP_DEVICE, /* device id reported by stat */
CP_SIZE_AT_OPEN,
CP_FASTEST_RANK,
CP_FASTEST_RANK_BYTES,
CP_SLOWEST_RANK,
CP_SLOWEST_RANK_BYTES,
CP_NUM_INDICES,
};
......@@ -203,8 +207,15 @@ enum f_darshan_indices
CP_F_MPI_WRITE_TIME, /* cumulative mpi-io write time */
CP_F_MAX_READ_TIME,
CP_F_MAX_WRITE_TIME,
CP_F_FASTEST_RANK_TIME,
CP_F_SLOWEST_RANK_TIME,
CP_F_VARIANCE_RANK_TIME,
CP_F_VARIANCE_RANK_BYTES,
CP_F_NC_READ_TIME,
CP_F_NC_WRITE_TIME,
CP_F_NUM_INDICES,
};
......
......@@ -152,6 +152,10 @@ char *darshan_names[] = {
"CP_ACCESS4_COUNT",
"CP_DEVICE",
"CP_SIZE_AT_OPEN",
"CP_FASTEST_RANK",
"CP_FASTEST_RANK_BYTES",
"CP_SLOWEST_RANK",
"CP_SLOWEST_RANK_BYTES",
"CP_NUM_INDICES"
};
......@@ -172,9 +176,13 @@ char *darshan_f_names[] = {
"CP_F_MPI_WRITE_TIME", /* cumulative mpi-io write time */
"CP_F_MAX_READ_TIME",
"CP_F_MAX_WRITE_TIME",
"CP_F_FASTEST_RANK_TIME",
"CP_F_SLOWEST_RANK_TIME",
"CP_F_VARIANCE_RANK_TIME",
"CP_F_VARIANCE_RANK_BYTES",
"CP_F_NC_READ_TIME", /* cumulative time in pnetcdf reads */
"CP_F_NC_WRITE_TIME", /* cumulative time in pnetcdf writes */
"CP_F_NUM_INDICES",
"CP_F_NUM_INDICES"
};
/* function pointers so that we can switch functions depending on what file
......@@ -199,6 +207,7 @@ static int getfile_internal_121(darshan_fd fd, struct darshan_job *job,
struct darshan_file *file);
static int getfile_internal_1x(darshan_fd fd, struct darshan_job *job,
struct darshan_file *file, int n_counters, int n_fcounters);
static void shift_missing_1_24(struct darshan_file* file);
static void shift_missing_1_22(struct darshan_file* file);
static void shift_missing_1_21(struct darshan_file* file);
......@@ -438,13 +447,31 @@ void darshan_log_print_version_warnings(struct darshan_job *job)
if(strcmp(job->version_string, "1.24") == 0)
{
printf("# WARNING: version 1.24 log format does not store the job id in the log file.\n");
printf("# WARNING: version 1.24 log format does not support the following parameters:\n");
printf("# CP_FASTEST_RANK\n");
printf("# CP_FASTEST_RANK_BYTES\n");
printf("# CP_SLOWEST_RANK\n");
printf("# CP_SLOWEST_RANK_BYTES\n");
printf("# CP_F_FASTEST_RANK_TIME\n");
printf("# CP_F_SLOWEST_RANK_TIME\n");
printf("# CP_F_VARIANCE_RANK_TIME\n");
printf("# CP_F_VARIANCE_RANK_BYTES\n");
printf("# It also does not store the job id in the log file.\n");
return;
}
if(strcmp(job->version_string, "1.23") == 0)
{
printf("# WARNING: version 1.23 log format may have incorrect mount point mappings for files with rank > 0\n");
printf("# WARNING: version 1.23 log format does not support the following parameters:\n");
printf("# CP_FASTEST_RANK\n");
printf("# CP_FASTEST_RANK_BYTES\n");
printf("# CP_SLOWEST_RANK\n");
printf("# CP_SLOWEST_RANK_BYTES\n");
printf("# CP_F_FASTEST_RANK_TIME\n");
printf("# CP_F_SLOWEST_RANK_TIME\n");
printf("# CP_F_VARIANCE_RANK_TIME\n");
printf("# CP_F_VARIANCE_RANK_BYTES\n");
printf("# It also may have incorrect mount point mappings for files with rank > 0\n");
printf("# It also does not store the job id in the log file.\n");
return;
}
......@@ -454,6 +481,14 @@ void darshan_log_print_version_warnings(struct darshan_job *job)
printf("# WARNING: version 1.22 log format does not support the following parameters:\n");
printf("# CP_DEVICE\n");
printf("# CP_SIZE_AT_OPEN\n");
printf("# CP_FASTEST_RANK\n");
printf("# CP_FASTEST_RANK_BYTES\n");
printf("# CP_SLOWEST_RANK\n");
printf("# CP_SLOWEST_RANK_BYTES\n");
printf("# CP_F_FASTEST_RANK_TIME\n");
printf("# CP_F_SLOWEST_RANK_TIME\n");
printf("# CP_F_VARIANCE_RANK_TIME\n");
printf("# CP_F_VARIANCE_RANK_BYTES\n");
printf("# It does not record mounted file systems, mount points, or fs types.\n");
printf("# It attributes syncs to cumulative metadata time, rather than cumulative write time.\n");
printf("# It also does not store the job id in the log file.\n");
......@@ -472,6 +507,14 @@ void darshan_log_print_version_warnings(struct darshan_job *job)
printf("# CP_SIZE_AT_OPEN\n");
printf("# CP_F_MAX_READ_TIME\n");
printf("# CP_F_MAX_WRITE_TIME\n");
printf("# CP_FASTEST_RANK\n");
printf("# CP_FASTEST_RANK_BYTES\n");
printf("# CP_SLOWEST_RANK\n");
printf("# CP_SLOWEST_RANK_BYTES\n");
printf("# CP_F_FASTEST_RANK_TIME\n");
printf("# CP_F_SLOWEST_RANK_TIME\n");
printf("# CP_F_VARIANCE_RANK_TIME\n");
printf("# CP_F_VARIANCE_RANK_BYTES\n");
printf("# It does not record mounted file systems, mount points, or fs types.\n");
printf("# It attributes syncs to cumulative metadata time, rather than cumulative write time.\n");
printf("#\n");
......@@ -499,13 +542,20 @@ void darshan_log_print_version_warnings(struct darshan_job *job)
* - CP_MAX_WRITE_TIME_SIZE
* - CP_DEVICE
* - CP_SIZE_AT_OPEN
* - CP_FASTEST_RANK
* - CP_FASTEST_RANK_BYTES
* - CP_SLOWEST_RANK
* - CP_SLOWEST_RANK_BYTES
* - CP_F_MAX_READ_TIME
* - CP_F_MAX_WRITE_TIME
* - CP_F_FASTEST_RANK_TIME
* - CP_F_SLOWEST_RANK_TIME
* - CP_F_VARIANCE_RANK_TIME
* - CP_F_VARIANCE_RANK_BYTES
* - changed params:
* - CP_FILE_RECORD_SIZE: 1184 to 1248
* - CP_NUM_INDICES: 133 to 140
* - CP_F_NUM_INDICES: 12 to 14
* - so 60 bytes worth of new indices are the only difference
* - CP_FILE_RECORD_SIZE: 1184 to 1328
* - CP_NUM_INDICES: 133 to 144
* - CP_F_NUM_INDICES: 12 to 18
*/
static void shift_missing_1_21(struct darshan_file* file)
{
......@@ -518,10 +568,18 @@ static void shift_missing_1_21(struct darshan_file* file)
CP_MAX_WRITE_TIME_SIZE,
CP_DEVICE,
CP_SIZE_AT_OPEN,
CP_FASTEST_RANK,
CP_FASTEST_RANK_BYTES,
CP_SLOWEST_RANK,
CP_SLOWEST_RANK_BYTES,
-1};
int missing_f_counters[] = {
CP_F_MAX_READ_TIME,
CP_F_MAX_WRITE_TIME,
CP_F_FASTEST_RANK_TIME,
CP_F_SLOWEST_RANK_TIME,
CP_F_VARIANCE_RANK_TIME,
CP_F_VARIANCE_RANK_BYTES,
-1};
c_index = 0;
......@@ -570,9 +628,18 @@ static void shift_missing_1_21(struct darshan_file* file)
* - added:
* - CP_DEVICE
* - CP_SIZE_AT_OPEN
* - CP_FASTEST_RANK
* - CP_FASTEST_RANK_BYTES
* - CP_SLOWEST_RANK
* - CP_SLOWEST_RANK_BYTES
* - CP_F_FASTEST_RANK_TIME
* - CP_F_SLOWEST_RANK_TIME
* - CP_F_VARIANCE_RANK_TIME
* - CP_F_VARIANCE_RANK_BYTES
* - changed params:
* - CP_FILE_RECORD_SIZE: 1240 to 1248
* - CP_NUM_INDICES: 138 to 140
* - CP_FILE_RECORD_SIZE: 1240 to 1328
* - CP_NUM_INDICES: 138 to 144
* - CP_F_NUM_INDICES: 14 to 18
*/
static void shift_missing_1_22(struct darshan_file* file)
{
......@@ -580,6 +647,16 @@ static void shift_missing_1_22(struct darshan_file* file)
int missing_counters[] = {
CP_DEVICE,
CP_SIZE_AT_OPEN,
CP_FASTEST_RANK,
CP_FASTEST_RANK_BYTES,
CP_SLOWEST_RANK,
CP_SLOWEST_RANK_BYTES,
-1};
int missing_f_counters[] = {
CP_F_FASTEST_RANK_TIME,
CP_F_SLOWEST_RANK_TIME,
CP_F_VARIANCE_RANK_TIME,
CP_F_VARIANCE_RANK_BYTES,
-1};
c_index = 0;
......@@ -598,9 +675,99 @@ static void shift_missing_1_22(struct darshan_file* file)
file->counters[missing_counter] = 0;
}
c_index = 0;
while(missing_f_counters[c_index] != -1)
{
int missing_counter = missing_f_counters[c_index];
c_index++;
if(missing_counter < (CP_F_NUM_INDICES - 1))
{
/* shift down */
memmove(&file->fcounters[missing_counter+1],
&file->fcounters[missing_counter],
(CP_F_NUM_INDICES-missing_counter-1)*sizeof(double));
}
/* zero out missing counter */
file->fcounters[missing_counter] = 0;
}
return;
}
/* shift_missing_1_24()
*
* translates indices to account for counters that weren't present in log
* format 1.24
*/
/*******************************
* version 1.24 to 2.00 differences
*
* - added:
* - CP_FASTEST_RANK
* - CP_FASTEST_RANK_BYTES
* - CP_SLOWEST_RANK
* - CP_SLOWEST_RANK_BYTES
* - CP_F_FASTEST_RANK_TIME
* - CP_F_SLOWEST_RANK_TIME
* - CP_F_VARIANCE_RANK_TIME
* - CP_F_VARIANCE_RANK_BYTES
* - changed params:
* - CP_FILE_RECORD_SIZE: ? to 1328
* - CP_NUM_INDICES: 140 to 144
* - CP_F_NUM_INDICES: 14 to 18
*/
static void shift_missing_1_24(struct darshan_file* file)
{
int c_index = 0;
int missing_counters[] = {
CP_FASTEST_RANK,
CP_FASTEST_RANK_BYTES,
CP_SLOWEST_RANK,
CP_SLOWEST_RANK_BYTES,
-1};
int missing_f_counters[] = {
CP_F_FASTEST_RANK_TIME,
CP_F_SLOWEST_RANK_TIME,
CP_F_VARIANCE_RANK_TIME,
CP_F_VARIANCE_RANK_BYTES,
-1};
c_index = 0;
while(missing_counters[c_index] != -1)
{
int missing_counter = missing_counters[c_index];
c_index++;
if(missing_counter < (CP_NUM_INDICES - 1))
{
/* shift down */
memmove(&file->counters[missing_counter+1],
&file->counters[missing_counter],
(CP_NUM_INDICES-missing_counter-1)*sizeof(int64_t));
}
/* zero out missing counter */
file->counters[missing_counter] = 0;
}
c_index = 0;
while(missing_f_counters[c_index] != -1)
{
int missing_counter = missing_f_counters[c_index];
c_index++;
if(missing_counter < (CP_F_NUM_INDICES - 1))
{
/* shift down */
memmove(&file->fcounters[missing_counter+1],
&file->fcounters[missing_counter],
(CP_F_NUM_INDICES-missing_counter-1)*sizeof(double));
}
/* zero out missing counter */
file->fcounters[missing_counter] = 0;
}
return;
}
static int getjob_internal_200(darshan_fd file, struct darshan_job *job)
{
int ret;
......@@ -766,7 +933,15 @@ static int getjob_internal_124(darshan_fd fd, struct darshan_job *job)
static int getfile_internal_124(darshan_fd fd, struct darshan_job *job,
struct darshan_file *file)
{
return(getfile_internal_1x(fd, job, file, 140, 14));
int ret;
ret = getfile_internal_1x(fd, job, file, 140, 14);
if(ret <= 0)
return(ret);
shift_missing_1_24(file);
return(1);
}
static int getfile_internal_122(darshan_fd fd, struct darshan_job *job,
......
......@@ -139,6 +139,7 @@ int main(int argc, char **argv)
printf("# CP_ACCESS*_COUNT: count of the four most common access sizes.\n");
printf("# CP_DEVICE: device id reported by stat().\n");
printf("# CP_SIZE_AT_OPEN: size of file when first opened.\n");
printf("# CP_*_RANK_BYTES: fastest, slowest and variance of bytes transfer.\n");
printf("# CP_F_OPEN_TIMESTAMP: timestamp of first open (mpi or posix).\n");
printf("# CP_F_*_START_TIMESTAMP: timestamp of first read/write (mpi or posix).\n");
printf("# CP_F_*_END_TIMESTAMP: timestamp of last read/write (mpi or posix).\n");
......@@ -148,6 +149,7 @@ int main(int argc, char **argv)
printf("# CP_F_POSIX_META_TIME: cumulative time spent in posix open, close, fsync, stat and seek, .\n");
printf("# CP_F_MPI_META_TIME: cumulative time spent in mpi-io open, close, set_view, and sync.\n");
printf("# CP_MAX_*_TIME: duration of the slowest read and write operations.\n");
printf("# CP_*_RANK_TIME: fastest, slowest variance of transfer time.\n");
printf("\n");
......
......@@ -204,7 +204,7 @@ void darshan_shutdown_bench(int argc, char** argv, int rank, int nprocs);
void darshan_walk_file_accesses(struct darshan_job_runtime* final_job);
double darshan_wtime(void);
uint32_t hashlittle(const void *key, size_t length, uint32_t initval);
uint64_t hash(register unsigned char *k, register uint64_t length, register uint64_t level);
uint32_t darshan_hashlittle(const void *key, size_t length, uint32_t initval);
uint64_t darshan_hash(register unsigned char *k, register uint64_t length, register uint64_t level);
#endif /* __DARSHAN_H */
......@@ -131,6 +131,13 @@ static int cp_log_compress(struct darshan_job_runtime* final_job,
static int file_compare(const void* a, const void* b);
static void darshan_mpi_initialize(int *argc, char ***argv);
static char* darshan_get_exe_and_mounts(struct darshan_job_runtime* final_job);
static int darshan_file_variance(
struct darshan_file *infile_array,
struct darshan_file *outfile_array,
int count, int rank);
static void pairwise_variance_reduce (
void *invec, void *inoutvec, int *len, MPI_Datatype *dt);
#define CP_MAX_MNTS 32
uint64_t mnt_hash_array[CP_MAX_MNTS] = {0};
......@@ -143,6 +150,13 @@ struct
int64_t mnt_id_root;
} mnt_mapping[CP_MAX_MNTS];
struct variance_dt
{
double n;
double T;
double S;
};
int MPI_Init(int *argc, char ***argv)
{
int ret;
......@@ -543,7 +557,7 @@ int MPI_File_open(MPI_Comm comm, char *filename, int amode, MPI_Info info, MPI_F
{
CP_INC(file, CP_HINTS, 1);
}
tmp_hash = hash((void*)fh, sizeof(*fh), 0);
tmp_hash = darshan_hash((void*)fh, sizeof(*fh), 0);
hash_index = tmp_hash & CP_HASH_MASK;
file->fh_prev = NULL;
file->fh_next = darshan_global_job->fh_table[hash_index];
......@@ -580,7 +594,7 @@ int MPI_File_close(MPI_File *fh)
if(file->fh_prev == NULL)
{
/* head of fh hash table list */
tmp_hash = hash((void*)&tmp_fh, sizeof(tmp_fh), 0);
tmp_hash = darshan_hash((void*)&tmp_fh, sizeof(tmp_fh), 0);
hash_index = tmp_hash & CP_HASH_MASK;
darshan_global_job->fh_table[hash_index] = file->fh_next;
if(file->fh_next)
......@@ -1031,7 +1045,7 @@ static struct darshan_file_runtime* darshan_file_by_fh(MPI_File fh)
return(darshan_global_job->darshan_mru_file);
}
tmp_hash = hash((void*)(&fh), sizeof(fh), 0);
tmp_hash = darshan_hash((void*)(&fh), sizeof(fh), 0);
/* search hash table */
hash_index = tmp_hash & CP_HASH_MASK;
......@@ -1134,6 +1148,31 @@ static int cp_log_reduction(struct darshan_job_runtime* final_job, int rank,
{
if(final_job->file_array[j].hash == hash_array[i])
{
/*
* Initialize fastest/slowest info prior
* to the reduction.
*/
final_job->file_array[j].counters[CP_FASTEST_RANK] =
final_job->file_array[j].rank;
final_job->file_array[j].counters[CP_FASTEST_RANK_BYTES] =
final_job->file_array[j].counters[CP_BYTES_READ] +
final_job->file_array[j].counters[CP_BYTES_WRITTEN];
final_job->file_array[j].fcounters[CP_F_FASTEST_RANK_TIME] =
final_job->file_array[j].fcounters[CP_F_POSIX_META_TIME] +
final_job->file_array[j].fcounters[CP_F_POSIX_READ_TIME] +
final_job->file_array[j].fcounters[CP_F_POSIX_WRITE_TIME];
final_job->file_array[j].counters[CP_SLOWEST_RANK] =
final_job->file_array[j].rank;
final_job->file_array[j].counters[CP_SLOWEST_RANK_BYTES] =
final_job->file_array[j].counters[CP_BYTES_READ] +
final_job->file_array[j].counters[CP_BYTES_WRITTEN];
final_job->file_array[j].fcounters[CP_F_SLOWEST_RANK_TIME] =
final_job->file_array[j].fcounters[CP_F_POSIX_META_TIME] +
final_job->file_array[j].fcounters[CP_F_POSIX_READ_TIME] +
final_job->file_array[j].fcounters[CP_F_POSIX_WRITE_TIME];
final_job->file_array[j].rank = -1;
break;
}
......@@ -1169,6 +1208,14 @@ static int cp_log_reduction(struct darshan_job_runtime* final_job, int rank,
return(-1);
}
ret = darshan_file_variance(
&final_job->file_array[final_job->file_count-shared_count],
tmp_array, shared_count, rank);
if (ret)
{
return(-1);
}
if(rank == 0)
{
/* root replaces local files with shared ones */
......@@ -1383,6 +1430,48 @@ static void darshan_file_reduce(void* infile_v,
inoutfile->counters[CP_MAX_READ_TIME_SIZE];
}
/* min */
if(infile->counters[CP_F_FASTEST_RANK_TIME] <
inoutfile->counters[CP_F_FASTEST_RANK_TIME])
{
tmp_file.counters[CP_FASTEST_RANK] =
infile->counters[CP_FASTEST_RANK];
tmp_file.counters[CP_FASTEST_RANK_BYTES] =
infile->counters[CP_FASTEST_RANK_BYTES];
tmp_file.fcounters[CP_F_FASTEST_RANK_TIME] =
infile->fcounters[CP_F_FASTEST_RANK_TIME];
}
else
{
tmp_file.counters[CP_FASTEST_RANK] =
inoutfile->counters[CP_FASTEST_RANK];
tmp_file.counters[CP_FASTEST_RANK_BYTES] =
inoutfile->counters[CP_FASTEST_RANK_BYTES];
tmp_file.fcounters[CP_F_FASTEST_RANK_TIME] =
inoutfile->fcounters[CP_F_FASTEST_RANK_TIME];
}
/* max */
if(infile->fcounters[CP_F_SLOWEST_RANK_TIME] >
inoutfile->fcounters[CP_F_SLOWEST_RANK_TIME])
{
tmp_file.counters[CP_SLOWEST_RANK] =
infile->counters[CP_SLOWEST_RANK];
tmp_file.counters[CP_SLOWEST_RANK_BYTES] =
infile->counters[CP_SLOWEST_RANK_BYTES];
tmp_file.fcounters[CP_F_SLOWEST_RANK_TIME] =
infile->fcounters[CP_F_SLOWEST_RANK_TIME];
}
else
{
tmp_file.counters[CP_SLOWEST_RANK] =
inoutfile->counters[CP_SLOWEST_RANK];
tmp_file.counters[CP_SLOWEST_RANK_BYTES] =
inoutfile->counters[CP_SLOWEST_RANK_BYTES];
tmp_file.fcounters[CP_F_SLOWEST_RANK_TIME] =
inoutfile->fcounters[CP_F_SLOWEST_RANK_TIME];
}
/* pick one device id and file size */
tmp_file.counters[CP_DEVICE] = infile->counters[CP_DEVICE];
tmp_file.counters[CP_SIZE_AT_OPEN] = infile->counters[CP_SIZE_AT_OPEN];
......@@ -1724,8 +1813,7 @@ static char* darshan_get_exe_and_mounts(struct darshan_job_runtime* final_job)
NULL
};
/* extra byte for \0 already accounted for */
space_left = CP_EXE_LEN;
space_left = CP_EXE_LEN + 1;
trailing_data = malloc(space_left);
if(!trailing_data)
{
......@@ -1767,7 +1855,7 @@ static char* darshan_get_exe_and_mounts(struct darshan_job_runtime* final_job)
if(mnt_array_index < CP_MAX_MNTS)
{
mnt_hash_array[mnt_array_index] =
hash((void*)entry->mnt_dir, strlen(entry->mnt_dir), 0);
darshan_hash((void*)entry->mnt_dir, strlen(entry->mnt_dir), 0);
mnt_id_array[mnt_array_index] = tmp_st_dev;
mnt_array_index++;
}
......@@ -1793,6 +1881,146 @@ static char* darshan_get_exe_and_mounts(struct darshan_job_runtime* final_job)
return(trailing_data);
}
/*
* Computes population variance of bytes moved and total time
* for each rank on a shared file.
*/
static int darshan_file_variance(
struct darshan_file *infile_array,
struct darshan_file *outfile_array,
int count, int rank)
{
MPI_Op pw_var_op;
MPI_Datatype var_dt;