In [ ]:
%matplotlib inline
#%matplotlib notebook
from datetime import datetime
import numpy as np
import os
import matplotlib
#matplotlib.rcParams['savefig.dpi'] = 200
matplotlib.rcParams['figure.figsize'] = (12.0, 8.0)
matplotlib.rcParams["font.size"] = 16
import matplotlib.pyplot as plt

In [ ]:
class Logfile():
    def __init__(self, dirname, results):
        self.dirname = dirname
        dtimes, steps, ts, dts, nProcs, tot_blks, max_blks = zip(*results)
        dtimes = list(dtimes)
        dt_steps = [(dtimes[i+1]-dtimes[i]).total_seconds() for i in range(len(dtimes)-1)]

        self.dtimes = dtimes
        self.steps = steps
        self.ts = ts
        self.dts = dts
        self.dt_steps = dt_steps
        self.nProcs = nProcs
        self.tot_blks = tot_blks
        self.max_blks = max_blks
    

def parse_logfile(fname):
    dirname = fname.split('/')[-2]
    startmarks = []
    results = []
    with open(fname, 'r') as f:
        start = False
        for line in f.readlines():
            if 'FLASH log file:' in line:
                start = True
            if 'Number of MPI tasks:' in line:
                nProc = int(line.split()[-1])
            if '[GRID amr_refine_derefine] min blks' in line:
                tot_blks = int(line.split()[-1])
                max_blks = int(line.split()[-4])
            if 'step: n=' in line:
                dummy, date, time, dummy, dummy, step, t, dt = line.split()
                dtime = datetime.strptime(date+' '+time, '%m-%d-%Y %H:%M:%S.%f')
                step = int(step.lstrip('n='))
                t = float(t.lstrip('t='))
                dt = float(dt.lstrip('dt='))
                results.append([dtime, step, t, dt, nProc, tot_blks, max_blks])
                if start:
                    startmarks.append([step])
                    start = False
                    
    return Logfile(dirname, results)

In [ ]:
fnames = [
          #'/home/ychen/Mount/stampede2/0905_stampede2_test/stampede2_16_1024/MHD_Jet.log',
          #'/home/ychen/Mount/stampede2/0905_stampede2_test/stampede2_32_2048/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/skx_2_96/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/skx_3_144/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/skx_4_192/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/skx_6_288/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/skx_8_384/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/skx_4_144/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/skx_4_96/MHD_Jet.log',
          '/d/d9/ychen/stampede2_test/aciuniv2_3_60/MHD_Jet.log',
          '/d/d9/ychen/stampede2_test/acipre_8_160/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/knl_16_1024/MHD_Jet.log',
          '/d/d9/ychen/stampede2_test/stampede_32_512/MHD_Jet.log',
          '/d/d9/ychen/stampede2_test/aciastro3_3_60/MHD_Jet.log'
          ]

def label(dirname):
    machine, n_node, n_cpu = dirname.split('_')
    return '%s (%s nodes, %s tasks)' % (machine, n_node, n_cpu)

fig = plt.figure(figsize=(15,8))
ax = plt.subplot(111)

for fname in fnames:
    log = parse_logfile(fname)
    n_node = int(fname.strip('/MHD_Jet.log').split('_')[-2])
    n_cpu = int(fname.strip('/MHD_Jet.log').split('_')[-1])
    #plt.scatter(log.steps[1:], log.dt_steps, s=5, linewidth=1, label=log.dirname)
    # Number of total blocks in million
    Mblks = np.array(log.tot_blks[1:])/1E6
    speed = Mblks*3600.0/np.array(log.dt_steps)/n_node
    speed = (speed[:-1]+speed[1:])/2
    ax.plot(np.array(log.steps[1:-1])-log.steps[0], speed, label=label(log.dirname) + ' avg: %.2f' % np.average(speed),)
    
    print('%18s: %2i nodes, %.2f steps/min %.4f Mblk-steps/hour/node, tot blks: %i, max blks: %i, nProc: %i' % 
          (log.dirname, n_node, np.average(1.0/np.array(log.dt_steps[:])*60), 
           np.average(speed),
           np.average(log.tot_blks), np.average(log.max_blks), np.average(log.nProcs)))

#plt.ylim(0, 0.12)
ax.set_xlim(0, 200)
ax.set_xlabel('# of step')
#plt.semilogy()
ax.set_ylabel('M blk-steps/hour/node')
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width * 0.6, box.height])

# Put a legend to the right of the current axis
ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))

In [ ]:
fnames = [
          '/home/ychen/Mount/stampede2/1219_skx_test/skx_4_96/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/skx_4_144/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/skx_4_192/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/failed/skx_4_288/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/failed/skx_4_384/MHD_Jet.log',
        ]

