/* * Copyright (C) 2015 University of Chicago. * See COPYRIGHT notice in top-level directory. * */ #include #include #include #include #include #include #include #include #include #include #include #include "darshan-logutils.h" #include "darshan-mpiio-logutils.h" #include "uthash-1.9.2/src/uthash.h" int main(int argc, char **argv) { int ret; int i; char *filename; char tmp_string[4096]; darshan_fd fd; struct darshan_header header; struct darshan_job job; struct darshan_record_ref *rec_hash = NULL; struct darshan_record_ref *ref; int mount_count; char** mnt_pts; char** fs_types; time_t tmp_time = 0; char *token; char *save; char buffer[DARSHAN_JOB_METADATA_LEN]; struct darshan_mpiio_file next_file; assert(argc == 2); filename = argv[1]; struct stat sbuf; stat(filename, &sbuf); fd = darshan_log_open(filename, "r"); if(!fd) { fprintf(stderr, "darshan_log_open() failed to open %s\n.", filename); return(-1); } /**************************************************************/ /* TODO: some of this code should be shared or in a separate executable * instead of repeated in each module parser */ /* read darshan log header */ ret = darshan_log_getheader(fd, &header); if(ret < 0) { fprintf(stderr, "darshan_log_getheader() failed to read log header.\n"); darshan_log_close(fd); return(-1); } /* read darshan job info */ ret = darshan_log_getjob(fd, &job); if(ret < 0) { fprintf(stderr, "darshan_log_getjob() failed to read job data.\n"); darshan_log_close(fd); return(-1); } /* get the original command line for this job */ ret = darshan_log_getexe(fd, tmp_string); if(ret < 0) { fprintf(stderr, "Error: unable to read trailing job information.\n"); darshan_log_close(fd); return(-1); } /* print job summary */ printf("# darshan log version: %s\n", header.version_string); printf("# size of MPIIO file statistics: %zu bytes\n", sizeof(struct darshan_mpiio_file)); printf("# size of job statistics: %zu bytes\n", sizeof(struct darshan_job)); printf("# exe: %s\n", tmp_string); printf("# uid: %" PRId64 "\n", job.uid); printf("# jobid: %" PRId64 "\n", job.jobid); printf("# start_time: %" PRId64 "\n", job.start_time); tmp_time += job.start_time; printf("# start_time_asci: %s", ctime(&tmp_time)); printf("# end_time: %" PRId64 "\n", job.end_time); tmp_time = 0; tmp_time += job.end_time; printf("# end_time_asci: %s", ctime(&tmp_time)); printf("# nprocs: %" PRId64 "\n", job.nprocs); printf("# run time: %" PRId64 "\n", job.end_time - job.start_time + 1); for(token=strtok_r(job.metadata, "\n", &save); token != NULL; token=strtok_r(NULL, "\n", &save)) { char *key; char *value; /* NOTE: we intentionally only split on the first = character. * There may be additional = characters in the value portion * (for example, when storing mpi-io hints). */ strcpy(buffer, token); key = buffer; value = index(buffer, '='); if(!value) continue; /* convert = to a null terminator to split key and value */ value[0] = '\0'; value++; printf("# metadata: %s = %s\n", key, value); } /* get the mount information for this log */ ret = darshan_log_getmounts(fd, &mnt_pts, &fs_types, &mount_count); if(ret < 0) { fprintf(stderr, "darshan_log_getmounts() failed to read mount information.\n"); darshan_log_close(fd); return(-1); } /* print table of mounted file systems */ printf("\n# mounted file systems (mount point and fs type)\n"); printf("# -------------------------------------------------------\n"); for(i=0; irec.name, next_file.rank); /* TODO: does it make sense to put these in a header or something? * Down side of listing them here is ordering dependency between enum * in header and names here. */ printf( "\t\tMPIIO_INDEP_OPENS:\t%"PRIu64"\n" "\t\tMPIIO_COLL_OPENS:\t%"PRIu64"\n" "\t\tMPIIO_INDEP_READS:\t%"PRIu64"\n" "\t\tMPIIO_INDEP_WRITES:\t%"PRIu64"\n" "\t\tMPIIO_COLL_READS:\t%"PRIu64"\n" "\t\tMPIIO_COLL_WRITES:\t%"PRIu64"\n" "\t\tMPIIO_SPLIT_READS:\t%"PRIu64"\n" "\t\tMPIIO_SPLIT_WRITES:\t%"PRIu64"\n" "\t\tMPIIO_NB_READS:\t%"PRIu64"\n" "\t\tMPIIO_NB_WRITES:\t%"PRIu64"\n" "\t\tMPIIO_SYNCS:\t%"PRIu64"\n" "\t\tMPIIO_HINTS:\t%"PRIu64"\n" "\t\tMPIIO_VIEWS:\t%"PRIu64"\n" "\t\tMPIIO_F_OPEN_TIMESTAMP:\t%lf\n" "\t\tMPIIO_F_CLOSE_TIMESTAMP:\t%lf\n" "\t\tMPIIO_F_READ_TIME:\t%lf\n" "\t\tMPIIO_F_WRITE_TIME:\t%lf\n" "\t\tMPIIO_F_META_TIME:\t%lf\n", next_file.counters[MPIIO_INDEP_OPENS], next_file.counters[MPIIO_COLL_OPENS], next_file.counters[MPIIO_INDEP_READS], next_file.counters[MPIIO_INDEP_WRITES], next_file.counters[MPIIO_COLL_READS], next_file.counters[MPIIO_COLL_WRITES], next_file.counters[MPIIO_SPLIT_READS], next_file.counters[MPIIO_SPLIT_WRITES], next_file.counters[MPIIO_NB_READS], next_file.counters[MPIIO_NB_WRITES], next_file.counters[MPIIO_SYNCS], next_file.counters[MPIIO_HINTS], next_file.counters[MPIIO_VIEWS], next_file.fcounters[MPIIO_F_OPEN_TIMESTAMP], next_file.fcounters[MPIIO_F_CLOSE_TIMESTAMP], next_file.fcounters[MPIIO_F_READ_TIME], next_file.fcounters[MPIIO_F_WRITE_TIME], next_file.fcounters[MPIIO_F_META_TIME]); i++; } while((ret = darshan_log_get_mpiio_file(fd, &next_file)) == 1); /* free mount info */ for(i=0; i 0) { free(mnt_pts); free(fs_types); } darshan_log_close(fd); return(0); }