aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2013-03-07 15:06:25 -0500
committerJonathan Herman <hermanjl@cs.unc.edu>2013-03-07 15:07:42 -0500
commitcef97086e881400270141cdf7b22ef68948b3597 (patch)
tree5ee50dc1a7761b667c54c7a997e49c18b1fe4101
parente3b7c78aa5b96af6bdbad20a13e0f540d1658b7f (diff)
Seperated BaseGenerator into EdfGenerator and its superclass Generator.
-rw-r--r--gen/edf_generators.py90
1 files changed, 90 insertions, 0 deletions
diff --git a/gen/edf_generators.py b/gen/edf_generators.py
new file mode 100644
index 0000000..6cca933
--- /dev/null
+++ b/gen/edf_generators.py
@@ -0,0 +1,90 @@
1import generator as gen
2import random
3import run.litmus_util as lu
4import schedcat.generator.tasks as tasks
5
6class EdfGenerator(gen.Generator):
7 '''Creates sporadic task sets with the most common Litmus options.'''
8 def __init__(self, name, templates, options, params):
9 super(EdfGenerator, self).__init__(name, templates,
10 self.__make_options(params) + options,
11 params)
12
13 def __make_options(self, params):
14 '''Return generic EDF options.'''
15 if 'cpus' in params:
16 cpus = min(map(int, params['cpus']))
17 else:
18 cpus = lu.num_cpus()
19
20 return [gen.GenOption('num_tasks', int, range(cpus, 5*cpus, cpus),
21 'Number of tasks per experiment.'),
22 gen.Generator._dist_option('utils', ['uni-medium'],
23 gen.NAMED_UTILIZATIONS,
24 'Task utilization distributions.'),
25 gen.Generator._dist_option('periods', ['harmonic'],
26 gen.NAMED_PERIODS,
27 'Task period distributions.')]
28
29 def _create_exp(self, exp_params):
30 '''Create a single experiment with @exp_params in @out_dir.'''
31 pdist = self._create_dist('period',
32 exp_params['periods'],
33 gen.NAMED_PERIODS)
34 udist = self._create_dist('utilization',
35 exp_params['utils'],
36 gen.NAMED_UTILIZATIONS)
37 tg = tasks.TaskGenerator(period=pdist, util=udist)
38
39 ts = []
40 tries = 0
41 while len(ts) != exp_params['num_tasks'] and tries < 5:
42 ts = tg.make_task_set(max_tasks = exp_params['num_tasks'])
43 tries += 1
44 if len(ts) != exp_params['num_tasks']:
45 print("Failed to create task set with parameters: %s" % exp_params)
46
47 self._customize(ts, exp_params)
48
49 exp_params['task_set'] = ts
50 self._write_schedule(exp_params)
51
52 del exp_params['task_set']
53 del exp_params['num_tasks']
54 self._write_params(exp_params)
55
56 def _customize(self, taskset, exp_params):
57 '''Configure a generated taskset with extra parameters.'''
58 pass
59
60
61class PartitionedGenerator(EdfGenerator):
62 def __init__(self, name, templates, options, params):
63 super(PartitionedGenerator, self).__init__(name,
64 templates + [gen.TP_PART_TASK], options, params)
65
66 def _customize(self, taskset, exp_params):
67 start = 1 if exp_params['release_master'] else 0
68 # Random partition for now: could do a smart partitioning
69 for t in taskset:
70 t.cpu = random.randint(start, exp_params['cpus'] - 1)
71
72class PedfGenerator(PartitionedGenerator):
73 def __init__(self, params={}):
74 super(PedfGenerator, self).__init__("PSN-EDF", [], [], params)
75
76class CedfGenerator(PartitionedGenerator):
77 TP_CLUSTER = "plugins/C-EDF/cluster{$level}"
78 CLUSTER_OPTION = gen.GenOption('level', ['L2', 'L3', 'All'], ['L2'],
79 'Cache clustering level.',)
80
81 def __init__(self, params={}):
82 super(CedfGenerator, self).__init__("C-EDF",
83 [CedfGenerator.TP_CLUSTER],
84 [CedfGenerator.CLUSTER_OPTION],
85 params)
86
87class GedfGenerator(EdfGenerator):
88 def __init__(self, params={}):
89 super(GedfGenerator, self).__init__("GSN-EDF", [gen.TP_GLOB_TASK],
90 [], params)