darshan-hdf5-logutils.c 7.98 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
 * Copyright (C) 2015 University of Chicago.
 * See COPYRIGHT notice in top-level directory.
 *
 */

#define _GNU_SOURCE
#include "darshan-util-config.h"
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
#include <unistd.h>
#include <inttypes.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>

20
#include "darshan-logutils.h"
21
22
23
24
25
26
27
28
29
30
31
32

/* counter name strings for the HDF5 module */
#define X(a) #a,
char *hdf5_counter_names[] = {
    HDF5_COUNTERS
};

char *hdf5_f_counter_names[] = {
    HDF5_F_COUNTERS
};
#undef X

33
static int darshan_log_get_hdf5_file(darshan_fd fd, void* hdf5_buf);
34
static int darshan_log_put_hdf5_file(darshan_fd fd, void* hdf5_buf, int ver);
35
static void darshan_log_print_hdf5_file(void *file_rec,
36
    char *file_name, char *mnt_pt, char *fs_type, int ver);
37
static void darshan_log_print_hdf5_description(void);
38
39
static void darshan_log_print_hdf5_file_diff(void *file_rec1, char *file_name1,
    void *file_rec2, char *file_name2);
40
static void darshan_log_agg_hdf5_files(void *rec, void *agg_rec, int init_flag);
41

42
43
44
struct darshan_mod_logutil_funcs hdf5_logutils =
{
    .log_get_record = &darshan_log_get_hdf5_file,
45
    .log_put_record = &darshan_log_put_hdf5_file,
46
    .log_print_record = &darshan_log_print_hdf5_file,
47
    .log_print_description = &darshan_log_print_hdf5_description,
48
    .log_print_diff = &darshan_log_print_hdf5_file_diff,
49
    .log_agg_records = &darshan_log_agg_hdf5_files
50
51
};

52
static int darshan_log_get_hdf5_file(darshan_fd fd, void* hdf5_buf)
53
{
54
    struct darshan_hdf5_file *file;
55
    int i;
56
    int ret;
57

58
    ret = darshan_log_get_mod(fd, DARSHAN_HDF5_MOD, hdf5_buf,
59
60
        sizeof(struct darshan_hdf5_file));
    if(ret < 0)
61
        return(-1);
62
63
64
    else if(ret < sizeof(struct darshan_hdf5_file))
        return(0);
    else
65
    {
66
67
68
69
        file = (struct darshan_hdf5_file *)hdf5_buf;
        if(fd->swap_flag)
        {
            /* swap bytes if necessary */
70
71
            DARSHAN_BSWAP64(&(file->base_rec.id));
            DARSHAN_BSWAP64(&(file->base_rec.rank));
72
73
74
75
76
77
78
            for(i=0; i<HDF5_NUM_INDICES; i++)
                DARSHAN_BSWAP64(&file->counters[i]);
            for(i=0; i<HDF5_F_NUM_INDICES; i++)
                DARSHAN_BSWAP64(&file->fcounters[i]);
        }

        return(1);
79
    }
80
}
81

82
static int darshan_log_put_hdf5_file(darshan_fd fd, void* hdf5_buf, int ver)
83
84
85
86
{
    struct darshan_hdf5_file *file = (struct darshan_hdf5_file *)hdf5_buf;
    int ret;

87
    ret = darshan_log_put_mod(fd, DARSHAN_HDF5_MOD, file,
88
        sizeof(struct darshan_hdf5_file), DARSHAN_HDF5_VER);
89
90
    if(ret < 0)
        return(-1);
91
92

    return(0);
93
94
}

95
static void darshan_log_print_hdf5_file(void *file_rec, char *file_name,
96
    char *mnt_pt, char *fs_type, int ver)
97
98
99
100
101
102
103
104
{
    int i;
    struct darshan_hdf5_file *hdf5_file_rec =
        (struct darshan_hdf5_file *)file_rec;

    for(i=0; i<HDF5_NUM_INDICES; i++)
    {
        DARSHAN_COUNTER_PRINT(darshan_module_names[DARSHAN_HDF5_MOD],
105
106
107
            hdf5_file_rec->base_rec.rank, hdf5_file_rec->base_rec.id,
            hdf5_counter_names[i], hdf5_file_rec->counters[i],
            file_name, mnt_pt, fs_type);
108
109
110
111
112
    }

    for(i=0; i<HDF5_F_NUM_INDICES; i++)
    {
        DARSHAN_F_COUNTER_PRINT(darshan_module_names[DARSHAN_HDF5_MOD],
113
114
115
            hdf5_file_rec->base_rec.rank, hdf5_file_rec->base_rec.id,
            hdf5_f_counter_names[i], hdf5_file_rec->fcounters[i],
            file_name, mnt_pt, fs_type);
116
117
118
119
120
    }

    return;
}

121
122
static void darshan_log_print_hdf5_description()
{
123
    printf("\n# description of HDF5 counters:\n");
124
125
126
127
128
129
130
131
132
    printf("#   HDF5_OPENS: HDF5 file open operation counts.\n");
    printf("#   HDF5_F_OPEN_TIMESTAMP: timestamp of first HDF5 file open.\n");
    printf("#   HDF5_F_CLOSE_TIMESTAMP: timestamp of last HDF5 file close.\n");

    DARSHAN_PRINT_HEADER();

    return;
}

133
134
static void darshan_log_print_hdf5_file_diff(void *file_rec1, char *file_name1,
    void *file_rec2, char *file_name2)