def label(dirname):
    machine, n_node, n_cpu = dirname.split('_')
    return '%s (%s nodes, %s tasks)' % (machine, n_node, n_cpu)

for fname in fnames:
    log = parse_logfile(fname)
    n_node = int(fname.strip('/MHD_Jet.log').split('_')[-2])
    n_cpu = int(fname.strip('/MHD_Jet.log').split('_')[-1])
    #plt.scatter(log.steps[1:], log.dt_steps, s=5, linewidth=1, label=log.dirname)
    # Number of total blocks in million
    Mblks = np.array(log.tot_blks[1:])/1E6
    speed = Mblks*3600.0/np.array(log.dt_steps)/n_node
    speed = (speed[:-1]+speed[1:])/2
    plt.plot(np.array(log.steps[1:-1])-log.steps[0], speed, label=label(log.dirname) + ' avg: %.2f' % np.average(speed),)
    
    print('%18s: %2i nodes, %.2f steps/min %.4f Mblk-steps/hour/node, tot blks: %i, max blks: %i, nProc: %i' % 
          (log.dirname, n_node, np.average(1.0/np.array(log.dt_steps[:])*60), 
           np.average(speed),
           np.average(log.tot_blks), np.average(log.max_blks), np.average(log.nProcs)))

#plt.ylim(0, 0.12)
plt.xlabel('# of step')
#plt.semilogy()
plt.ylabel('Mblk-steps/hour/node')
plt.legend(loc=5)

In [ ]:
fnames = [
          #'/home/ychen/Mount/stampede2/0905_stampede2_test/stampede2_16_1024/MHD_Jet.log',
          #'/home/ychen/Mount/stampede2/0905_stampede2_test/stampede2_32_2048/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/skx_4_96/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/skx_4_144/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/skx_2_96/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/skx_3_144/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/skx_4_192/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/skx_6_288/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/skx_8_384/MHD_Jet.log',
          
          
          '/d/d9/ychen/stampede2_test/aciuniv2_3_60/MHD_Jet.log',
          '/d/d9/ychen/stampede2_test/acipre_8_160/MHD_Jet.log',
          
          '/d/d9/ychen/stampede2_test/stampede_32_512/MHD_Jet.log',
          '/d/d9/ychen/stampede2_test/aciastro3_3_60/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/knl_16_1024/MHD_Jet.log',
          ]
def label(dirname):
    machine, n_node, n_cpu = dirname.split('_')
    return '%s (%s nodes, %s tasks)' % (machine, n_node, n_cpu)

fig = plt.figure(figsize=(15,8))
ax = plt.subplot(111)

for fname in fnames:
    log = parse_logfile(fname)
    n_node = int(fname.strip('/MHD_Jet.log').split('_')[-2])
    n_cpu = int(fname.strip('/MHD_Jet.log').split('_')[-1])
    #plt.scatter(log.steps[1:], log.dt_steps, s=5, linewidth=1, label=log.dirname)
    # Number of total blocks in million
    Mblks = np.array(log.tot_blks[1:])/1E6
    speed = Mblks*3600.0/np.array(log.dt_steps)/n_cpu
    speed = (speed[:-1]+speed[1:])/2
    ax.plot(np.array(log.steps[1:-1])-log.steps[0], speed, label=label(log.dirname) + ' %.3f' % np.average(speed))
    
    print('%18s: %2i nodes, %.2f steps/min %.4f Mblk-steps/hour/task, tot blks: %i, max blks: %i, nProc: %i' % 
          (log.dirname, n_node, np.average(1.0/np.array(log.dt_steps[:])*60), 
           np.average(speed),
           np.average(log.tot_blks), np.average(log.max_blks), np.average(log.nProcs)))

#plt.ylim(0, 0.12)
ax.set_xlabel('# of step')
#plt.semilogy()
ax.set_ylabel('Mblk-steps/hour/task')
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width * 0.6, box.height])

# Put a legend to the right of the current axis
ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))

In [ ]:
fnames = ['/d/d9/ychen/stampede2_test/stampede_32_512/MHD_Jet.log',
          #'/home/ychen/Mount/stampede2/0905_stampede2_test/stampede2_16_1024/MHD_Jet.log',
          #'/home/ychen/Mount/stampede2/0905_stampede2_test/stampede2_32_2048/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/knl_16_1024/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/skx_2_96/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/skx_3_144/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/skx_4_192/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/skx_6_288/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/skx_8_384/MHD_Jet.log',
          #'/home/ychen/Mount/stampede2/1219_skx_test/skx_8_768/MHD_Jet.log',
          '/d/d9/ychen/stampede2_test/acipre_8_160/MHD_Jet.log',
          '/d/d9/ychen/stampede2_test/aciastro3_3_60/MHD_Jet.log',
          #'/d/d9/ychen/stampede2_test/aciuniv2_3_60/MHD_Jet.log'
         ]

