aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2014-01-15 18:57:15 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2014-01-15 18:57:15 -0500
commit00ec439b11df7a38658ca0d6d52d18a0fab549d9 (patch)
tree15a33e41a582fc8cf0d307ca87de76c7dbab2cb9
parentc5fe932621cf82aaea03bc4d1c60378c66f5e52c (diff)
Retry-loop for task set generation
Task set generation put in a retry loop. if a task set fails to be partitionable under any partition scheme, the entire task set is retried.
-rw-r--r--gen/generator.py110
1 files changed, 67 insertions, 43 deletions
diff --git a/gen/generator.py b/gen/generator.py
index 2d0fbef..fcb21eb 100644
--- a/gen/generator.py
+++ b/gen/generator.py
@@ -137,6 +137,8 @@ class Generator(object):
137 # make pgmrt arguments using graphs and tasks. 137 # make pgmrt arguments using graphs and tasks.
138 sched_file = self.out_dir + "/" + FILES['sched_file'] 138 sched_file = self.out_dir + "/" + FILES['sched_file']
139 139
140 # task set is in microseconds. we must convert to milliseconds
141
140 graph_desc_arg = [] 142 graph_desc_arg = []
141 rates_arg = [] 143 rates_arg = []
142 exec_arg = [] 144 exec_arg = []
@@ -153,12 +155,17 @@ class Generator(object):
153 split_arg_t = [] 155 split_arg_t = []
154 156
155 for n in g.nodes: 157 for n in g.nodes:
158 # task set is in microseconds. we must convert to milliseconds
159
156 cluster_arg_t.append('node_' + str(n.id) + ':' + str(n.task.partition)) 160 cluster_arg_t.append('node_' + str(n.id) + ':' + str(n.task.partition))
157 exec_arg_t.append('node_' + str(n.id) + ':' + str(n.task.cost)) 161 cost_str = format(n.task.cost/1000.0, '.4f').rstrip('0').rstrip('.')
158 split_arg_t.append('node_' + str(n.id) + ':' + str(n.task.split)) 162 exec_arg_t.append('node_' + str(n.id) + ':' + cost_str)
163 if n.task.split != 1:
164 split_arg_t.append('node_' + str(n.id) + ':' + str(n.task.split))
159 if n.isSrc == True: 165 if n.isSrc == True:
160 # assume that x=1 166 # assume that x=1
161 rates_arg_t.append('node_' + str(n.id) + ':1:' + str(n.task.period)) 167 period_str = format(n.task.period/1000.0, '.4f').rstrip('0').rstrip('.')
168 rates_arg_t.append('node_' + str(n.id) + ':1:' + period_str)
162 # get cluster size 169 # get cluster size
163 clustersz_arg_t = str(pgm_params['cpus'] / pgm_params['nr_clusters']) 170 clustersz_arg_t = str(pgm_params['cpus'] / pgm_params['nr_clusters'])
164 if len(g.nodes) == 1: 171 if len(g.nodes) == 1:
@@ -167,7 +174,8 @@ class Generator(object):
167 graph_desc_arg_t.append('node_' + str(n.id) + ':node_' + str(succ.id)) 174 graph_desc_arg_t.append('node_' + str(n.id) + ':node_' + str(succ.id))
168 # wss parameter 175 # wss parameter
169 for e in n.outEdges: 176 for e in n.outEdges:
170 wss_arg_t.append('node_' + str(n.id) + ':node_' + str(e.s.id) + ':' + str(e.wss)) 177 wss_kb_str = format(e.wss, '.4f').rstrip('0').rstrip('.')
178 wss_arg_t.append('node_' + str(n.id) + ':node_' + str(e.s.id) + ':' + wss_kb_str)
171 179
172 # combine arguments to a comma-separated string 180 # combine arguments to a comma-separated string
173 cluster_arg_t = ','.join(cluster_arg_t) 181 cluster_arg_t = ','.join(cluster_arg_t)
@@ -192,7 +200,8 @@ class Generator(object):
192 pgm_args_t = ''; 200 pgm_args_t = '';
193 pgm_args_t += '--wait --cluster ' + cluster_arg[i] + ' --clusterSize ' + clustersz_arg[i] + ' --name graph_' + str(i) 201 pgm_args_t += '--wait --cluster ' + cluster_arg[i] + ' --clusterSize ' + clustersz_arg[i] + ' --name graph_' + str(i)
194 pgm_args_t += ' --graph ' + graph_desc_arg[i] + ' --rates ' + rates_arg[i] + ' --execution ' + exec_arg[i] 202 pgm_args_t += ' --graph ' + graph_desc_arg[i] + ' --rates ' + rates_arg[i] + ' --execution ' + exec_arg[i]
195 pgm_args_t += ' --split ' + split_arg[i] 203 if len(split_arg[i]) != 0:
204 pgm_args_t += ' --split ' + split_arg[i]
196 if len(wss_arg[i]) != 0: 205 if len(wss_arg[i]) != 0:
197 pgm_args_t += ' --wss ' + wss_arg[i] 206 pgm_args_t += ' --wss ' + wss_arg[i]
198 207
@@ -366,44 +375,59 @@ class Generator(object):
366 dp.nr_sink = graph.uniform(opts.nr_sink, opts.nr_sink) 375 dp.nr_sink = graph.uniform(opts.nr_sink, opts.nr_sink)
367 dp.wss = NAMED_EDGE_WSS[dp.wss] 376 dp.wss = NAMED_EDGE_WSS[dp.wss]
368 377
369 # Generate a task set 378 last_failed = ''
370 ts, graphs, subts = self._create_tasks(dp) 379 tries = 0
371 dp.tasks = len(ts) 380 success = False
372 381 while tries < 100 and not success:
373 #for dp in PgmDesignPointGenerator(exp): 382 created_dirs = []
374 for pm in partition_method: 383 tries += 1
375 dp.partitions = pm 384
376 # Create directory name from relevant parameters 385 # Generate a task set
377 dir_leaf = "sched=%s_%s" % (self.scheduler, col_map.encode(dp)) 386 ts, graphs, subts = self._create_tasks(dp)
378 dir_leaf = dir_leaf.strip('_') # If there are none 387 dp.tasks = len(ts)
379 dir_leaf += ("_trial=%s" % trial) if trials > 1 else "" 388
380 389 try:
381 dir_path = "%s/%s" % (out_dir, dir_leaf.strip('_')) 390 for pm in partition_method:
382 391 dp.partitions = pm
383 if os.path.exists(dir_path): 392 # Create directory name from relevant parameters
384 if force: 393 dir_leaf = "sched=%s_%s" % (self.scheduler, col_map.encode(dp))
385 sh.rmtree(dir_path) 394 dir_leaf = dir_leaf.strip('_') # If there are none
386 else: 395 dir_leaf += ("_trial=%s" % trial) if trials > 1 else ""
387 print("Skipping existing experiment: '%s'" % dir_path) 396
388 continue 397 dir_path = "%s/%s" % (out_dir, dir_leaf.strip('_'))
389 398
390 os.mkdir(dir_path) 399 if os.path.exists(dir_path):
391 400 if force:
392 if trials > 1: 401 sh.rmtree(dir_path)
393 dp[PARAMS['trial']] = trial 402 else:
394 self.out_dir = dir_path 403 print("Skipping existing experiment: '%s'" % dir_path)
395 404 continue
396 dp.system = topology.Topology(machines[dp.host]) 405
397 406 os.mkdir(dir_path)
398 # Write a sched.py and param.py for each partition method 407 created_dirs.append(dir_path)
399 ret = self._create_exp(dp, ts, graphs, subts) 408
400 if not ret: 409 if trials > 1:
401 print("Bin-packing fails for " + dir_leaf) 410 dp[PARAMS['trial']] = trial
402 os.rmdir(dir_path) 411 self.out_dir = dir_path
403 412
404 del(self.out_dir) 413 dp.system = topology.Topology(machines[dp.host])
405 if PARAMS['trial'] in dp: 414
406 del dp[PARAMS['trial']] 415 # Write a sched.py and param.py for each partition method
416 ret = self._create_exp(dp, ts, graphs, subts)
417 if not ret:
418 print("Bin-packing fails for " + dir_leaf)
419 last_failed = dir_leaf
420 raise Exception("Failed to partition.")
421 del(self.out_dir)
422 if PARAMS['trial'] in dp:
423 del dp[PARAMS['trial']]
424 success = True
425 except Exception, e:
426 for d in created_dirs:
427 sh.rmtree(d)
428 if not success:
429 print("Failed to generate experiments. Last failed: %s" % last_failed)
430
407 431
408 def print_help(self): 432 def print_help(self):
409 display_options = [o for o in self.options if not o.hidden] 433 display_options = [o for o in self.options if not o.hidden]