xref: /petsc/src/benchmarks/benchmarkAssembly.py (revision 6cbfa02c2e16fa342be1d9390e5b53eb3576447a)
1c87d2d20SMatthew G Knepley#!/usr/bin/env python
2c87d2d20SMatthew G Knepleyimport os
3c87d2d20SMatthew G Knepleyfrom benchmarkExample import PETScExample
4c87d2d20SMatthew G Knepley
5*6cbfa02cSMatthew G Knepleydef calculateNonzeros(n):
6*6cbfa02cSMatthew G Knepley  num = 0
7*6cbfa02cSMatthew G Knepley  # corners
8*6cbfa02cSMatthew G Knepley  num += 2*3 + 2*4
9*6cbfa02cSMatthew G Knepley  # edges
10*6cbfa02cSMatthew G Knepley  num += 4*(n-2)*5
11*6cbfa02cSMatthew G Knepley  # interior
12*6cbfa02cSMatthew G Knepley  num += (n-2)*(n-2)*7
13*6cbfa02cSMatthew G Knepley  return num
14*6cbfa02cSMatthew G Knepley
15c87d2d20SMatthew G Knepleydef processSummary(moduleName, times, events):
16c87d2d20SMatthew G Knepley  '''Process the Python log summary into plot data'''
17c87d2d20SMatthew G Knepley  m = __import__(moduleName)
18c87d2d20SMatthew G Knepley  reload(m)
19c87d2d20SMatthew G Knepley  # Total Time
20c87d2d20SMatthew G Knepley  times.append(m.Time[0])
21c87d2d20SMatthew G Knepley  # Common events
22c87d2d20SMatthew G Knepley  #   Add the time and flop rate
230cfd297dSMatthew G Knepley  for stageName, eventName in [('GPU_Stage','MatCUSPSetValBch'), ('CPU_Stage','ElemAssembly')]:
240cfd297dSMatthew G Knepley    s = getattr(m, stageName)
250cfd297dSMatthew G Knepley    if not eventName in events:
260cfd297dSMatthew G Knepley      events[eventName] = []
270cfd297dSMatthew G Knepley    events[eventName].append((s.event[eventName].Time[0], s.event[eventName].Flops[0]/(s.event[eventName].Time[0] * 1e6)))
28c87d2d20SMatthew G Knepley  return
29c87d2d20SMatthew G Knepley
30*6cbfa02cSMatthew G Knepleydef plotSummary(library, num, sizes, nonzeros, times, events):
31*6cbfa02cSMatthew G Knepley  from pylab import legend, plot, show, title, xlabel, ylabel, ylim
32c87d2d20SMatthew G Knepley  import numpy as np
33*6cbfa02cSMatthew G Knepley  showEventTime      = False
34*6cbfa02cSMatthew G Knepley  showTimePerRow     = False
35*6cbfa02cSMatthew G Knepley  showTimePerNonzero = True
36c87d2d20SMatthew G Knepley  print events
37c87d2d20SMatthew G Knepley  if showEventTime:
38c87d2d20SMatthew G Knepley    data  = []
39c87d2d20SMatthew G Knepley    names = []
40c87d2d20SMatthew G Knepley    for event, style in [('MatCUSPSetValBch', 'b-'), ('ElemAssembly', 'b:')]:
41c87d2d20SMatthew G Knepley      names.append(event)
42c87d2d20SMatthew G Knepley      data.append(sizes)
43c87d2d20SMatthew G Knepley      data.append(np.array(events[event])[:,0])
44c87d2d20SMatthew G Knepley      data.append(style)
45c87d2d20SMatthew G Knepley    plot(*data)
46c87d2d20SMatthew G Knepley    title('Performance on '+library+' Example '+str(num))
47c87d2d20SMatthew G Knepley    xlabel('Number of Dof')
48c87d2d20SMatthew G Knepley    ylabel('Time (s)')
49c87d2d20SMatthew G Knepley    legend(names, 'upper left', shadow = True)
50c87d2d20SMatthew G Knepley    show()
51*6cbfa02cSMatthew G Knepley  if showTimePerRow:
52*6cbfa02cSMatthew G Knepley    data  = []
53*6cbfa02cSMatthew G Knepley    names = []
54*6cbfa02cSMatthew G Knepley    for event, style in [('MatCUSPSetValBch', 'b-'), ('ElemAssembly', 'b:')]:
55*6cbfa02cSMatthew G Knepley      names.append(event)
56*6cbfa02cSMatthew G Knepley      data.append(sizes)
57*6cbfa02cSMatthew G Knepley      rows = np.sqrt(sizes)
58*6cbfa02cSMatthew G Knepley      data.append(np.array(events[event])[:,0]/rows/3)
59*6cbfa02cSMatthew G Knepley      data.append(style)
60*6cbfa02cSMatthew G Knepley    plot(*data)
61*6cbfa02cSMatthew G Knepley    title('Performance on '+library+' Example '+str(num))
62*6cbfa02cSMatthew G Knepley    xlabel('Number of Dof')
63*6cbfa02cSMatthew G Knepley    ylabel('Time/Row (s)')
64*6cbfa02cSMatthew G Knepley    legend(names, 'upper left', shadow = True)
65*6cbfa02cSMatthew G Knepley    show()
66*6cbfa02cSMatthew G Knepley  if showTimePerNonzero:
67*6cbfa02cSMatthew G Knepley    data  = []
68*6cbfa02cSMatthew G Knepley    names = []
69*6cbfa02cSMatthew G Knepley    for event, style in [('MatCUSPSetValBch', 'b-'), ('ElemAssembly', 'b:')]:
70*6cbfa02cSMatthew G Knepley      names.append(event)
71*6cbfa02cSMatthew G Knepley      data.append(sizes)
72*6cbfa02cSMatthew G Knepley      data.append(np.array(events[event])[:,0]/nonzeros * 10**9)
73*6cbfa02cSMatthew G Knepley      data.append(style)
74*6cbfa02cSMatthew G Knepley    plot(*data)
75*6cbfa02cSMatthew G Knepley    title('Performance on '+library+' Example '+str(num))
76*6cbfa02cSMatthew G Knepley    xlabel('Number of Dof')
77*6cbfa02cSMatthew G Knepley    ylabel('Time/Nonzero (ns)')
78*6cbfa02cSMatthew G Knepley    legend(names, 'center right', shadow = True)
79*6cbfa02cSMatthew G Knepley    show()
80c87d2d20SMatthew G Knepley  return
81c87d2d20SMatthew G Knepley
82c87d2d20SMatthew G Knepleyif __name__ == '__main__':
83c87d2d20SMatthew G Knepley  library = 'KSP'
84c87d2d20SMatthew G Knepley  num     = 4
85c87d2d20SMatthew G Knepley  ex      = PETScExample(library, num, log_summary_python='summary.py', preload='off')
86*6cbfa02cSMatthew G Knepley  if 0:
87c87d2d20SMatthew G Knepley    sizes    = []
88*6cbfa02cSMatthew G Knepley    nonzeros = []
89c87d2d20SMatthew G Knepley    times    = []
90c87d2d20SMatthew G Knepley    events   = {}
91c87d2d20SMatthew G Knepley    for n in [10, 20, 50, 100, 150, 200, 250, 300, 350]:
92c87d2d20SMatthew G Knepley      ex.run(da_grid_x=n, da_grid_y=n, cusp_synchronize=1)
93c87d2d20SMatthew G Knepley      sizes.append(n*n)
94*6cbfa02cSMatthew G Knepley      nonzeros.append(calculateNonzeros(n))
95c87d2d20SMatthew G Knepley      processSummary('summary', times, events)
96*6cbfa02cSMatthew G Knepley    plotSummary(library, num, sizes, nonzeros, times, events)
9721c1d55bSMatthew G Knepley  else:
9821c1d55bSMatthew G Knepley    sizes    = []
99*6cbfa02cSMatthew G Knepley    nonzeros = []
100*6cbfa02cSMatthew G Knepley    times    = []
10121c1d55bSMatthew G Knepley    for n in range(150, 1350, 100):
10221c1d55bSMatthew G Knepley      sizes.append(n*n)
103*6cbfa02cSMatthew G Knepley      nonzeros.append(calculateNonzeros(n))
10421c1d55bSMatthew G Knepley    baconostEvents = {'ElemAssembly': [(0.040919999999999998, 0.0), (0.1242, 0.0), (0.24410000000000001, 0.0), (0.374, 0.0), (0.56259999999999999, 0.0), (0.79049999999999998, 0.0), (1.0880000000000001, 0.0), (1.351, 0.0), (1.6930000000000001, 0.0), (2.0609999999999999, 0.0), (2.4820000000000002, 0.0), (3.0640000000000001, 0.0)], 'MatCUSPSetValBch': [(0.0123, 0.0), (0.023429999999999999, 0.0), (0.043540000000000002, 0.0), (0.06608, 0.0), (0.09579, 0.0), (0.12920000000000001, 0.0), (0.17169999999999999, 0.0), (0.2172, 0.0), (0.27179999999999999, 0.0), (0.48309999999999997, 0.0), (0.44180000000000003, 0.0), (0.51529999999999998, 0.0)]}
105*6cbfa02cSMatthew G Knepley    plotSummary(library, num, sizes, nonzeros, times, baconostEvents)
106