stats.py revision 1165:234f3cdd541a
1#!/usr/bin/env python
2from __future__ import division
3import re, sys
4
5def usage():
6    print '''\
7Usage: %s [-E] [-F] [-d <db> ] [-g <get> ] [-h <host>] [-p]
8       [-s <system>] [-r <runs> ] [-u <username>] <command> [command args]
9''' % sys.argv[0]
10    sys.exit(1)
11
12def getopts(list, flags):
13    import getopt
14    try:
15        opts, args = getopt.getopt(list, flags)
16    except getopt.GetoptError:
17        usage()
18
19    return opts, args
20
21def printval(name, value, invert = False):
22    if invert and value != 0.0:
23        value = 1 / value
24
25    if value == (1e300*1e300):
26        return
27
28    if printval.mode == 'G':
29        print '%s:    %g' % (name, value)
30    elif printval.mode != 'F' and value > 1e6:
31        print '%s:    %0.5e' % (name, value)
32    else:
33        print '%s:    %f' % (name, value)
34
35printval.mode = 'G'
36
37def unique(list):
38    set = {}
39    map(set.__setitem__, list, [])
40    return set.keys()
41
42def graphdata(runs, tag, label, value):
43    import info
44    configs = ['stx', 'ste', 'hte', 'htd', 'ocm', 'occ', 'ocp' ]
45    benchmarks = [ 'm', 's' ]
46    dmas = [ 'x', 'd', 'b' ]
47    caches = [ '2', '4' ]
48    checkpoints = [ '1' ]
49
50    names = []
51    for bench in benchmarks:
52        for dma in dmas:
53            for cache in caches:
54                for cpt in checkpoints:
55                    names.append([bench, dma, cache, cpt])
56
57    for bench,dma,cache,cpt in names:
58        base = '%s.%s.%s.%s' % (bench, dma, cache, cpt)
59        fname = 'data/%s.%s.dat' % (tag, base)
60        f = open(fname, 'w')
61        print >>f, '#set TITLE = %s' % base
62        print >>f, '#set xlbl = Configuration'
63        print >>f, '#set ylbl = %s' % label
64        print >>f, '#set sublabels = %s' % ' '.join(configs)
65
66        for speed,freq in zip(['s', 'q'],['4GHz','10GHz']):
67            print >>f, '"%s"' % freq,
68            for conf in configs:
69                name = '%s.%s.%s.%s.%s.%s' % (conf, bench, dma, speed, cache,
70                                              cpt)
71                run = info.source.allRunNames[name]
72                info.display_run = run.run;
73                val = float(value)
74                if val == 1e300*1e300:
75                    print >>f, 0.0,
76                else:
77                    print >>f, "%f" % val,
78            print >>f
79        f.close()
80
81def printdata(runs, value, invert = False):
82    import info
83    for run in runs:
84        info.display_run = run.run;
85        val = float(value)
86        printval(run.name, val)
87
88class CommandException(Exception):
89    pass
90
91def commands(options, command, args):
92    if command == 'database':
93        if len(args) == 0: raise CommandException
94
95        import dbinit
96        mydb = dbinit.MyDB(options)
97
98        if args[0] == 'drop':
99            if len(args) > 2: raise CommandException
100            mydb.admin()
101            mydb.drop()
102            if len(args) == 2 and args[1] == 'init':
103                mydb.create()
104                mydb.connect()
105                mydb.populate()
106            mydb.close()
107            return
108
109        if args[0] == 'init':
110            if len(args) > 1: raise CommandException
111            mydb.admin()
112            mydb.create()
113            mydb.connect()
114            mydb.populate()
115            mydb.close()
116            return
117
118        if args[0] == 'clean':
119            if len(args) > 1: raise CommandException
120            mydb.connect()
121            mydb.clean()
122            return
123
124        raise CommandException
125
126    import db, info
127    info.source = db.Database()
128    info.source.host = options.host
129    info.source.db = options.db
130    info.source.passwd = options.passwd
131    info.source.user = options.user
132    info.source.connect()
133    info.source.update_dict(globals())
134
135    system = info.source.__dict__[options.system]
136
137    if type(options.get) is str:
138        info.source.get = options.get
139
140    if options.runs is None:
141        runs = info.source.allRuns
142    else:
143        rx = re.compile(options.runs)
144        runs = []
145        for run in info.source.allRuns:
146            if rx.match(run.name):
147                runs.append(run)
148
149    info.display_run = runs[0].run
150
151    if command == 'runs':
152        user = None
153        opts, args = getopts(args, '-u')
154        if len(args):
155            raise CommandException
156        for o,a in opts:
157            if o == '-u':
158                user = a
159        info.source.listRuns(user)
160        return
161
162    if command == 'stats':
163        if len(args) == 0:
164            info.source.listStats()
165        elif len(args) == 1:
166            info.source.listStats(args[0])
167        else:
168            raise CommandException
169
170        return
171
172    if command == 'stat':
173        if len(args) != 1:
174            raise CommandException
175
176        stats = info.source.getStat(args[0])
177        for stat in stats:
178            if options.graph:
179                graphdata(runs, stat.name, stat.name, stat)
180            else:
181                if options.binned:
182                    print 'kernel ticks'
183                    stat.bins = 'kernel'
184                    printdata(runs, stat)
185
186                    print 'idle ticks'
187                    stat.bins = 'idle'
188                    printdata(runs, stat)
189
190                    print 'user ticks'
191                    stat.bins = 'user'
192                    printdata(runs, stat)
193
194                    print 'interrupt ticks'
195                    stat.bins = 'user'
196                    printdata(runs, stat)
197
198                    print 'total ticks'
199
200                stat.bins = None
201                print stat.name
202                printdata(runs, stat)
203        return
204
205    if command == 'bins':
206        if len(args) == 0:
207            info.source.listBins()
208        elif len(args) == 1:
209            info.source.listBins(args[0])
210        else:
211            raise CommandException
212
213        return
214
215    if command == 'formulas':
216        if len(args) == 0:
217            info.source.listFormulas()
218        elif len(args) == 1:
219            info.source.listFormulas(args[0])
220        else:
221            raise CommandException
222
223        return
224
225    if command == 'samples':
226        if len(args):
227            raise CommandException
228
229        info.source.listTicks(runs)
230        return
231
232    if len(args):
233        raise CommandException
234
235    if command == 'usertime':
236        import copy
237        kernel = copy.copy(system.full_cpu.numCycles)
238        kernel.bins = 'kernel'
239
240        user = copy.copy(system.full_cpu.numCycles)
241        user.bins = 'user'
242
243        if options.graph:
244            graphdata(runs, 'usertime', 'User Fraction',
245                      user / system.full_cpu.numCycles)
246        else:
247            printdata(runs, user / system.full_cpu.numCycles)
248        return
249
250    if command == 'ticks':
251        if options.binned:
252            print 'kernel ticks'
253            system.full_cpu.numCycles.bins = 'kernel'
254            printdata(runs, system.full_cpu.numCycles)
255
256            print 'idle ticks'
257            system.full_cpu.numCycles.bins = 'idle'
258            printdata(runs, system.full_cpu.numCycles)
259
260            print 'user ticks'
261            system.full_cpu.numCycles.bins = 'user'
262            printdata(runs, system.full_cpu.numCycles)
263
264            print 'total ticks'
265
266        system.full_cpu.numCycles.bins = None
267        printdata(runs, system.full_cpu.numCycles)
268        return
269
270    if command == 'packets':
271        packets = system.tsunami.etherdev.rxPackets
272        if options.graph:
273            graphdata(runs, 'packets', 'Packets', packets)
274        else:
275            printdata(runs, packets)
276        return
277
278    if command == 'ppt' or command == 'tpp':
279        ppt = system.tsunami.etherdev.rxPackets / sim_ticks
280        printdata(runs, ppt, command == 'tpp')
281        return
282
283    if command == 'pps':
284        pps = system.tsunami.etherdev.rxPackets / sim_seconds
285        if options.graph:
286            graphdata(runs, 'pps', 'Packets/s', pps)
287        else:
288            printdata(runs, pps)
289        return
290
291    if command == 'bpt' or command == 'tpb':
292        bytes = system.tsunami.etherdev.rxBytes + system.tsunami.etherdev.txBytes
293        bpt = bytes / sim_ticks * 8
294        if options.graph:
295            graphdata(runs, 'bpt', 'bps / Hz', bpt)
296        else:
297            printdata(runs, bpt, command == 'tpb')
298        return
299
300    if command == 'bptb' or command == 'tpbb':
301        bytes = system.tsunami.etherdev.rxBytes + system.tsunami.etherdev.txBytes
302
303        print 'kernel stats'
304        bytes.bins = 'kernel'
305        printdata(runs, bytes / ticks)
306
307        print 'idle stats'
308        bytes.bins = 'idle'
309        printdata(runs, bytes / ticks)
310
311        print 'user stats'
312        bytes.bins = 'user'
313        printdata(runs, bytes / ticks)
314
315        return
316
317    if command == 'bytes':
318        stat = system.tsunami.etherdev.rxBytes + system.tsunami.etherdev.txBytes
319
320        if options.binned:
321            print '%s kernel stats' % stat.name
322            stat.bins = 'kernel'
323            printdata(runs, stat)
324
325            print '%s idle stats' % stat.name
326            stat.bins = 'idle'
327            printdata(runs, stat)
328
329            print '%s user stats' % stat.name
330            stat.bins = 'user'
331            printdata(runs, stat)
332
333            print '%s total stats' % stat.name
334            stat.bins = None
335
336        printdata(runs, stat)
337        return
338
339    if command == 'rxbps':
340        gbps = system.tsunami.etherdev.rxBandwidth / 1e9
341        if options.graph:
342            graphdata(runs, 'rxbps', 'Bandwidth (Gbps)',  gbps)
343        else:
344            printdata(runs, gbps)
345        return
346
347    if command == 'txbps':
348        gbps = system.tsunami.etherdev.txBandwidth / 1e9
349        if options.graph:
350            graphdata(runs, 'txbps', 'Bandwidth (Gbps)',  gbps)
351        else:
352            printdata(runs, gbps)
353        return
354
355    if command == 'bps':
356        rxbps = system.tsunami.etherdev.rxBandwidth
357        txbps = system.tsunami.etherdev.txBandwidth
358        gbps = (rxbps + txbps) / 1e9
359        if options.graph:
360            graphdata(runs, 'bps', 'Bandwidth (Gbps)',  gbps)
361        else:
362            printdata(runs, gbps)
363        return
364
365    if command == 'misses':
366        stat = system.L2.overall_mshr_misses
367        if options.binned:
368            print '%s kernel stats' % stat.name
369            stat.bins = 'kernel'
370            printdata(runs, stat)
371
372            print '%s idle stats' % stat.name
373            stat.bins = 'idle'
374            printdata(runs, stat)
375
376            print '%s user stats' % stat.name
377            stat.bins = 'user'
378            printdata(runs, stat)
379
380            print '%s total stats' % stat.name
381
382        stat.bins = None
383        if options.graph:
384            graphdata(runs, 'misses', 'Overall MSHR Misses', stat)
385        else:
386            printdata(runs, stat)
387        return
388
389    if command == 'mpkb':
390        misses = system.L2.overall_mshr_misses
391        rxbytes = system.tsunami.etherdev.rxBytes
392        txbytes = system.tsunami.etherdev.txBytes
393
394        if options.binned:
395            print 'mpkb kernel stats'
396            misses.bins = 'kernel'
397            mpkb = misses / ((rxbytes + txbytes) / 1024)
398            printdata(runs, mpkb)
399
400            print 'mpkb idle stats'
401            misses.bins = 'idle'
402            mpkb = misses / ((rxbytes + txbytes) / 1024)
403            printdata(runs, mpkb)
404
405            print 'mpkb user stats'
406            misses.bins = 'user'
407            mpkb = misses / ((rxbytes + txbytes) / 1024)
408            printdata(runs, mpkb)
409
410            print 'mpkb total stats'
411
412        mpkb = misses / ((rxbytes + txbytes) / 1024)
413        misses.bins = None
414        if options.graph:
415            graphdata(runs, 'mpkb', 'Misses / KB',  mpkb)
416        else:
417            printdata(runs, mpkb)
418        return
419
420    if command == 'execute':
421        printdata(runs, system.full_cpu.ISSUE__count)
422        return
423
424    if command == 'commit':
425        printdata(runs, system.full_cpu.COM__count)
426        return
427
428    if command == 'fetch':
429        printdata(runs, system.full_cpu.FETCH__count)
430        return
431
432    if command == 'bpp':
433        ed = system.tsunami.etherdev
434        bpp = (ed.rxBytes + ed.txBytes) / (ed.rxPackets + ed.txPackets)
435        if options.graph:
436            graphdata(runs, 'bpp', 'Bytes / Packet',  bpp)
437        else:
438            printdata(runs, bpp)
439        return
440
441    if command == 'rxbpp':
442        bpp = system.tsunami.etherdev.rxBytes / system.tsunami.etherdev.rxPackets
443        if options.graph:
444            graphdata(runs, 'rxbpp', 'Receive Bytes / Packet',  bpp)
445        else:
446            printdata(runs, bpp)
447        return
448
449    if command == 'txbpp':
450        bpp = system.tsunami.etherdev.txBytes / system.tsunami.etherdev.txPackets
451        if options.graph:
452            graphdata(runs, 'txbpp', 'Transmit Bytes / Packet',  bpp)
453        else:
454            printdata(runs, bpp)
455        return
456
457    if command == 'rtp':
458        rtp = system.tsunami.etherdev.rxPackets / system.tsunami.etherdev.txPackets
459        if options.graph:
460            graphdata(runs, 'rtp', 'rxPackets / txPackets',  rtp)
461        else:
462            printdata(runs, rtp)
463        return
464
465    if command == 'rtb':
466        rtb = system.tsunami.etherdev.rxBytes / system.tsunami.etherdev.txBytes
467        if options.graph:
468            graphdata(runs, 'rtb', 'rxBytes / txBytes',  rtb)
469        else:
470            printdata(runs, rtb)
471        return
472
473    raise CommandException
474
475
476class Options: pass
477
478if __name__ == '__main__':
479    import getpass
480
481    options = Options()
482    options.host = 'zizzer.pool'
483    options.db = None
484    options.passwd = ''
485    options.user = getpass.getuser()
486    options.runs = None
487    options.system = 'client'
488    options.get = None
489    options.binned = False
490    options.graph = False
491
492    opts, args = getopts(sys.argv[1:], '-BEFGd:g:h:pr:s:u:')
493    for o,a in opts:
494        if o == '-B':
495            options.binned = True
496        if o == '-E':
497            printval.mode = 'E'
498        if o == '-F':
499            printval.mode = 'F'
500        if o == '-G':
501            options.graph = True;
502        if o == '-d':
503            options.db = a
504        if o == '-g':
505            options.get = a
506        if o == '-h':
507            options.host = a
508        if o == '-p':
509            options.passwd = getpass.getpass()
510        if o == '-r':
511            options.runs = a
512        if o == '-u':
513            options.user = a
514        if o == '-s':
515            options.system = a
516
517    if len(args) == 0:
518        usage()
519
520    command = args[0]
521    args = args[1:]
522
523    try:
524        commands(options, command, args)
525    except CommandException:
526        usage()
527