aboutsummaryrefslogtreecommitdiffstats
path: root/run_exps.py
diff options
context:
space:
mode:
Diffstat (limited to 'run_exps.py')
-rwxr-xr-xrun_exps.py73
1 files changed, 49 insertions, 24 deletions
diff --git a/run_exps.py b/run_exps.py
index 905d033..d7a06b5 100755
--- a/run_exps.py
+++ b/run_exps.py
@@ -2,13 +2,13 @@
2from __future__ import print_function 2from __future__ import print_function
3 3
4import common as com 4import common as com
5import config.config as conf
6import os 5import os
7import re 6import re
8import shutil 7import shutil
9import sys 8import sys
10import run.tracer as trace 9import run.tracer as trace
11 10
11from config.config import PARAMS,DEFAULTS
12from collections import namedtuple 12from collections import namedtuple
13from optparse import OptionParser 13from optparse import OptionParser
14from run.executable.executable import Executable 14from run.executable.executable import Executable
@@ -56,12 +56,13 @@ def parse_args():
56 parser.add_option('-d', '--duration', dest='duration', type='int', 56 parser.add_option('-d', '--duration', dest='duration', type='int',
57 help='duration (seconds) of tasks') 57 help='duration (seconds) of tasks')
58 parser.add_option('-o', '--out-dir', dest='out_dir', 58 parser.add_option('-o', '--out-dir', dest='out_dir',
59 help='directory for data output', default=("%s/run-data"%os.getcwd())) 59 help='directory for data output',
60 default=DEFAULTS['out-run'])
60 parser.add_option('-p', '--params', dest='param_file', 61 parser.add_option('-p', '--params', dest='param_file',
61 help='file with experiment parameters') 62 help='file with experiment parameters')
62 parser.add_option('-c', '--schedule-file', dest='sched_file', 63 parser.add_option('-c', '--schedule-file', dest='sched_file',
63 help='name of schedule files within directories', 64 help='name of schedule files within directories',
64 default=conf.DEFAULTS['sched_file']) 65 default=DEFAULTS['sched_file'])
65 parser.add_option('-f', '--force', action='store_true', default=False, 66 parser.add_option('-f', '--force', action='store_true', default=False,
66 dest='force', help='overwrite existing data') 67 dest='force', help='overwrite existing data')
67 parser.add_option('-j', '--jabber', metavar='username@domain', 68 parser.add_option('-j', '--jabber', metavar='username@domain',
@@ -96,7 +97,7 @@ def convert_data(data):
96 proc = (loc, match.group("CONTENT")) 97 proc = (loc, match.group("CONTENT"))
97 procs.append(proc) 98 procs.append(proc)
98 else: 99 else:
99 prog = match.group("PROG") or conf.DEFAULTS['prog'] 100 prog = match.group("PROG") or DEFAULTS['prog']
100 spin = (prog, match.group("ARGS")) 101 spin = (prog, match.group("ARGS"))
101 tasks.append(spin) 102 tasks.append(spin)
102 103
@@ -184,10 +185,10 @@ def verify_environment(exp_params):
184def run_parameter(exp_dir, out_dir, params, param_name): 185def run_parameter(exp_dir, out_dir, params, param_name):
185 '''Run an executable (arguments optional) specified as a configurable 186 '''Run an executable (arguments optional) specified as a configurable
186 @param_name in @params.''' 187 @param_name in @params.'''
187 if conf.PARAMS[param_name] not in params: 188 if PARAMS[param_name] not in params:
188 return 189 return
189 190
190 script_params = params[conf.PARAMS[param_name]] 191 script_params = params[PARAMS[param_name]]
191 192
192 # Split into arguments and program name 193 # Split into arguments and program name
193 if type(script_params) != type([]): 194 if type(script_params) != type([]):
@@ -210,22 +211,22 @@ def get_exp_params(cmd_scheduler, cmd_duration, file_params):
210 '''Return ExpParam with configured values of all hardcoded params.''' 211 '''Return ExpParam with configured values of all hardcoded params.'''
211 kernel = copts = "" 212 kernel = copts = ""
212 213
213 scheduler = cmd_scheduler or file_params[conf.PARAMS['sched']] 214 scheduler = cmd_scheduler or file_params[PARAMS['sched']]
214 duration = cmd_duration or file_params[conf.PARAMS['dur']] or\ 215 duration = cmd_duration or file_params[PARAMS['dur']] or\
215 conf.DEFAULTS['duration'] 216 DEFAULTS['duration']
216 217
217 # Experiments can specify required kernel name 218 # Experiments can specify required kernel name
218 if conf.PARAMS['kernel'] in file_params: 219 if PARAMS['kernel'] in file_params:
219 kernel = file_params[conf.PARAMS['kernel']] 220 kernel = file_params[PARAMS['kernel']]
220 221
221 # Or required config options 222 # Or required config options
222 if conf.PARAMS['copts'] in file_params: 223 if PARAMS['copts'] in file_params:
223 copts = file_params[conf.PARAMS['copts']] 224 copts = file_params[PARAMS['copts']]
224 225
225 # Or required tracers 226 # Or required tracers
226 requested = [] 227 requested = []
227 if conf.PARAMS['trace'] in file_params: 228 if PARAMS['trace'] in file_params:
228 requested = file_params[conf.PARAMS['trace']] 229 requested = file_params[PARAMS['trace']]
229 tracers = trace.get_tracer_types(requested) 230 tracers = trace.get_tracer_types(requested)
230 231
231 # But only these two are mandatory 232 # But only these two are mandatory
@@ -250,7 +251,7 @@ def load_experiment(sched_file, cmd_scheduler, cmd_duration,
250 251
251 # Load parameter file 252 # Load parameter file
252 param_file = param_file or \ 253 param_file = param_file or \
253 "%s/%s" % (dir_name, conf.DEFAULTS['params_file']) 254 "%s/%s" % (dir_name, DEFAULTS['params_file'])
254 if os.path.isfile(param_file): 255 if os.path.isfile(param_file):
255 file_params = com.load_params(param_file) 256 file_params = com.load_params(param_file)
256 else: 257 else:
@@ -277,19 +278,36 @@ def load_experiment(sched_file, cmd_scheduler, cmd_duration,
277 278
278 # Save parameters used to run experiment in out_dir 279 # Save parameters used to run experiment in out_dir
279 out_params = dict(file_params.items() + 280 out_params = dict(file_params.items() +
280 [(conf.PARAMS['sched'], exp_params.scheduler), 281 [(PARAMS['sched'], exp_params.scheduler),
281 (conf.PARAMS['tasks'], len(execs)), 282 (PARAMS['tasks'], len(execs)),
282 (conf.PARAMS['dur'], exp_params.duration)]) 283 (PARAMS['dur'], exp_params.duration)])
283 284
284 # Feather-trace clock frequency saved for accurate overhead parsing 285 # Feather-trace clock frequency saved for accurate overhead parsing
285 ft_freq = com.ft_freq() 286 ft_freq = com.ft_freq()
286 if ft_freq: 287 if ft_freq:
287 out_params[conf.PARAMS['cycles']] = ft_freq 288 out_params[PARAMS['cycles']] = ft_freq
288 289
289 with open("%s/%s" % (out_dir, conf.DEFAULTS['params_file']), 'w') as f: 290 with open("%s/%s" % (out_dir, DEFAULTS['params_file']), 'w') as f:
290 f.write(str(out_params)) 291 f.write(str(out_params))
291 292
292 293
294def get_exps(opts, args):
295 if args:
296 return args
297
298 # Default to sched_file > generated dirs
299 if os.path.exists(opts.sched_file):
300 sys.stderr.write("Reading schedule from %s.\n" % opts.sched_file)
301 return [opts.sched_file]
302 elif os.path.exists(DEFAULTS['out-gen']):
303 sys.stderr.write("Reading schedules from %s/*.\n" % DEFAULTS['out-gen'])
304 sched_dirs = os.listdir(DEFAULTS['out-gen'])
305 return ['%s/%s' % (DEFAULTS['out-gen'], d) for d in sched_dirs]
306 else:
307 sys.stderr.write("Run with -h to view options.\n");
308 sys.exit(1)
309
310
293def setup_jabber(target): 311def setup_jabber(target):
294 try: 312 try:
295 from run.jabber import Jabber 313 from run.jabber import Jabber
@@ -300,6 +318,7 @@ def setup_jabber(target):
300 "Disabling instant messages.\n") 318 "Disabling instant messages.\n")
301 return None 319 return None
302 320
321
303def setup_email(target): 322def setup_email(target):
304 try: 323 try:
305 from run.emailer import Emailer 324 from run.emailer import Emailer
@@ -313,6 +332,7 @@ def setup_email(target):
313 sys.stderr.write(message + " Disabling email message.\n") 332 sys.stderr.write(message + " Disabling email message.\n")
314 return None 333 return None
315 334
335
316def main(): 336def main():
317 opts, args = parse_args() 337 opts, args = parse_args()
318 338
@@ -321,7 +341,7 @@ def main():
321 param_file = opts.param_file 341 param_file = opts.param_file
322 out_base = os.path.abspath(opts.out_dir) 342 out_base = os.path.abspath(opts.out_dir)
323 343
324 args = args or [opts.sched_file] 344 exps = get_exps(opts, args)
325 345
326 created = False 346 created = False
327 if not os.path.exists(out_base): 347 if not os.path.exists(out_base):
@@ -335,9 +355,9 @@ def main():
335 invalid = 0 355 invalid = 0
336 356
337 jabber = setup_jabber(opts.jabber) if opts.jabber else None 357 jabber = setup_jabber(opts.jabber) if opts.jabber else None
338 email = setup_email(opts.email) if opts.email else None 358 email = setup_email(opts.email) if opts.email else None
339 359
340 for exp in args: 360 for exp in exps:
341 path = "%s/%s" % (os.getcwd(), exp) 361 path = "%s/%s" % (os.getcwd(), exp)
342 out_dir = "%s/%s" % (out_base, os.path.split(exp.strip('/'))[1]) 362 out_dir = "%s/%s" % (out_base, os.path.split(exp.strip('/'))[1])
343 363
@@ -374,6 +394,7 @@ def main():
374 394
375 ran += 1 395 ran += 1
376 396
397 # Clean out directory if it failed immediately
377 if not os.listdir(out_base) and created and not succ: 398 if not os.listdir(out_base) and created and not succ:
378 os.rmdir(out_base) 399 os.rmdir(out_base)
379 400
@@ -385,6 +406,10 @@ def main():
385 406
386 print(message) 407 print(message)
387 408
409 if succ:
410 sys.stderr.write("Successful experiment data saved in %s.\n" %
411 opts.out_dir)
412
388 if email: 413 if email:
389 email.send(message) 414 email.send(message)
390 email.close() 415 email.close()