codes-workload-dump.c 16.5 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
/*
 * Copyright (C) 2014 University of Chicago.
 * See COPYRIGHT notice in top-level directory.
 *
 */

#include <assert.h>
#include <getopt.h>
#include <stdio.h>
#include "codes/codes-workload.h"
11
#include <inttypes.h>
12
13

static char type[128] = {'\0'};
14
static darshan_params d_params = {"", 0}; 
15
static iolang_params i_params = {0, 0, "", ""};
16
static recorder_params r_params = {"", 0};
17
18
static dumpi_trace_params du_params = {"", 0};
static checkpoint_wrkld_params c_params = {0, 0, 0, 0, 0};
Jonathan Jenkins's avatar
Jonathan Jenkins committed
19
static iomock_params im_params = {0, 0, 1, 0, 0, 0};
20
static int n = -1;
21
static int start_rank = 0;
22
23
24
25
26

static struct option long_opts[] = 
{
    {"type", required_argument, NULL, 't'},
    {"num-ranks", required_argument, NULL, 'n'},
27
    {"start-rank", required_argument, NULL, 'r'},
28
29
    {"d-log", required_argument, NULL, 'l'},
    {"d-aggregator-cnt", required_argument, NULL, 'a'},
30
    {"i-meta", required_argument, NULL, 'm'},
31
    {"i-use-relpath", no_argument, NULL, 'p'},
32
    {"r-trace-dir", required_argument, NULL, 'd'},
33
    {"r-nprocs", required_argument, NULL, 'x'},
34
    {"dumpi-log", required_argument, NULL, 'w'},
35
36
    {"chkpoint-size", required_argument, NULL, 'S'},
    {"chkpoint-bw", required_argument, NULL, 'B'},
37
    {"chkpoint-iters", required_argument, NULL, 'i'},
38
    {"chkpoint-mtti", required_argument, NULL, 'M'},
Jonathan Jenkins's avatar
Jonathan Jenkins committed
39
40
41
42
43
    {"iomock-request-type", required_argument, NULL, 'Q'},
    {"iomock-num-requests", required_argument, NULL, 'N'},
    {"iomock-request-size", required_argument, NULL, 'z'},
    {"iomock-file-id", required_argument, NULL, 'f'},
    {"iomock-use-uniq-file-ids", no_argument, NULL, 'u'},
44
45
46
    {NULL, 0, NULL, 0}
};

47
void usage(){
Jonathan Jenkins's avatar
Jonathan Jenkins committed
48
    fputs(
49
            "Usage: codes-workload-dump --type TYPE --num-ranks N [OPTION...]\n"
50
            "--type: type of workload (\"darshan_io_workload\", \"iolang_workload\", dumpi-trace-workload\" etc.)\n"
51
            "--num-ranks: number of ranks to process (if not set, it is set by the workload)\n"
52
            "-s: print final workload stats\n"
53
            "DARSHAN OPTIONS (darshan_io_workload)\n"
54
            "--d-log: darshan log file\n"
55
            "--d-aggregator-cnt: number of aggregators for collective I/O in darshan\n"
56
            "IOLANG OPTIONS (iolang_workload)\n"
57
            "--i-meta: i/o language kernel meta file path\n"
58
            "--i-use-relpath: use i/o kernel path relative meta file path\n"
59
            "RECORDER OPTIONS (recorder_io_workload)\n"
60
            "--r-trace-dir: directory containing recorder trace files\n"
61
            "--r-nprocs: number of ranks in original recorder workload\n"
62
63
64
65
66
            "DUMPI TRACE OPTIONS (dumpi-trace-workload) \n"
            "--dumpi-log: dumpi log file \n"
            "CHECKPOINT OPTIONS (checkpoint_io_workload)\n"
            "--chkpoint-size: size of aggregate checkpoint to write\n"
            "--chkpoint-bw: checkpointing bandwidth\n"
67
            "--chkpoint-iters: iteration count for checkpoint workload\n"
Jonathan Jenkins's avatar
Jonathan Jenkins committed
68
            "--chkpoint-mtti: mean time to interrupt\n"
Jonathan Jenkins's avatar
Jonathan Jenkins committed
69
            "MOCK IO OPTIONS (iomock_workload)\n"
Jonathan Jenkins's avatar
Jonathan Jenkins committed
70
71
72
73
74
75
76
            "--iomock-request-type: whether to write or read\n"
            "--iomock-num-requests: number of writes/reads\n"
            "--iomock-request-size: size of each request\n"
            "--iomock-file-id: file id to use for requests\n"
            "--iomock-use-uniq-file-ids: whether to offset file ids by rank\n",
            stderr
            );
77
}
78
79
80

