1import tests, debug
2from common import TestCommon
3from results import PassFailResult, RowResults
4import sys, re, numpy, os, datetime
5
6
7class AppelLiBench(TestCommon):
8    '''Benchmark GC primitives with Appel Li benchmark'''
9
10    bench_core = 4
11
12    def setup(self, build, machine, testdir):
13        # gracefully handle machines with < 5 cores
14        if machine.get_ncores() < self.bench_core:
15            self.bench_core = machine.get_ncores() - 1
16
17    def get_finish_string(self):
18        return "appel_li: done"
19
20    def process_data(self, testdir, rawiter):
21        debug.verbose(">> processing data")
22        # the test passed if we can produce results
23        results = RowResults(['op', 'cycles/iter', '#iters'])
24        # and assertions are disabled
25        valid = False
26        for line in rawiter:
27            if line.startswith('Operating system bug'):
28                valid = False
29                break
30            if 'ASSERTIONS DISABLED' in line:
31                valid = True
32            #if line.startswith(self.get_finish_string()):
33            #    break
34            if line.startswith("appel_li:"):
35                # found data line: <op cycles/iter #iters>
36                elems = line.strip().split(':')
37                if len(elems) < 3:
38                    continue
39                _, op, data = elems
40                if ' ' not in data:
41                    continue
42                cyc, _, count, _ = data.strip().split(' ')
43                results.add_row([op.strip(), cyc, count])
44        if not valid:
45            return PassFailResult(False)
46        return results
47
48@tests.add_test
49class AppelLiDefault(AppelLiBench):
50    name = "appel_li_bench_default"
51
52    def get_modules(self, build, machine):
53        modules = super(AppelLiDefault, self).get_modules(build, machine)
54        modules.add_module("benchmarks/mem_appel", ["core=%d" % self.bench_core])
55        return modules
56
57@tests.add_test
58class AppelLiDefaultDI(AppelLiBench):
59    name = "appel_li_bench_default_di"
60
61    def get_modules(self, build, machine):
62        modules = super(AppelLiDefaultDI, self).get_modules(build, machine)
63        modules.add_module("benchmarks/mem_appel_di", [["core=%d" % self.bench_core]])
64        return modules
65
66@tests.add_test
67class AppelLiFull(AppelLiBench):
68    name = "appel_li_bench_full"
69
70    def get_modules(self, build, machine):
71        modules = super(AppelLiFull, self).get_modules(build, machine)
72        modules.add_module("benchmarks/mem_appel_ff", ["core=%d" % self.bench_core])
73        return modules
74
75@tests.add_test
76class AppelLiFullDI(AppelLiBench):
77    name = "appel_li_bench_full_di"
78
79    def get_modules(self, build, machine):
80        modules = super(AppelLiFullDI, self).get_modules(build, machine)
81        modules.add_module("benchmarks/mem_appel_di_ff", ["core=%d" % self.bench_core])
82        return modules
83
84@tests.add_test
85class AppelLiSelective(AppelLiBench):
86    name = "appel_li_bench_selective"
87
88    def get_modules(self, build, machine):
89        modules = super(AppelLiSelective, self).get_modules(build, machine)
90        modules.add_module("benchmarks/mem_appel_sf", ["core=%d" % self.bench_core])
91        return modules
92
93@tests.add_test
94class AppelLiSelectiveDI(AppelLiBench):
95    name = "appel_li_bench_selective_di"
96
97    def get_modules(self, build, machine):
98        modules = super(AppelLiSelectiveDI, self).get_modules(build, machine)
99        modules.add_module("benchmarks/mem_appel_di_sf", ["core=%d" % self.bench_core])
100        return modules
101
102@tests.add_test
103class AppelLiSelectiveHint(AppelLiBench):
104    name = "appel_li_bench_selective_hint"
105
106    def get_modules(self, build, machine):
107        modules = super(AppelLiSelectiveHint, self).get_modules(build, machine)
108        modules.add_module("benchmarks/mem_appel_sfh", ["core=%d" % self.bench_core])
109        return modules
110
111@tests.add_test
112class AppelLiSelectiveHintDI(AppelLiBench):
113    name = "appel_li_bench_selective_hint_di"
114
115    def get_modules(self, build, machine):
116        modules = super(AppelLiSelectiveHintDI, self).get_modules(build, machine)
117        modules.add_module("benchmarks/mem_appel_di_sfh", ["core=%d" % self.bench_core])
118        return modules
119