plot_timing_stats.py.html | |
Source file: plot_timing_stats.py | |
Directory: /Users/rjl/clawpack_src/clawpack_master/amrclaw/examples/advection_2d_inflow | |
Converted: Mon Feb 19 2024 at 17:58:02 using clawcode2html | |
This documentation file will not reflect any later changes in the source file. |
""" Plot timing info found in timing.csv file. Requires modified valout function from Clawpack 5.5.0 to print this info. This might eventually be turned into a more general utility function in visclaw. For now, copy this file and modify it for your needs. """ from __future__ import print_function from pylab import * import os # Location of timing.csv files: outdir = '_output' make_pngs = True # print plots? def make_png(fname): savefig(fname) #savefig(fname, bbox_inches='tight') print('Created %s' % fname) # set desired units for simulation time and computer time, # based on length of run: # set units and scaling factors for Simulation time t (simtime), # CPU/Wall time (comptime), and for number of cells updated. # units is used for text in plots, factor is used for scaling values read in # if None, then no units appear in plots, and/or no scaling is done. # computer time is recorded in seconds so this is the natural units: comptime_units = 'seconds' if comptime_units == 'seconds': comptime_factor = 1 elif comptime_units == 'minutes': comptime_factor = 60. elif comptime_units == 'hours': comptime_factor = 3600. else: comptime_factor = 1 # for applications where t in the PDE is dimensionless, use this: simtime_units = 'dimensionless' simtime_factor = 1 # for GeoClaw or other applications where the simulation time is in # seconds, set simtime_units to 'seconds', 'minutes' or 'hours' depending # on time scale of simulation and use this: #simtime_units = 'seconds' if simtime_units == 'seconds': simtime_factor = 1 elif simtime_units == 'minutes': simtime_factor = 60. elif simtime_units == 'hours': simtime_factor = 3600. # if the time units in the application are different, set simtime_units # and simtime_factor appropriately. # Some useful units for cell updates: #cell_units = None # for raw cell count cell_units = 'millions' if cell_units == 'millions': cell_factor = 1e6 elif cell_units == 'billions': cell_factor = 1e9 elif cell_units == 'trillions': cell_factor = 1e12 else: cell_factor = 1 # define colors, with colors[0] used for overhead, colors[j] for level j >= 1 colors = ['y'] + 3*['r','g','m','c','b'] # allow <= 15 levels # Read in timing states from output directory: timing_stats_file = os.path.join(outdir, 'timing.csv') timing_stats = loadtxt(timing_stats_file, skiprows=1, delimiter=',') ntimes = timing_stats.shape[0] nlevels = int(timing_stats.shape[1] / 3) - 1 time = zeros(ntimes) total_cpu = zeros(ntimes) total_wall = zeros(ntimes) wtime = zeros((ntimes, nlevels)) cpu = zeros((ntimes, nlevels)) cells = zeros((ntimes, nlevels)) for j in range(ntimes): time[j] = timing_stats[j,0] / simtime_factor total_wall[j] = timing_stats[j,1] / comptime_factor total_cpu[j] = timing_stats[j,2] / comptime_factor for level in range(nlevels): wtime[j, level] = timing_stats[j,3*level + 3] / comptime_factor cpu[j, level] = timing_stats[j,3*level + 4] / comptime_factor cells[j, level] = timing_stats[j,3*level + 5] / cell_factor xlimits = [time.min(), time.max()] ylimits_comptime = [0, 1.1*total_cpu.max()] ylimits_cells = [0, 1.1*sum(cells[-1,:])] figure(21) clf() sum_cells_over_levels = zeros(ntimes) for j in range(nlevels): if max(cells[:,j]) == 0: break #plot(time/3600, cells[:,j], label='Level %s' % (j+1)) last_sum_cells = sum_cells_over_levels.copy() sum_cells_over_levels += cells[:,j] plot(time, sum_cells_over_levels, 'k') fill_between(time, last_sum_cells, sum_cells_over_levels, color=colors[j+1], label='Level %s' % (j+1)) plot(time, sum_cells_over_levels, 'k', lw=3, label='Total Cells') xlim(xlimits) #ylim(0, 1.1*sum_cells_over_levels[-1]) ylim(ylimits_cells) title('Cumulative cells updated on each level') xlabel('Simulation time t (%s)' % simtime_units) if cell_units is None: ylabel('Grid cells updated') else: ylabel('Grid cells updated (%s)' % cell_units) legend(loc='upper left') if make_pngs: make_png('CumCellUpdates.png') figure(22) clf() sum_cpu_over_levels = zeros(ntimes) for j in range(nlevels): if max(cpu[:,j]) == 0: break #plot(time/3600, cpu[:,j], label='Level %s' % (j+1)) last_sum_cpu = sum_cpu_over_levels.copy() sum_cpu_over_levels += cpu[:,j] fill_between(time, last_sum_cpu, sum_cpu_over_levels, color=colors[j+1], label='Level %s' % (j+1)) plot(time, sum_cpu_over_levels, 'k') fill_between(time, total_cpu,sum_cpu_over_levels,color=colors[0], label='Overhead') plot(time, total_cpu, 'k', lw=3, label='Total CPU') xlim(xlimits) ylim(ylimits_comptime) title('Cumulative CPU time on each level') xlabel('Simulation time t (%s)' % simtime_units) ylabel('CPU time (%s)' % comptime_units) legend(loc='upper left') if make_pngs: make_png('CumCPUtime.png') figure(23) clf() sum_wtime_over_levels = zeros(ntimes) for j in range(nlevels): if max(wtime[:,j]) == 0: break last_sum_wtime = sum_wtime_over_levels.copy() sum_wtime_over_levels += wtime[:,j] fill_between(time, last_sum_wtime, sum_wtime_over_levels, color=colors[j+1], label='Level %s' % (j+1)) plot(time, sum_wtime_over_levels, 'k') fill_between(time, total_wall, sum_wtime_over_levels, color=colors[0], label='Overhead') plot(time, total_wall, 'k', lw=3, label='Total Wall') title('Cumulative wall time on each level') xlabel('Simulation time t (%s)' % simtime_units) ylabel('CPU time (%s)' % comptime_units) legend(loc='upper left') xlim(xlimits) ylim(ylimits_comptime) if make_pngs: make_png('CumWallTime.png') # d cells / dt: figure(31) clf() dc_max = 0 dca = cells[1:,:] - cells[:-1,:] for n in range(1,ntimes): dt = (time[n] - time[n-1]) if dt == 0: break dcn = 0 for j in range(nlevels): if dca[n-1,j] == 0: break tt = array([time[n-1],time[n]]) #last_dc = last_dc + dc dc = (cells[n,j] - cells[n-1,j]) / dt plot(tt, [dcn+dc, dcn+dc], 'k') if n == 1: fill_between(tt, [dcn,dcn], [dcn+dc,dcn+dc], color=colors[j+1], label='Level %s' % (j+1)) else: fill_between(tt, [dcn,dcn], [dcn+dc,dcn+dc], color=colors[j+1]) dcn = dcn + dc plot([time[n-1],time[n-1]], [0,dcn], 'k') plot([time[n],time[n]], [0,dcn], 'k') dc_max = max(dc_max, dcn) xlim(xlimits) ylim(0, 1.2*dc_max) title('Average Cells updated / simulation time') xlabel('Simulation time t (%s)' % simtime_units) ylabel('cell updates / sim time') if cell_units is None: ylabel('Grid cells updated / sim time') else: ylabel('Grid cells updated (%s) / sim time' % cell_units) legend(loc='upper left') if make_pngs: make_png('AveCellUpdates.png') # average cpu_time / dt: figure(32) clf() dc_max = 0 dca = cpu[1:,:] - cpu[:-1,:] for n in range(1,ntimes): dt = (time[n] - time[n-1]) if dt == 0: break dcn = 0 for j in range(nlevels): if dca[n-1,j] == 0: break tt = array([time[n-1],time[n]]) #last_dc = last_dc + dc dc = (cpu[n,j] - cpu[n-1,j]) / dt plot(tt, [dcn+dc, dcn+dc], 'k') if n == 1: fill_between(tt, [dcn,dcn], [dcn+dc,dcn+dc], color=colors[j+1], label='Level %s' % (j+1)) else: fill_between(tt, [dcn,dcn], [dcn+dc,dcn+dc], color=colors[j+1]) dcn = dcn + dc if n == 1: kwargs_label = {'label': 'Overhead'} else: kwargs_label = {} dtot = (total_cpu[n]-total_cpu[n-1]) / dt plot(tt, [dtot,dtot], 'k') fill_between(tt, [dcn,dcn], [dtot,dtot], color=colors[0], alpha=1, edgecolors='k', **kwargs_label) plot([time[n-1],time[n-1]], [0,dtot], 'k') plot([time[n],time[n]], [0,dtot], 'k') dc_max = max(dc_max, dtot) #plot(time, total_cpu, 'k', lw=3, label='Total CPU') #plot(time, sum_cells_over_levels, 'k', lw=3, label='Total Cells') xlim(xlimits) ylimits_avecomptime = [0, 1.2*dc_max] ylim(ylimits_avecomptime) title('Average CPU time / simulation time') xlabel('Simulation time t (%s)' % simtime_units) ylabel('CPU time / sim time') legend(loc='upper left') if make_pngs: make_png('AveCPUTime.png') # average wall time / dt: figure(33) clf() dc_max = 0 dca = wtime[1:,:] - wtime[:-1,:] for n in range(1,ntimes): dt = (time[n] - time[n-1]) if dt == 0: break dcn = 0 for j in range(nlevels): if dca[n-1,j] == 0: break tt = array([time[n-1],time[n]]) #last_dc = last_dc + dc dc = (wtime[n,j] - wtime[n-1,j]) / dt plot(tt, [dcn+dc, dcn+dc], 'k') if n == 1: fill_between(tt, [dcn,dcn], [dcn+dc,dcn+dc], color=colors[j+1], label='Level %s' % (j+1)) else: fill_between(tt, [dcn,dcn], [dcn+dc,dcn+dc], color=colors[j+1]) dcn = dcn + dc if n == 1: kwargs_label = {'label': 'Overhead'} else: kwargs_label = {} dtot = (total_wall[n]-total_wall[n-1]) / dt plot(tt, [dtot,dtot], 'k') fill_between(tt, [dcn,dcn], [dtot,dtot], color=colors[0], alpha=1, edgecolors='k', **kwargs_label) plot([time[n-1],time[n-1]], [0,dtot], 'k') plot([time[n],time[n]], [0,dtot], 'k') dc_max = max(dc_max, dtot) xlim(xlimits) #ylim(0, 1.2*dc_max) ylim(ylimits_avecomptime) title('Average Wall time / simulation time') xlabel('Simulation time t (%s)' % simtime_units) ylabel('wtime time / sim time') legend(loc='upper left') if make_pngs: make_png('AveWallTime.png')