darshan-parser.c 5.98 KB
Newer Older
1 2 3 4 5
/*
 *  (C) 2009 by Argonne National Laboratory.
 *      See COPYRIGHT in top-level directory.
 */

6 7 8 9 10 11 12 13 14
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <zlib.h>
#include <time.h>

15
#include "darshan-logutils.h"
16 17 18 19 20 21 22 23 24

int main(int argc, char **argv)
{
    int ret;
    struct darshan_job job;
    struct darshan_file cp_file;
    char tmp_string[1024];
    int no_files_flag = 0;
    time_t tmp_time = 0;
25
    darshan_fd file;
26
    int i;
27 28 29 30 31 32 33

    if(argc != 2)
    {
        fprintf(stderr, "Usage: %s <filename>\n", argv[0]);
        return(-1);
    }

34
    file = darshan_log_open(argv[1]);
35 36
    if(!file)
    {
37
        perror("darshan_log_open");
38 39 40 41
        return(-1);
    }
   
    /* read job info */
42
    ret = darshan_log_getjob(file, &job);
43
    if(ret < 0)
44
    {
45
        fprintf(stderr, "Error: unable to read job information from log file.\n");
46
        darshan_log_close(file);
47 48 49
        return(-1);
    }

50 51 52
    /* warn user about any missing information in this log format */
    darshan_log_print_version_warnings(&job);

53
    ret = darshan_log_getexe(file, tmp_string, &no_files_flag);
54
    if(ret < 0)
55
    {
56
        fprintf(stderr, "Error: unable to read trailing job information.\n");
57
        darshan_log_close(file);
58 59 60
        return(-1);
    }

61
    printf("# darshan log version: %s\n", job.version_string);
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
    printf("# size of file statistics: %d bytes\n", sizeof(cp_file));
    printf("# size of job statistics: %d bytes\n", sizeof(job));
    printf("# exe: %s\n", tmp_string);
    printf("# uid: %d\n", job.uid);
    printf("# start_time: %ld\n", (long)job.start_time);
    tmp_time = (time_t)job.start_time;
    printf("# start_time_asci: %s", ctime(&tmp_time));
    printf("# end_time: %ld\n", (long)job.end_time);
    tmp_time = (time_t)job.end_time;
    printf("# end_time_asci: %s", ctime(&tmp_time));
    printf("# nprocs: %d\n", job.nprocs);
    printf("# run time: %ld\n", (long)(job.end_time - job.start_time + 1));
   
    if(no_files_flag)
    {
        /* it looks like the app didn't open any files */
        printf("# no files opened.\n");
79
        darshan_log_close(file);
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
        return(0);
    }

    printf("\n# description of columns:\n");
    printf("#   <rank>: MPI rank.  -1 indicates that the file is shared\n");
    printf("#      across all processes and statistics are aggregated.\n");
    printf("#   <file>: hash of file path.  0 indicates that statistics\n");
    printf("#      are condensed to refer to all files opened at the given\n");
    printf("#      process.\n");
    printf("#   <counter> and <value>: statistical counters.\n");
    printf("#   <name suffix>: last %d characters of file name.\n", CP_NAME_SUFFIX_LEN);
    printf("\n# description of counters:\n");
    printf("#   CP_POSIX_*: posix operation counts.\n");
    printf("#   CP_COLL_*: MPI collective operation counts.\n");
    printf("#   CP_INDEP_*: MPI independent operation counts.\n");
    printf("#   CP_SPIT_*: MPI split collective operation counts.\n");
    printf("#   CP_NB_*: MPI non blocking operation counts.\n");
    printf("#   READS,WRITES,OPENS,SEEKS,STATS, and MMAPS are types of operations.\n");
98
    printf("#   CP_*_NC_OPENS: number of indep. and collective pnetcdf opens.\n");
99
    printf("#   CP_HDF5_OPENS: number of hdf5 opens.\n");
100 101 102 103 104 105 106 107 108 109 110
    printf("#   CP_COMBINER_*: combiner counts for MPI mem and file datatypes.\n");
    printf("#   CP_HINTS: number of times MPI hints were used.\n");
    printf("#   CP_VIEWS: number of times MPI file views were used.\n");
    printf("#   CP_MODE: mode that file was opened in.\n");
    printf("#   CP_BYTES_*: total bytes read and written.\n");
    printf("#   CP_MAX_BYTE_*: highest offset byte read and written.\n");
    printf("#   CP_CONSEC_*: number of exactly adjacent reads and writes.\n");
    printf("#   CP_SEQ_*: number of reads and writes from increasing offsets.\n");
    printf("#   CP_RW_SWITCHES: number of times access alternated between read and write.\n");
    printf("#   CP_*_ALIGNMENT: memory and file alignment.\n");
    printf("#   CP_*_NOT_ALIGNED: number of reads and writes that were not aligned.\n");
111
    printf("#   CP_MAX_*_TIME_SIZE: size of the slowest read and write operations.\n");
112 113 114 115 116 117 118 119 120 121 122
    printf("#   CP_SIZE_READ_*: histogram of read access sizes.\n");
    printf("#   CP_SIZE_READ_AGG_*: histogram of MPI datatype total sizes.\n");
    printf("#   CP_EXTENT_READ_*: histogram of MPI datatype extents.\n");
    printf("#   CP_STRIDE*_STRIDE: the four most common strides detected.\n");
    printf("#   CP_STRIDE*_COUNT: count of the four most common strides.\n");
    printf("#   CP_ACCESS*_ACCESS: the four most common access sizes.\n");
    printf("#   CP_ACCESS*_COUNT: count of the four most common access sizes.\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");
    printf("#   CP_F_CLOSE_TIMESTAMP: timestamp of last close (mpi or posix).\n");
123 124 125 126
    printf("#   CP_F_POSIX_READ/WRITE_TIME: cumulative time spent in posix reads or writes.\n");
    printf("#   CP_F_MPI_READ/WRITE_TIME: cumulative time spent in mpi-io reads or writes.\n");
    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");
127
    printf("#   CP_MAX_*_TIME: duration of the slowest read and write operations.\n");
128 129 130 131 132

    printf("\n");

    CP_PRINT_HEADER();

133
    while((ret = darshan_log_getfile(file, &job, &cp_file)) == 1)
134
    {
135 136 137 138 139 140 141 142
        for(i=0; i<CP_NUM_INDICES; i++)
        {
            CP_PRINT(&job, &cp_file, i);
        }
        for(i=0; i<CP_F_NUM_INDICES; i++)
        {
            CP_F_PRINT(&job, &cp_file, i);
        }
143 144
    }

145
    if(ret < 0)
146
    {
147
        fprintf(stderr, "Error: failed to parse log file.\n");
148 149 150
        return(-1);
    }

151
    darshan_log_close(file);
152 153
    return(0);
}