135
{
136
137
138
139
140
    struct darshan_hdf5_file *file1 = (struct darshan_hdf5_file *)file_rec1;
    struct darshan_hdf5_file *file2 = (struct darshan_hdf5_file *)file_rec2;
    int i;

    /* NOTE: we assume that both input records are the same module format version */
141

142
143
144
145
146
147
    for(i=0; i<HDF5_NUM_INDICES; i++)
    {
        if(!file2)
        {
            printf("- ");
            DARSHAN_COUNTER_PRINT(darshan_module_names[DARSHAN_HDF5_MOD],
Shane Snyder's avatar
Shane Snyder committed
148
                file1->base_rec.rank, file1->base_rec.id, hdf5_counter_names[i],
149
150
151
152
153
154
155
                file1->counters[i], file_name1, "", "");

        }
        else if(!file1)
        {
            printf("+ ");
            DARSHAN_COUNTER_PRINT(darshan_module_names[DARSHAN_HDF5_MOD],
Shane Snyder's avatar
Shane Snyder committed
156
                file2->base_rec.rank, file2->base_rec.id, hdf5_counter_names[i],
157
158
159
160
161
162
                file2->counters[i], file_name2, "", "");
        }
        else if(file1->counters[i] != file2->counters[i])
        {
            printf("- ");
            DARSHAN_COUNTER_PRINT(darshan_module_names[DARSHAN_HDF5_MOD],
Shane Snyder's avatar
Shane Snyder committed
163
                file1->base_rec.rank, file1->base_rec.id, hdf5_counter_names[i],
164
165
166
                file1->counters[i], file_name1, "", "");
            printf("+ ");
            DARSHAN_COUNTER_PRINT(darshan_module_names[DARSHAN_HDF5_MOD],
Shane Snyder's avatar
Shane Snyder committed
167
                file2->base_rec.rank, file2->base_rec.id, hdf5_counter_names[i],
168
169
170
171
172
173
174
175
176
177
                file2->counters[i], file_name2, "", "");
        }
    }

    for(i=0; i<HDF5_F_NUM_INDICES; i++)
    {
        if(!file2)
        {
            printf("- ");
            DARSHAN_F_COUNTER_PRINT(darshan_module_names[DARSHAN_HDF5_MOD],
Shane Snyder's avatar
Shane Snyder committed
178
                file1->base_rec.rank, file1->base_rec.id, hdf5_f_counter_names[i],
179
180
181
182
183
184
185
                file1->fcounters[i], file_name1, "", "");

        }
        else if(!file1)
        {
            printf("+ ");
            DARSHAN_F_COUNTER_PRINT(darshan_module_names[DARSHAN_HDF5_MOD],
Shane Snyder's avatar
Shane Snyder committed
186
                file2->base_rec.rank, file2->base_rec.id, hdf5_f_counter_names[i],
187
188
189
190
191
192
                file2->fcounters[i], file_name2, "", "");
        }
        else if(file1->fcounters[i] != file2->fcounters[i])
        {
            printf("- ");
            DARSHAN_F_COUNTER_PRINT(darshan_module_names[DARSHAN_HDF5_MOD],
Shane Snyder's avatar
Shane Snyder committed
193
                file1->base_rec.rank, file1->base_rec.id, hdf5_f_counter_names[i],
194
195
196
                file1->fcounters[i], file_name1, "", "");
            printf("+ ");
            DARSHAN_F_COUNTER_PRINT(darshan_module_names[DARSHAN_HDF5_MOD],
Shane Snyder's avatar
Shane Snyder committed
197
                file2->base_rec.rank, file2->base_rec.id, hdf5_f_counter_names[i],
198
199
200
201
202
203
204
                file2->fcounters[i], file_name2, "", "");
        }
    }

    return;
}

205
206
static void darshan_log_agg_hdf5_files(void *rec, void *agg_rec, int init_flag)
{
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
    struct darshan_hdf5_file *hdf5_rec = (struct darshan_hdf5_file *)rec;
    struct darshan_hdf5_file *agg_hdf5_rec = (struct darshan_hdf5_file *)agg_rec;
    int i;

    for(i = 0; i < HDF5_NUM_INDICES; i++)
    {
        switch(i)
        {
            case HDF5_OPENS:
                /* sum */
                agg_hdf5_rec->counters[i] += hdf5_rec->counters[i];
                break;
            default:
                agg_hdf5_rec->counters[i] = -1;
                break;
        }
    }

    for(i = 0; i < HDF5_F_NUM_INDICES; i++)
    {
        switch(i)
        {
            case HDF5_F_OPEN_TIMESTAMP:
                /* minimum non-zero */
                if((hdf5_rec->fcounters[i] > 0)  &&
                    ((agg_hdf5_rec->fcounters[i] == 0) ||
                    (hdf5_rec->fcounters[i] < agg_hdf5_rec->fcounters[i])))
                {
                    agg_hdf5_rec->fcounters[i] = hdf5_rec->fcounters[i];
                }
                break;
            case HDF5_F_CLOSE_TIMESTAMP:
                /* maximum */
                if(hdf5_rec->fcounters[i] > agg_hdf5_rec->fcounters[i])
                {
                    agg_hdf5_rec->fcounters[i] = hdf5_rec->fcounters[i];
                }
                break;
            default:
                agg_hdf5_rec->fcounters[i] = -1;
                break;
        }
    }

251
252
253
    return;
}

254
255
256
257
258
259
260
261
/*
 * Local variables:
 *  c-indent-level: 4
 *  c-basic-offset: 4
 * End:
 *
 * vim: ts=8 sts=4 sw=4 expandtab
 */