source: trunk/lib_ir/AgnerTestP/PMCTest/gen.py @ 4232

Last change on this file since 4232 was 4232, checked in by linmengl, 5 years ago

micro benchmark with Agner's testp ready

File size: 5.8 KB
Line 
1from jinja2 import Template, Environment, FileSystemLoader
2import subprocess
3import argparse
4import sys
5
6Template    = "PMCTestB.pytemplate.cpp"
7Output      = "PMCTestB.cpp"
8
9FunctionListI1 = ["add", "sub", "mult", "eq", "lt", "gt", "ult", "ugt"]
10FunctionListI2 = ["add", "sub", "mult", "eq", "lt", "gt", "ult", "ugt", "vsll", "vsrl", "vsra"]
11FunctionListI4 = ["add", "sub", "mult", "eq", "lt", "gt", "ult", "ugt", "vsll", "vsrl", "vsra"]
12FunctionListI8 = ["add", "sub", "mult", "eq", "lt", "gt", "ult", "ugt", "vsll", "vsrl", "vsra"]
13
14FW = 2
15
16def C(name):
17    return "{name}_{fw}".format(name=name, fw=FW)
18
19def CXX(name):
20    if name in ["vsll", "vsrl", "vsra"]:
21        return "simd<{fw}>::{name}i".format(fw=FW, name=name[1:])
22    return "simd<{fw}>::{name}".format(fw=FW, name=name)
23
24#configuring Jinja2
25env = Environment(loader=FileSystemLoader(['.']),
26                  trim_blocks=True,
27                  lstrip_blocks=True)
28
29def fillTemplate(template, output, params):
30    content = env.get_template(template).render(params)
31    with open(output, 'w') as f:
32        f.write(content)
33
34def genFile(params_dict):
35    fillTemplate(template=Template, output=Output,
36                 params=params_dict)
37
38header = "Scale, Core, Core cyc, Instruct, Uops, L1D Miss"
39
40def extract(func):
41    if subprocess.call("llvm-extract-3.5 -func {0} -S llc_func.ll > single_llc_func.ll".format(func),
42            shell=True) != 0:
43        raise Exception("Extract IR func failed.")
44
45def run(single=False):
46    if single:
47        if subprocess.call("timeout 30s make single", shell=True) != 0:
48            raise Exception("Make failed.")
49    else:
50        if subprocess.call("make", shell=True) != 0:
51            raise Exception("Make failed.")
52    output = subprocess.check_output("./PMCTest")
53    output = output.splitlines()
54    return output[6].split()
55
56if __name__ == '__main__':
57    parser = argparse.ArgumentParser()
58    parser.add_argument("-i", "--instrcount", action="store_true",
59                    help="Calc same operation with increasing instr count.")
60    parser.add_argument("-f", "--iterfunc", action="store_true",
61                    help="Calc with different function")
62    parser.add_argument("-m", "--master-iterfunc", action="store_true",
63                    help="Calc with different function, with LLVM 3.5")
64    parser.add_argument("-c", "--count", type=int,
65                    help="Give instruction count")
66    parser.add_argument("-e", "--func",
67                    help="Specify one function to generate")
68    parser.add_argument("-w", "--fw", type=int,
69                    help="Field width used with --func and --iterfunc")
70    parser.add_argument("-a", "--idisa", action="store_true",
71                    help="Call IDISA function (default)")
72    parser.add_argument("-b", "--ir", action="store_true",
73                    help="Call IR function")
74    parser.add_argument("-n", "--noloop", action="store_true",
75                    help="Do not use loop in perf program")
76    parser.add_argument("-s", "--simple", action="store_true",
77                    help="Simple run with add_1 for testing")
78    parser.add_argument("-o", "--output",
79                    help="Output perf file")
80    args = parser.parse_args()
81
82    params = dict(DeclaredIRFunc = "add_1",
83                  DataSize = 2000,
84                  UserDataInit = "simd<32>::constant<0>()",
85                  TestInstrCount = 1000,
86                  TestInstr = "add_1(UserData[thread][i], one_constant)",
87                  NoLoop = False
88                  )
89    if args.ir and args.idisa:
90        raise Exception("Cannot select both IR and IDISA")
91    if args.noloop:
92        params["NoLoop"] = True
93    if args.count:
94        params["TestInstrCount"] = args.count
95    if args.master_iterfunc and args.idisa:
96        raise Exception("Cannot select IDISA with --master-iterfunc")
97
98    perf_output = "perf_chat.csv"
99    if args.output:
100        perf_output = args.output
101
102    EXEC = CXX
103    if args.ir:
104        EXEC = C
105
106    if args.simple:
107        params["TestInstrCount"] = args.count
108        genFile(params)
109        print header
110        print run()
111        sys.exit(0)
112
113    if args.func:
114        if args.fw:
115            FW = args.fw
116
117        name = args.func
118        params["DeclaredIRFunc"] = C(name)
119        params["TestInstr"] = EXEC(name) + "(UserData[thread][i], one_constant)"
120        genFile(params)
121        print run()
122        sys.exit(0)
123
124    if args.instrcount:
125        with open(perf_output, "w") as f:
126            f.write(header + "\n")
127
128        for count in xrange(100, 2000, 100):
129            params["TestInstrCount"] = count
130
131            genFile(params)
132
133            with open(perf_output, "a") as f:
134                f.write(str(count) + "," + ",".join(run()) + "\n")
135        sys.exit(0)
136
137    if args.iterfunc:
138        with open(perf_output, "w") as f:
139            f.write(header + "\n")
140        if args.fw:
141            FW = args.fw
142        for name in FunctionListI1:
143            params["DeclaredIRFunc"] = C(name)
144            params["TestInstr"] = EXEC(name) + "(UserData[thread][i], one_constant)"
145
146            genFile(params)
147            with open(perf_output, "a") as f:
148                f.write(name + "," + ",".join(run()) + "\n")
149        sys.exit(0)
150
151    if args.master_iterfunc:
152        with open(perf_output, "w") as f:
153            f.write(header + "\n")
154        if args.fw:
155            FW = args.fw
156        for name in FunctionListI1:
157            params["DeclaredIRFunc"] = C(name)
158            params["TestInstr"] = C(name) + "(UserData[thread][i], one_constant)"
159
160            genFile(params)
161            try:
162                extract(C(name))
163                with open(perf_output, "a") as f:
164                    f.write(name + "," + ",".join(run(single=True)) + "\n")
165            except Exception as e:
166                with open(perf_output, "a") as f:
167                    f.write(name + ", " + str(e) + "\n")
168        sys.exit(0)
169
Note: See TracBrowser for help on using the repository browser.