Test scaling.py: Difference between revisions
From Biowerkzeug Wiki
				
				
				Jump to navigationJump to search
				
				
No edit summary  | 
				 test_scaling.py 2534 2008-12-07 15:59:59Z  | 
				||
| Line 2: | Line 2: | ||
<pre>#!/usr/bin/env python  | <pre>#!/usr/bin/env python  | ||
# $Id: test_scaling.py   | # $Id: test_scaling.py 2534 2008-12-07 15:59:59Z www-data $  | ||
# Testing scaling of hippo  | # Testing scaling of hippo  | ||
# Copyright (c) 2008 Biowerkzeug  | # Copyright (c) 2008 Biowerkzeug  | ||
| Line 42: | Line 42: | ||
   walltime = float(m.group('T_SECONDS'))  |    walltime = float(m.group('T_SECONDS'))  | ||
   runtime[numthreads] = walltime  |    runtime[numthreads] = walltime  | ||
   scaling =   |    scaling = runtime[1]/walltime           # runtime[1] is known after the first iteration!    | ||
   out.write("%(numthreads)d %(walltime)f %(scaling)f\n" % vars())  |    out.write("%(numthreads)d %(walltime)f %(scaling)f\n" % vars())  | ||
out.close()  | out.close()  | ||
Revision as of 16:00, 7 December 2008
Python script that uses calc_testjobs_linux.sh to benchmark scaling using the walp_octane_NPT_sp_MD test case. See Talk:Performance#Scaling for details.
#!/usr/bin/env python
# $Id: test_scaling.py 2534 2008-12-07 15:59:59Z www-data $
# Testing scaling of hippo
# Copyright (c) 2008 Biowerkzeug
# Oliver Beckstein  <orbeckst@gmail.com>
from subprocess import Popen,PIPE
import sys,re
calc_test_jobs = '/home/oliver/Library/Hippo/Benchmark/calc_testjobs_linux.sh'
hippo_test_case = 'walp_octane_NPT_sp_MD'
filename = "scaling.xvg"
figname = "scaling.png"
try:
  maxslots = int(sys.argv[1])
except:
  print "usage: %s NSLOTS" % sys.argv[0]
  sys.exit(1)
slotrange = (1,maxslots+1) # <--- 1-4 !!
benchmark_pattern = re.compile(r'BENCHMARK:\s*(\w+)\s+(?P<NUMTHREADS>[0-9]+)\s+(?P<T_SECONDS>[0-9.]+)')
runtime = {}
out = open(filename,'w')
out.write("# scaling for Hippo\n# numthreads walltime/s  scaling\n")
for NSLOTS in xrange(*slotrange):
  print "-- running NSLOTS = %(NSLOTS)d" % vars()
  p1 = Popen([calc_test_jobs, '-n', str(NSLOTS), hippo_test_case],stdout=PIPE)
  p2 = Popen(['grep','BENCHMARK:'],stdin=p1.stdout,stdout=PIPE)
  output = p2.communicate()[0]
  m = benchmark_pattern.match(output)
  print "output: ",output,
  if not m:
      print "ERROR: no benchmark data found"
      continue    
  numthreads = int(m.group('NUMTHREADS'))
  walltime = float(m.group('T_SECONDS'))
  runtime[numthreads] = walltime
  scaling = runtime[1]/walltime           # runtime[1] is known after the first iteration! 
  out.write("%(numthreads)d %(walltime)f %(scaling)f\n" % vars())
out.close()
# Analysis
import numpy
import pylab
N = numpy.sort(runtime.keys())
T = numpy.array([runtime[n] for n in N],dtype=float)
S = T[0]/T
pylab.clf()
pylab.subplot(211)
pylab.title('Hippo test case: '+hippo_test_case)
pylab.xlabel('cpus')
pylab.ylabel('walltime/s')
pylab.plot(N,T,'ro-')
pylab.subplot(212)
pylab.xlabel('cpus')
pylab.ylabel('scaling')
pylab.plot(N,S,'ro-')
pylab.plot([N[0],N[-1]], [1,N[-1]], 'k--')
pylab.savefig(figname)
print "Saved figure "+figname