def gen_bench(f, simd, typ): ## TODO path = gen_filename(f, simd, typ) ## Check if we need to create the file if not common.can_create_filename(_opts, path): return ## Generate specific code for the bench category = common.nsimd_category(simd) code = gen_code(f, simd, typ, category=category) if code is None: return ## Now aggregate every parts bench = '' #bench += gen_bench_asm_function(f, typ, category) bench += gen_bench_against(f, simd, typ, f.bench_against_cpu()) bench += code bench += gen_bench_unrolls(f, simd, typ, category) bench += gen_bench_against(f, simd, typ, f.bench_against_libs()) ## Finalize code code = gen_bench_from_code(f, typ, bench) ## Write file with common.open_utf8(path) as f: f.write(code) ## Clang-format it! common.clang_format(_opts, path)
def bench_against_cpu(self): bench = self.bench_against_init() ## Enable bench against nsimd (cpu architecture) if self.bench_auto_against_cpu: bench['*']['*'][common.nsimd_category('cpu')] = \ cpu_fun_from_sig(sig_translate(self.signature, { 's': 'volatile-s', 'v': 'vcpu', 'l': 'lcpu', })) return bench
def gen_bench(f, simd, typ): ## TODO path = gen_filename(f, simd, typ) ## Check if we need to create the file if not common.can_create_filename(_opts, path): return ## Generate specific code for the bench category = common.nsimd_category(simd) code = gen_code(f, simd, typ, category=category) if code is None: return ## Now aggregate every parts bench = '' #bench += gen_bench_asm_function(f, typ, category) bench += gen_bench_against(f, 'cpu', typ, f.bench_against_cpu()) bench += code bench += gen_bench_unrolls(f, simd, typ, category) bench += gen_bench_against(f, simd, typ, f.bench_against_libs()) ## bench_with_timestamp bench_with_timestamp = '' bench_with_timestamp += 'std::map<std::string, std::pair<' + typ + ', double>> sums;' + '\n' bench_with_timestamp += 'size_t const nb_runs = 10 * 1000;' + '\n' bench_with_timestamp += gen_bench_against_with_timestamp( f, 'cpu', typ, f.bench_against_cpu()) bench_with_timestamp += gen_bench_with_timestamp(f, simd, typ, category) bench_with_timestamp += gen_bench_unrolls_with_timestamp( f, simd, typ, category) bench_with_timestamp += gen_bench_against_with_timestamp( f, simd, typ, f.bench_against_libs()) bench_with_timestamp += ''' std::string json = ""; json += "{{\\n"; json += " \\"benchmarks\\": [\\n"; for (auto const & bench_name_sum_time : sums) {{ std::string const & bench_name = bench_name_sum_time.first; {typ} const & sum = bench_name_sum_time.second.first; double const & elapsed_time_ns = bench_name_sum_time.second.second; json += " {{" "\\n"; json += " \\"name\\": \\"" + bench_name + "/{typ}\\"," + "\\n"; json += " \\"real_time\\": " + std::to_string(elapsed_time_ns) + "," + "\\n"; json += " \\"sum\\": " + std::string(std::isfinite(sum) ? "" : "\\"") + std::to_string(sum) + std::string(std::isfinite(sum) ? "" : "\\"") + "," + "\\n"; json += " \\"time_unit\\": \\"ns\\"\\n"; json += " }}"; if (&bench_name_sum_time != &*sums.rbegin()) {{ json += ","; }} json += "\\n"; }} json += " ]\\n"; json += "}}\\n"; std::cout << json << std::flush; '''.format(typ=typ) ## Finalize code code = gen_bench_from_code(f, typ, bench, '') # bench_with_timestamp ## Write file with common.open_utf8(path) as f: f.write(code) ## Clang-format it! common.clang_format(_opts, path)