xref: /petsc/src/benchmarks/streams/process.py (revision a253b78679873401fddd34f394d8a7e168ec579c)
11b37a2a7SPierre Jolivet#!/usr/bin/env python3
2d3ae85c4SBarry Smith#
3a6cca095SBarry Smith#    Computers speed up of Streams benchmark results generated by make streams and plots
4a6cca095SBarry Smith#
5a6cca095SBarry Smith#    matplotlib can switch between different backends hence this needs to be run
6a6cca095SBarry Smith#    twice to first generate a file and then display a window
7d3ae85c4SBarry Smith#
85b6bfdb9SJed Brownfrom __future__ import print_function
9d3ae85c4SBarry Smithimport os
10d3ae85c4SBarry Smith#
114198fb66SBarry Smithdef process(streamstype,fileoutput):
12d3ae85c4SBarry Smith  import re
134198fb66SBarry Smith
14a6cca095SBarry Smith  ff = open('scaling.log')
15d3ae85c4SBarry Smith  data = ff.read()
16d3ae85c4SBarry Smith  ff.close()
17d3ae85c4SBarry Smith
185e71baefSBarry Smith  s = data.split('\n')
19d3ae85c4SBarry Smith  triads = {}
20d3ae85c4SBarry Smith  speedups = {}
214198fb66SBarry Smith  size = 0
224198fb66SBarry Smith  for i in s[0:-1]:
234198fb66SBarry Smith      i = i.split()
244198fb66SBarry Smith      triads[size] = float(i[1])
254198fb66SBarry Smith      size = size + 1
26d3ae85c4SBarry Smith
274198fb66SBarry Smith  if size < 2: return
28293a2e3aSBarry Smith
29080f2f32SBarry Smith  triads = list(triads.values())
304198fb66SBarry Smith  speedups = {}
314198fb66SBarry Smith  for i in range(0,size):
324198fb66SBarry Smith    speedups[i] = triads[i]/triads[0]
33d3ae85c4SBarry Smith
34d3ae85c4SBarry Smith  try:
35d3ae85c4SBarry Smith    import matplotlib
36d3ae85c4SBarry Smith  except:
375b6bfdb9SJed Brown    print("Unable to open matplotlib to plot speedup")
38d3ae85c4SBarry Smith    return
39d3ae85c4SBarry Smith
40d3ae85c4SBarry Smith  try:
41a6cca095SBarry Smith    if fileoutput: matplotlib.use('Agg')
42d3ae85c4SBarry Smith    import matplotlib.pyplot as plt
436a90b735SBarry Smith  except:
445b6bfdb9SJed Brown    print("Unable to open matplotlib to plot speedup")
456a90b735SBarry Smith    return
46d3ae85c4SBarry Smith
47182d2d36SBarry Smith  try:
48*a253b786SJosh Hope-Collins    fig, ax1 = plt.subplots(layout='constrained')
494198fb66SBarry Smith    plt.title(streamstype+' Perfect and Streams Speedup')
507137e648SBarry Smith    ax2 = ax1.twinx()
517137e648SBarry Smith    ax1.set_autoscaley_on(False)
528473a99dSBarry Smith
534198fb66SBarry Smith    r = range(1,size+1)
544198fb66SBarry Smith    speedups = speedups.values()
554198fb66SBarry Smith
568473a99dSBarry Smith    # make sure that actual bandwidth values (as opposed to perfect speedup) takes
578473a99dSBarry Smith    # at least a third of the y axis
584198fb66SBarry Smith    ymax = min(size, 3*max(speedups))
594198fb66SBarry Smith    ymin = min(1, min(speedups))
604198fb66SBarry Smith    if ymin < 1: ymin = 0
618473a99dSBarry Smith
624198fb66SBarry Smith    ax1.set_xlim(1,size)
634198fb66SBarry Smith    ax1.set_ylim([ymin,ymax])
644198fb66SBarry Smith    ax1.set_xlabel('Number of processes/threads')
657137e648SBarry Smith    ax1.set_ylabel('Memory Bandwidth Speedup')
66*a253b786SJosh Hope-Collins    ax1.plot(r,r,'b',label='Ideal speedup')
67*a253b786SJosh Hope-Collins    ax1.plot(r,speedups,'r-o', label='Achieved speedup')
687137e648SBarry Smith    ax2.set_autoscaley_on(False)
694198fb66SBarry Smith    ax2.set_xlim([1,size])
704198fb66SBarry Smith    ax2.set_ylim([min(triads),max(triads)])
714198fb66SBarry Smith    ax2.set_ylabel("Achieved Bandwidth. Megabytes per Second")
72*a253b786SJosh Hope-Collins    ax2.plot(r,triads,'g-o', label='Achieved bandwidth')
73*a253b786SJosh Hope-Collins
74*a253b786SJosh Hope-Collins    ax1.legend(loc='center right')
75*a253b786SJosh Hope-Collins    ax2.legend()
767137e648SBarry Smith
77d3ae85c4SBarry Smith    plt.show()
784198fb66SBarry Smith    if fileoutput: plt.savefig(streamstype+'scaling.png')
794198fb66SBarry Smith    if fileoutput: print("See graph in the file src/benchmarks/streams/"+streamstype+"scaling.png")
805b6bfdb9SJed Brown  except Exception as e:
815b6bfdb9SJed Brown    if fileoutput: print("Unable to plot speedup to a file")
825b6bfdb9SJed Brown    else: print("Unable to display speedup plot")
83182d2d36SBarry Smith    return
84d3ae85c4SBarry Smith
851df1832dSBarry Smith  ff.close()
861df1832dSBarry Smith
87d3ae85c4SBarry Smith#
88d3ae85c4SBarry Smith#
89d3ae85c4SBarry Smithif __name__ ==  '__main__':
90d3ae85c4SBarry Smith  import sys
914198fb66SBarry Smith
924198fb66SBarry Smith  process(sys.argv[1],len(sys.argv)-2)
93d3ae85c4SBarry Smith
94d3ae85c4SBarry Smith
95