diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-04-25 16:43:49 -0400 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-04-25 16:43:49 -0400 |
commit | 15f231a79320cbc97cd88d8a4751515a47ce223e (patch) | |
tree | b86b202cadc816a5da7b96372b9de4362da88116 /gen | |
parent | 2ceaa6c607ef85bde4f14017634d9d1621efca29 (diff) |
Bug fixes from testing.
Diffstat (limited to 'gen')
-rw-r--r-- | gen/color.py | 10 | ||||
-rw-r--r-- | gen/mc_generators.py | 28 |
2 files changed, 27 insertions, 11 deletions
diff --git a/gen/color.py b/gen/color.py index 8184b8b..46ec8dc 100644 --- a/gen/color.py +++ b/gen/color.py | |||
@@ -29,19 +29,22 @@ class BlockColorScheme(ColorScheme): | |||
29 | if self.way_first: | 29 | if self.way_first: |
30 | # Way first means maximize ways | 30 | # Way first means maximize ways |
31 | pages_per_color = min(self.ways, pages_needed) | 31 | pages_per_color = min(self.ways, pages_needed) |
32 | colors_per_task = int(ceil(pages_needed/pages_per_color)) | 32 | colors_per_task = int(ceil(float(pages_needed)/pages_per_color)) |
33 | else: | 33 | else: |
34 | # Color first means maximize colors | 34 | # Color first means maximize colors |
35 | colors_per_task = min(self.colors, pages_needed) | 35 | colors_per_task = min(self.colors, pages_needed) |
36 | pages_per_color = int(ceil(pages_needed/colors_per_task)) | 36 | pages_per_color = int(ceil(float(pages_needed)/colors_per_task)) |
37 | 37 | ||
38 | curr_color = 0 | 38 | curr_color = 0 |
39 | for cpu, tasks in cpus.iteritems(): | 39 | for cpu, tasks in cpus.iteritems(): |
40 | # All tasks on a CPU have the same coloring scheme | 40 | # All tasks on a CPU have the same coloring scheme |
41 | cpu_colors = defaultdict(int) | 41 | cpu_colors = defaultdict(int) |
42 | for _ in xrange(colors_per_task): | 42 | for _ in xrange(colors_per_task): |
43 | curr_color = (curr_color + 1) % self.colors | ||
44 | cpu_colors[curr_color] = pages_per_color | 43 | cpu_colors[curr_color] = pages_per_color |
44 | curr_color = (curr_color + 1) % self.colors | ||
45 | |||
46 | if sum(cpu_colors.values()) < pages_needed: | ||
47 | raise Exception("Failed to block color cpu, %s" % cpu_colors) | ||
45 | 48 | ||
46 | for t in tasks: | 49 | for t in tasks: |
47 | t.colors = cpu_colors | 50 | t.colors = cpu_colors |
@@ -80,7 +83,6 @@ class EvilColorScheme(ColorScheme): | |||
80 | for t in tasks: | 83 | for t in tasks: |
81 | t.colors = colors | 84 | t.colors = colors |
82 | 85 | ||
83 | |||
84 | INFO_FIELDS = ['cache', 'line', 'page', 'ways', 'sets', 'colors'] | 86 | INFO_FIELDS = ['cache', 'line', 'page', 'ways', 'sets', 'colors'] |
85 | INFO_PROC = '/proc/sys/litmus/color/cache_info' | 87 | INFO_PROC = '/proc/sys/litmus/color/cache_info' |
86 | 88 | ||
diff --git a/gen/mc_generators.py b/gen/mc_generators.py index 8f5bd84..d8c172d 100644 --- a/gen/mc_generators.py +++ b/gen/mc_generators.py | |||
@@ -243,8 +243,9 @@ TP_TYPE = """#if $type != 'unmanaged' | |||
243 | /proc/sys/litmus/color/preempt_cache{0} | 243 | /proc/sys/litmus/color/preempt_cache{0} |
244 | #end if""" | 244 | #end if""" |
245 | 245 | ||
246 | # Always add some pages | 246 | # Now done by experiment.py |
247 | TP_ADD = """/proc/sys/litmus/color/add_pages{1}""" | 247 | # # Always add some pages |
248 | # TP_ADD = """/proc/sys/litmus/color/add_pages{1}""" | ||
248 | 249 | ||
249 | # Use special spin for color tasks | 250 | # Use special spin for color tasks |
250 | TP_COLOR_BASE = """colorspin -y $t.id -x $t.colorcsv -q $t.wss -l $t.loops """ | 251 | TP_COLOR_BASE = """colorspin -y $t.id -x $t.colorcsv -q $t.wss -l $t.loops """ |
@@ -253,8 +254,8 @@ TP_COLOR_B = TP_BASE.format("b", TP_COLOR_BASE + "-p $t.cpu ") | |||
253 | TP_COLOR_C = TP_BASE.format("c", TP_COLOR_BASE) | 254 | TP_COLOR_C = TP_BASE.format("c", TP_COLOR_BASE) |
254 | 255 | ||
255 | # Not even sure job splitting is still possible | 256 | # Not even sure job splitting is still possible |
256 | TP_CHUNK = """#if $chunk_size > 0 | 257 | TP_CHUNK = """#if $chunk_size_ns > 0 |
257 | /proc/sys/litmus/color/chunk_size{$chunk_size} | 258 | /proc/sys/litmus/color/chunk_size{$chunk_size_ns} |
258 | #end if""" | 259 | #end if""" |
259 | 260 | ||
260 | COLOR_TYPES = ['scheduling', 'locking', 'unmanaged'] | 261 | COLOR_TYPES = ['scheduling', 'locking', 'unmanaged'] |
@@ -264,7 +265,7 @@ class ColorMcGenerator(McGenerator): | |||
264 | 265 | ||
265 | def __init__(self, params = {}): | 266 | def __init__(self, params = {}): |
266 | super(ColorMcGenerator, self).__init__("MC", | 267 | super(ColorMcGenerator, self).__init__("MC", |
267 | templates=[TP_ADD, TP_TYPE, TP_CHUNK, TP_COLOR_B, TP_COLOR_C], | 268 | templates=[TP_TYPE, TP_CHUNK, TP_COLOR_B, TP_COLOR_C], |
268 | options=self.__make_options(), | 269 | options=self.__make_options(), |
269 | params=self.__extend_params(params)) | 270 | params=self.__extend_params(params)) |
270 | 271 | ||
@@ -336,7 +337,7 @@ class ColorMcGenerator(McGenerator): | |||
336 | 'System colors (cache size / ways).'), | 337 | 'System colors (cache size / ways).'), |
337 | GenOption('page_size', int, self.cache.page, | 338 | GenOption('page_size', int, self.cache.page, |
338 | 'System page size.'), | 339 | 'System page size.'), |
339 | GenOption('wss', [float, int], .5, | 340 | GenOption('wss', [float, int], .25, |
340 | 'Task working set sizes. Can be expressed as a fraction ' + | 341 | 'Task working set sizes. Can be expressed as a fraction ' + |
341 | 'of the cache.')] | 342 | 'of the cache.')] |
342 | 343 | ||
@@ -359,7 +360,8 @@ class ColorMcGenerator(McGenerator): | |||
359 | if pages > cache_pages: | 360 | if pages > cache_pages: |
360 | raise Exception('WSS (%d) larger than the cache!' % (wss)) | 361 | raise Exception('WSS (%d) larger than the cache!' % (wss)) |
361 | 362 | ||
362 | return pages | 363 | # Divide in half for HRT, SRT divide |
364 | return pages / 2 | ||
363 | 365 | ||
364 | 366 | ||
365 | def __make_csv(self, task): | 367 | def __make_csv(self, task): |
@@ -410,11 +412,23 @@ class ColorMcGenerator(McGenerator): | |||
410 | hrt_colorer = EvilColorScheme(c, w) | 412 | hrt_colorer = EvilColorScheme(c, w) |
411 | srt_colorer = hrt_colorer | 413 | srt_colorer = hrt_colorer |
412 | else: | 414 | else: |
415 | # Divide cache between hrt and srt | ||
416 | c /= 2 | ||
413 | srt_colorer = RandomColorScheme(c, w) | 417 | srt_colorer = RandomColorScheme(c, w) |
414 | hrt_colorer = BlockColorScheme(c, w, way_first=True) | 418 | hrt_colorer = BlockColorScheme(c, w, way_first=True) |
415 | 419 | ||
416 | hrt_colorer.color(task_system['lvlb'], pages_needed) | 420 | hrt_colorer.color(task_system['lvlb'], pages_needed) |
417 | srt_colorer.color(task_system['lvlc'], pages_needed) | 421 | srt_colorer.color(task_system['lvlc'], pages_needed) |
418 | 422 | ||
423 | # This check has saved me a lot of trouble already, leave it in | ||
424 | for t in task_system['lvlb'] + task_system['lvlc']: | ||
425 | if sum(t.colors.values()) * params['page_size'] < real_wss: | ||
426 | raise Exception("Didn't color enough pages for %s" % params) | ||
427 | |||
428 | if params['type'] != 'unmanaged': | ||
429 | # Bump srt into the second half of the cache | ||
430 | for t in task_system['lvlc']: | ||
431 | t.colors = {colors+c:w for colors, w in t.colors.iteritems()} | ||
432 | |||
419 | for t in all_tasks: | 433 | for t in all_tasks: |
420 | self.__make_csv(t) | 434 | self.__make_csv(t) |