int main(int argc, char *argv[])
{
81
82
83
84
    int print_stats = 0;
    double total_delay = 0.0;
    int64_t num_barriers = 0;
    int64_t num_opens = 0;
85
    int64_t num_closes = 0;
86
87
88
89
    int64_t num_reads = 0;
    int64_t read_size = 0;
    int64_t num_writes = 0;
    int64_t write_size = 0;
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
    int64_t num_sends = 0;
    int64_t send_size = 0;
    int64_t num_recvs = 0;
    int64_t recv_size = 0;
    int64_t num_isends = 0;
    int64_t isend_size = 0;
    int64_t num_irecvs = 0;
    int64_t irecv_size = 0;
    int64_t num_bcasts = 0;
    int64_t bcast_size = 0;
    int64_t num_allgathers = 0;
    int64_t allgather_size = 0;
    int64_t num_allgathervs = 0;
    int64_t allgatherv_size = 0;
    int64_t num_alltoalls = 0;
    int64_t alltoall_size = 0;
    int64_t num_alltoallvs = 0;
    int64_t alltoallv_size = 0;
    int64_t num_reduces = 0;
    int64_t reduce_size = 0;
    int64_t num_allreduces = 0;
    int64_t allreduce_size = 0;
    int64_t num_collectives = 0;
    int64_t collective_size = 0;
    int64_t num_waitalls = 0;
    int64_t num_waits = 0;
    int64_t num_waitsomes = 0;
    int64_t num_waitanys = 0;
    int64_t num_testalls = 0;
119

120
    char ch;
Jonathan Jenkins's avatar
Jonathan Jenkins committed
121
122
    while ((ch = getopt_long(argc, argv, "t:n:l:a:m:sp:wr:S:B:R:M:Q:N:z:f:u",
                    long_opts, NULL)) != -1){
123
124
125
126
127
128
129
130
131
132
133
134
135
136
        switch (ch){
            case 't':
                strcpy(type, optarg);
                break;
            case 'n':
                n = atoi(optarg);
                assert(n>0);
                break;
            case 'l':
                strcpy(d_params.log_file_path, optarg);
                break;
            case 'a':
                d_params.aggregator_cnt = atol(optarg);
                break;
137
            case 'm':
138
                strcpy(i_params.io_kernel_meta_path, optarg);
139
                break;
140
            case 'p':
141
                i_params.use_relpath = 1;
142
                break;
143
144
145
            case 'd':
                strcpy(r_params.trace_dir_path, optarg);
                break;
146
147
148
            case 'x':
                r_params.nprocs = atol(optarg);
                break;
149
150
151
            case 'w':
                strcpy(du_params.file_name, optarg);
                break;
152
153
154
            case 's':
                print_stats = 1;
                break;
155
156
157
158
            case 'r':
                start_rank = atoi(optarg);
                assert(n>0);
                break;
159
160
161
162
163
164
            case 'S':
                c_params.checkpoint_sz = atof(optarg);
                break;
            case 'B':
                c_params.checkpoint_wr_bw = atof(optarg);
                break;
165
166
            case 'i':
                c_params.total_checkpoints = atoi(optarg);
167
168
169
170
                break;
            case 'M':
                c_params.mtti = atof(optarg);
                break;
Jonathan Jenkins's avatar
Jonathan Jenkins committed
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
            case 'Q':
                im_params.is_write = (strcmp("write", optarg) == 0);
                break;
            case 'N':
                im_params.num_requests = atoi(optarg);
                break;
            case 'z':
                im_params.request_size = atoi(optarg);
                break;
            case 'f':
                im_params.file_id = (uint64_t) atoll(optarg);
                break;
            case 'u':
                im_params.use_uniq_file_ids = 1;
                break;
186
187
188
        }
    }

189
190
191
192
193
194
    if (type[0] == '\0'){
        fprintf(stderr, "Expected \"--type\" argument\n");
        usage();
        return 1;
    }

195
196
    int i;
    char *wparams;
Jonathan Jenkins's avatar
Jonathan Jenkins committed
197
198
199
200
201
    if (strcmp(type, "iomock_workload") == 0) {
        // TODO: more involved input checking
        wparams = (char*) &im_params;
    }
    else if (strcmp(type, "darshan_io_workload") == 0){
202
203
204
205
206
207
208
209
210
211
212
213
214
        if (d_params.log_file_path[0] == '\0'){
            fprintf(stderr, "Expected \"--d-log\" argument for darshan workload\n");
            usage();
            return 1;
        }
        else if (d_params.aggregator_cnt == 0){
            fprintf(stderr, "Expected \"--d-aggregator-cnt\" argument for darshan workload\n");
            usage();
            return 1;
        }
        else{
            wparams = (char*)&d_params;
        }
215
    }
216
    else if (strcmp(type, "iolang_workload") == 0){
217
218
219
220
221
222
223
224
        if (n == -1){
            fprintf(stderr,
                    "Expected \"--num-ranks\" argument for iolang workload\n");
            usage();
            return 1;
        }
        else{
            i_params.num_cns = n;
225
        }
226
227
228
        if (i_params.io_kernel_meta_path[0] == '\0'){
            fprintf(stderr,
                    "Expected \"--i-meta\" argument for iolang workload\n");
229
230
231
            usage();
            return 1;
        }
232

233
        wparams = (char *)&i_params;
234
    }
235
236
237
238
239
240
    else if (strcmp(type, "recorder_io_workload") == 0){
        if (r_params.trace_dir_path[0] == '\0'){
            fprintf(stderr, "Expected \"--r-trace-dir\" argument for recorder workload\n");
            usage();
            return 1;
        }
241
242
243
244
245
        if (r_params.nprocs == 0){
            fprintf(stderr, "Expected \"--r-nprocs\" argument for recorder workload\n");
            usage();
            return 1;
        }
246
247
248
249
        else{
            wparams = (char *)&r_params;
        }
    }
250
251
252
253
   else if(strcmp(type, "dumpi-trace-workload") == 0)
	{
	if(n == -1){
            fprintf(stderr,
Jonathan Jenkins's avatar
typo    
Jonathan Jenkins committed
254
                    "Expected \"--num-ranks\" argument for dumpi workload\n");
255
256
257
258
259
260
261
262
            usage();
            return 1;		
	}
	else{
	    du_params.num_net_traces = n;	
	}

	if(du_params.file_name[0] == '\0' ){
263
            fprintf(stderr, "Expected \"--dumpi-log\" argument for dumpi workload\n");
264
265
266
267
268
269
270
271
            usage();
            return 1;
	}
	else
	{
	  wparams = (char*)&du_params;
	}
	}
272
273
274
    else if(strcmp(type, "checkpoint_io_workload") == 0)
    {
        if(c_params.checkpoint_sz == 0 || c_params.checkpoint_wr_bw == 0 ||
275
           c_params.total_checkpoints == 0 || c_params.mtti == 0)
276
277
278
279
280
281
282
283
284
285
286
        {
            fprintf(stderr, "All checkpoint workload arguments are required\n");
            usage();
            return 1;
        }
        else
        {
            c_params.nprocs = n;
            wparams = (char *)&c_params;
        }
    }
287
    else {
288
289
290
        fprintf(stderr, "Invalid type argument\n");
        usage();
        return 1;
291
    }
292
293
294

    /* if num_ranks not set, pull it from the workload */
    if (n == -1){
295
        n = codes_workload_get_rank_cnt(type, wparams, 0);
Jonathan Jenkins's avatar
Jonathan Jenkins committed
296
297
298
299
300
301
        if (n == -1) {
            fprintf(stderr,
                    "Unable to get rank count from workload. "
                    "Specify option --num-ranks\n");
            return 1;
        }
302
303
    }

304
    for (i = start_rank ; i < start_rank+n; i++){
305
306
        struct codes_workload_op op;
        printf("loading %s, %d\n", type, i);
307
        int id = codes_workload_load(type, wparams, 0, i);
308
309
        assert(id != -1);
        do {
310
311
            codes_workload_get_next(id, 0, i, &op);
            codes_workload_print_op(stdout, &op, 0, i);
312
313
314

            switch(op.op_type)
            {
315
316
                case CODES_WK_DELAY:
                    total_delay += op.u.delay.seconds;
317
318
319
320
                    break;
                case CODES_WK_BARRIER:
                    num_barriers++;
                    break;
321
322
                case CODES_WK_OPEN:
                    num_opens++;
323
                    break;
324
325
                case CODES_WK_CLOSE:
                    num_closes++;
326
327
328
329
330
                    break;
                case CODES_WK_WRITE:
                    num_writes++;
                    write_size += op.u.write.size;
                    break;
331
332
333
334
335
336
337
                case CODES_WK_READ:
                    num_reads++;
                    read_size += op.u.write.size;
                    break;
                case CODES_WK_SEND:
                    num_sends++;
                    send_size += op.u.send.num_bytes;
338
                    break;
339
340
341
342
343
                case CODES_WK_RECV:
                    num_recvs++;
                    recv_size += op.u.recv.num_bytes;
                    break;
                case CODES_WK_ISEND:
344
345
                    num_isends++;
                    isend_size += op.u.send.num_bytes;
346
347
348
349
350
351
352
353
354
355
                    break;
                case CODES_WK_IRECV:
                    num_irecvs++;
                    irecv_size += op.u.recv.num_bytes;
                    break;
                /* NOTE: all collectives are currently represented as the
                 * generic "collective" type */
                case CODES_WK_BCAST:
                    num_bcasts++;
                    bcast_size += op.u.collective.num_bytes;
356
                    break;
357
                case CODES_WK_ALLGATHER:
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
                    num_allgathers++;
                    allgather_size += op.u.collective.num_bytes;
                    break;
                case CODES_WK_ALLGATHERV:
                    num_allgathervs++;
                    allgatherv_size += op.u.collective.num_bytes;
                    break;
                case CODES_WK_ALLTOALL:
                    num_alltoalls++;
                    alltoall_size += op.u.collective.num_bytes;
                    break;
                case CODES_WK_ALLTOALLV:
                    num_alltoallvs++;
                    alltoallv_size += op.u.collective.num_bytes;
                    break;
                case CODES_WK_REDUCE:
                    num_reduces++;
                    reduce_size += op.u.collective.num_bytes;
                    break;
                case CODES_WK_ALLREDUCE:
                    num_allreduces++;
                    allreduce_size += op.u.collective.num_bytes;
                    break;
                case CODES_WK_COL:
                    num_collectives++;
                    collective_size += op.u.collective.num_bytes;
                    break;
                case CODES_WK_WAITALL:
                    num_waitalls++;
                    break;
                case CODES_WK_WAIT:
                    num_waits++;
                    break;
                case CODES_WK_WAITSOME:
                    num_waitsomes++;
                    break;
                case CODES_WK_WAITANY:
                    num_waitanys++;
                    break;
                case CODES_WK_TESTALL:
                    num_testalls++;
                    break;
Jonathan Jenkins's avatar
Jonathan Jenkins committed
400
401
402
403
                case CODES_WK_END:
                    break;
                case CODES_WK_IGNORE:
                    break;
404
405
406
407
                default:
                    fprintf(stderr,
                            "WARNING: unknown workload op type (code %d)\n",
                            op.op_type);
408
            }
409
410
411
        } while (op.op_type != CODES_WK_END);
    }

412
413
414
    if (print_stats)
    {
        fprintf(stderr, "\n* * * * * FINAL STATS * * * * * *\n");
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
        fprintf(stderr, "NUM_OPENS:       %"PRId64"\n", num_opens);
        fprintf(stderr, "NUM_CLOSES:      %"PRId64"\n", num_closes);
        fprintf(stderr, "NUM_BARRIERS:    %"PRId64"\n", num_barriers);
        fprintf(stderr, "TOTAL_DELAY:     %.4lf\n", total_delay);
        fprintf(stderr, "NUM_READS:       %"PRId64"\n", num_reads);
        fprintf(stderr, "READ_SIZE:       %"PRId64"\n", read_size);
        fprintf(stderr, "NUM_WRITES:      %"PRId64"\n", num_writes);
        fprintf(stderr, "WRITE_SIZE:      %"PRId64"\n", write_size);
        fprintf(stderr, "NUM_SENDS:       %"PRId64"\n", num_sends);
        fprintf(stderr, "SEND_SIZE:       %"PRId64"\n", send_size);
        fprintf(stderr, "NUM_RECVS:       %"PRId64"\n", num_recvs);
        fprintf(stderr, "RECV_SIZE:       %"PRId64"\n", recv_size);
        fprintf(stderr, "NUM_ISENDS:      %"PRId64"\n", num_isends);
        fprintf(stderr, "ISEND_SIZE:      %"PRId64"\n", isend_size);
        fprintf(stderr, "NUM_IRECVS:      %"PRId64"\n", num_irecvs);
        fprintf(stderr, "IRECV_SIZE:      %"PRId64"\n", irecv_size);
        fprintf(stderr, "NUM_BCASTS:      %"PRId64"\n", num_bcasts);
        fprintf(stderr, "BCAST_SIZE:      %"PRId64"\n", bcast_size);
        fprintf(stderr, "NUM_ALLGATHERS:  %"PRId64"\n", num_allgathers);
        fprintf(stderr, "ALLGATHER_SIZE:  %"PRId64"\n", allgather_size);
        fprintf(stderr, "NUM_ALLGATHERVS: %"PRId64"\n", num_allgathervs);
        fprintf(stderr, "ALLGATHERV_SIZE: %"PRId64"\n", allgatherv_size);
        fprintf(stderr, "NUM_ALLTOALLS:   %"PRId64"\n", num_alltoalls);
        fprintf(stderr, "ALLTOALL_SIZE:   %"PRId64"\n", alltoall_size);
        fprintf(stderr, "NUM_ALLTOALLVS:  %"PRId64"\n", num_alltoallvs);
        fprintf(stderr, "ALLTOALLV_SIZE:  %"PRId64"\n", alltoallv_size);
        fprintf(stderr, "NUM_REDUCES:     %"PRId64"\n", num_reduces);
        fprintf(stderr, "REDUCE_SIZE:     %"PRId64"\n", reduce_size);
        fprintf(stderr, "NUM_ALLREDUCE:   %"PRId64"\n", num_allreduces);
        fprintf(stderr, "ALLREDUCE_SIZE:  %"PRId64"\n", allreduce_size);
        fprintf(stderr, "NUM_COLLECTIVE:  %"PRId64"\n", num_collectives);
        fprintf(stderr, "COLLECTIVE_SIZE: %"PRId64"\n", collective_size);
        fprintf(stderr, "NUM_WAITALLS:    %"PRId64"\n", num_waitalls);
        fprintf(stderr, "NUM_WAITS:       %"PRId64"\n", num_waits);
        fprintf(stderr, "NUM_WAITSOMES:   %"PRId64"\n", num_waitsomes);
        fprintf(stderr, "NUM_WAITANYS:    %"PRId64"\n", num_waitanys);
        fprintf(stderr, "NUM_TESTALLS:    %"PRId64"\n", num_testalls);
452
    }
453
454
455
456
457
458
459
460
461
462
463
464

    return 0;
}

/*
 * Local variables:
 *  c-indent-level: 4
 *  c-basic-offset: 4
 * End:
 *
 * vim: ft=c ts=8 sts=4 sw=4 expandtab
 */