diff options
Diffstat (limited to 'gen')
| -rw-r--r-- | gen/__init__.py | 7 | ||||
| -rw-r--r-- | gen/edf_generators.py | 33 | ||||
| -rw-r--r-- | gen/generator.py | 9 |
3 files changed, 41 insertions, 8 deletions
diff --git a/gen/__init__.py b/gen/__init__.py index 8c60b46..07bbc91 100644 --- a/gen/__init__.py +++ b/gen/__init__.py | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | import generator as gen | 1 | import generator as gen |
| 2 | import edf_generators as edf | 2 | import edf_generators as edf |
| 3 | 3 | ||
| 4 | gen.register_generator("G-EDF", edf.GedfGenerator) | 4 | #gen.register_generator("G-EDF", edf.GedfGenerator) |
| 5 | gen.register_generator("P-EDF", edf.PedfGenerator) | 5 | #gen.register_generator("P-EDF", edf.PedfGenerator) |
| 6 | gen.register_generator("C-EDF", edf.CedfGenerator) | 6 | gen.register_generator("MC2", edf.Mc2Generator) |
| 7 | #gen.register_generator("C-EDF", edf.CedfGenerator) | ||
diff --git a/gen/edf_generators.py b/gen/edf_generators.py index 8e4b8df..c769e46 100644 --- a/gen/edf_generators.py +++ b/gen/edf_generators.py | |||
| @@ -6,6 +6,7 @@ TP_TBASE = """#for $t in $task_set | |||
| 6 | #end for""" | 6 | #end for""" |
| 7 | TP_GLOB_TASK = TP_TBASE.format("") | 7 | TP_GLOB_TASK = TP_TBASE.format("") |
| 8 | TP_PART_TASK = TP_TBASE.format("-p $t.cpu") | 8 | TP_PART_TASK = TP_TBASE.format("-p $t.cpu") |
| 9 | TP_MC_TASK = TP_TBASE.format("-p $t.cpu -m $t.crit -i $t.id") | ||
| 9 | 10 | ||
| 10 | class EdfGenerator(gen.Generator): | 11 | class EdfGenerator(gen.Generator): |
| 11 | '''Creates sporadic task sets with the most common Litmus options.''' | 12 | '''Creates sporadic task sets with the most common Litmus options.''' |
| @@ -16,7 +17,7 @@ class EdfGenerator(gen.Generator): | |||
| 16 | 17 | ||
| 17 | def __make_options(self): | 18 | def __make_options(self): |
| 18 | '''Return generic EDF options.''' | 19 | '''Return generic EDF options.''' |
| 19 | return [gen.Generator._dist_option('utils', 'uni-medium', | 20 | return [gen.Generator._dist_option('utils', 'uni-very-light', |
| 20 | gen.NAMED_UTILIZATIONS, | 21 | gen.NAMED_UTILIZATIONS, |
| 21 | 'Task utilization distributions.'), | 22 | 'Task utilization distributions.'), |
| 22 | gen.Generator._dist_option('periods', 'harmonic', | 23 | gen.Generator._dist_option('periods', 'harmonic', |
| @@ -87,3 +88,33 @@ class GedfGenerator(EdfGenerator): | |||
| 87 | def __init__(self, params={}): | 88 | def __init__(self, params={}): |
| 88 | super(GedfGenerator, self).__init__("GSN-EDF", [TP_GLOB_TASK], | 89 | super(GedfGenerator, self).__init__("GSN-EDF", [TP_GLOB_TASK], |
| 89 | [], params) | 90 | [], params) |
| 91 | |||
| 92 | class Mc2Generator(EdfGenerator): | ||
| 93 | def __init__(self, params={}): | ||
| 94 | super(Mc2Generator, self).__init__("MC2", [TP_MC_TASK], | ||
| 95 | [], params) | ||
| 96 | |||
| 97 | def _customize(self, taskset, exp_params): | ||
| 98 | cpus = exp_params['cpus'] | ||
| 99 | start = 0 | ||
| 100 | |||
| 101 | # Partition using worst-fit for most even distribution | ||
| 102 | utils = [0]*cpus | ||
| 103 | tasks = [0]*cpus | ||
| 104 | index = [1]*cpus | ||
| 105 | taskset = sorted(taskset, key=lambda task: task.period) | ||
| 106 | for t in taskset: | ||
| 107 | t.cpu = utils.index(min(utils)) | ||
| 108 | t.id = index[t.cpu] | ||
| 109 | if utils[t.cpu] < 0.05: | ||
| 110 | t.crit = 0 | ||
| 111 | elif utils[t.cpu] < 0.10: | ||
| 112 | t.crit = 1 | ||
| 113 | else: | ||
| 114 | t.crit = 2 | ||
| 115 | utils[t.cpu] += t.utilization() | ||
| 116 | tasks[t.cpu] += 1 | ||
| 117 | index[t.cpu] += 1 | ||
| 118 | |||
| 119 | # Increment by one so release master has no tasks | ||
| 120 | t.cpu += start | ||
diff --git a/gen/generator.py b/gen/generator.py index 0999e84..909c730 100644 --- a/gen/generator.py +++ b/gen/generator.py | |||
| @@ -75,13 +75,14 @@ class Generator(object): | |||
| 75 | release_master = list(set([False, bool(rm_config)])) | 75 | release_master = list(set([False, bool(rm_config)])) |
| 76 | 76 | ||
| 77 | 77 | ||
| 78 | return [GenOption('tasks', int, range(cpus, 5*cpus, cpus), | 78 | return [GenOption('tasks', int, range(cpus, 10*cpus, cpus), |
| 79 | 'Number of tasks per experiment.'), | 79 | 'Number of tasks per experiment.'), |
| 80 | GenOption('cpus', int, [cpus], | 80 | GenOption('cpus', int, [cpus], |
| 81 | 'Number of processors on target system.'), | 81 | 'Number of processors on target system.'), |
| 82 | GenOption('release_master', [True,False], release_master, | 82 | GenOption('release_master', [True,False], release_master, |
| 83 | 'Redirect release interrupts to a single CPU.'), | 83 | 'Redirect release interrupts to a single CPU.'), |
| 84 | GenOption('duration', float, [30], 'Experiment duration.')] | 84 | #GenOption('post', str, ['refill.sh'], 'Post script.'), |
| 85 | GenOption('duration', float, [10], 'Experiment duration.')] | ||
| 85 | 86 | ||
| 86 | @staticmethod | 87 | @staticmethod |
| 87 | def _dist_option(name, default, distribution, help): | 88 | def _dist_option(name, default, distribution, help): |
| @@ -113,9 +114,9 @@ class Generator(object): | |||
| 113 | print(("Only created task set of size %d < %d for params %s. " + | 114 | print(("Only created task set of size %d < %d for params %s. " + |
| 114 | "Switching to light utilization.") % | 115 | "Switching to light utilization.") % |
| 115 | (len(ts), params['tasks'], params)) | 116 | (len(ts), params['tasks'], params)) |
| 116 | print("Switching to light util. This usually means the " + | 117 | print("Switching to very-light util. This usually means the " + |
| 117 | "utilization distribution is too agressive.") | 118 | "utilization distribution is too agressive.") |
| 118 | return self._create_taskset(params, periods, NAMED_UTILIZATIONS['uni-light'], | 119 | return self._create_taskset(params, periods, NAMED_UTILIZATIONS['uni-very-light'], |
| 119 | max_util) | 120 | max_util) |
| 120 | return ts | 121 | return ts |
| 121 | 122 | ||