def label(dirname):
    machine, n_node, n_cpu = dirname.split('_')
    machine = 'aci' if machine in ['acipre', 'aciuniv2'] else machine
    return '%s (%s nodes, %s tasks)' % (machine, n_node, n_cpu)

fig = plt.figure(figsize=(15,8))

for fname in fnames:
    log = parse_logfile(fname)
    n_node = int(fname.strip('/MHD_Jet.log').split('_')[-2])
    n_cpu = int(fname.strip('/MHD_Jet.log').split('_')[-1])
    tot_time = (log.dtimes[-1] - log.dtimes[0]).total_seconds()/np.average(log.tot_blks)/(log.steps[-1]-log.steps[0])
    print(log.dirname, n_node, tot_time)
    plot = plt.plot(n_node, tot_time, markersize=10, marker='x', label=log.dirname)
    plt.annotate(label(log.dirname), (n_node*1.05, tot_time*1.05))
    if log.dirname == 'skx_2_96':
        skx2_time = tot_time
    if log.dirname == 'aciastro3_3_60':
        aci3_time = tot_time

nodes = np.linspace(1.5, 150, 10)
times = skx2_time*2/nodes
times2 = aci3_time*3/nodes
plt.plot(nodes, times, ':', alpha=0.5, c='grey')
plt.plot(nodes, times2, ':', alpha=0.5, c='grey')
    
plt.ylim(6E-5, 3E-3)
plt.xlim(1.5, 150)
plt.xlabel('# of nodes')
plt.semilogy()
plt.semilogx()
plt.grid(which='both')
plt.ylabel('average time for 1 step-block (s)')
#plt.legend(loc=5)

In [ ]:
fnames = ['/d/d9/ychen/stampede2_test/stampede_32_512/MHD_Jet.log',
          #'/home/ychen/Mount/stampede2/0905_stampede2_test/stampede2_16_1024/MHD_Jet.log',
          #'/home/ychen/Mount/stampede2/0905_stampede2_test/stampede2_32_2048/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/knl_16_1024/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/skx_2_96/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/skx_3_144/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/skx_4_192/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/skx_6_288/MHD_Jet.log',
          '/home/ychen/Mount/stampede2/1219_skx_test/skx_8_384/MHD_Jet.log',
          #'/home/ychen/Mount/stampede2/1219_skx_test/skx_8_768/MHD_Jet.log',
          '/d/d9/ychen/stampede2_test/acipre_8_160/MHD_Jet.log',
          '/d/d9/ychen/stampede2_test/aciastro3_3_60/MHD_Jet.log',
          #'/d/d9/ychen/stampede2_test/aciuniv2_3_60/MHD_Jet.log'
         ]

def label(dirname):
    machine, n_node, n_cpu = dirname.split('_')
    return '%s (%s nodes, %s tasks)' % (machine, n_node, n_cpu)

fig = plt.figure(figsize=(15,8))

for fname in fnames:
    log = parse_logfile(fname)
    n_node = int(fname.strip('/MHD_Jet.log').split('_')[-2])
    n_cpu = int(fname.strip('/MHD_Jet.log').split('_')[-1])
    tot_time = (log.dtimes[-1] - log.dtimes[0]).total_seconds()/np.average(log.tot_blks)/(log.steps[-1]-log.steps[0])
    print(log.dirname, n_node, tot_time)
    plt.plot(n_cpu, tot_time, markersize=10, marker='x', label=log.dirname)
    if 'skx' in log.dirname:
        plt.annotate(label(log.dirname), (n_cpu*0.30, tot_time*0.9))
    elif 'knl' in log.dirname:
        plt.annotate(label(log.dirname), (n_cpu*0.6, tot_time*1.1))
    else:
        plt.annotate(label(log.dirname), (n_cpu*1.05, tot_time*1.05))
    if log.dirname == 'skx_2_96':
        skx2_time = tot_time
    if log.dirname == 'aciastro3_3_60':
        aci3_time = tot_time

cpus = np.linspace(25, 3000, 10)
times = skx2_time*96/cpus
times2 = aci3_time*60/cpus
plt.plot(cpus, times, ':', alpha=0.5, c='grey')
plt.plot(cpus, times2, ':', alpha=0.5, c='grey')
    
plt.ylim(6E-5, 3E-3)
plt.xlim(25, 3000)
plt.xlabel('# of tasks')
plt.semilogy()
plt.semilogx()
plt.grid(which='both')
plt.ylabel('average time for 1 step-block (s)')
#plt.legend(loc=5)

In [ ]: