import logging
from plumbum import local
from benchbuild import project
from benchbuild.settings import CFG
from benchbuild.utils import compiler, download, run, wrapping
from benchbuild.utils.cmd import diff, tar
LOG = logging.getLogger(__name__)
CFG['projects'] = {
"polybench": {
"verify": {
"default": True,
"desc": "Verify results with POLYBENCH_DUMP_ARRAYS."
},
"workload": {
"default": "EXTRALARGE_DATASET",
"desc": "Control the dataset variable for polybench."
}
}
}
[docs]def get_dump_arrays_output(data):
start_tag = "==BEGIN"
end_tag = "==END"
found_start = False
found_end = False
out = []
for line in data:
if start_tag in line:
found_start = True
if end_tag in line:
found_end = True
if found_start and not found_end:
out.append(line)
return out
[docs]@download.with_wget({
"4.2":
"http://downloads.sourceforge.net/project/polybench/polybench-c-4.2.tar.gz"
})
class PolyBenchGroup(project.Project):
DOMAIN = 'polybench'
GROUP = 'polybench'
VERSION = '4.2'
path_dict = {
"correlation": "datamining",
"covariance": "datamining",
"2mm": "linear-algebra/kernels",
"3mm": "linear-algebra/kernels",
"atax": "linear-algebra/kernels",
"bicg": "linear-algebra/kernels",
"doitgen": "linear-algebra/kernels",
"mvt": "linear-algebra/kernels",
"cholesky": "linear-algebra/solvers",
"durbin": "linear-algebra/solvers",
"lu": "linear-algebra/solvers",
"ludcmp": "linear-algebra/solvers",
"gramschmidt": "linear-algebra/solvers",
"trisolv": "linear-algebra/solvers",
"gemm": "linear-algebra/blas",
"gemver": "linear-algebra/blas",
"gesummv": "linear-algebra/blas",
"symm": "linear-algebra/blas",
"syr2k": "linear-algebra/blas",
"syrk": "linear-algebra/blas",
"trmm": "linear-algebra/blas",
"adi": "stencils",
"fdtd-2d": "stencils",
"heat-3d": "stencils",
"jacobi-1d": "stencils",
"jacobi-2d": "stencils",
"seidel-2d": "stencils",
"nussinov": "medley",
"deriche": "medley",
"floyd-warshall": "medley",
}
SRC_FILE = "polybench.tar.gz"
[docs] def compile_verify(self, compiler_args, polybench_opts):
polybench_opts.append("-DPOLYBENCH_DUMP_ARRAYS")
cflags = self.cflags
ldflags = self.ldflags
self.cflags = []
self.ldflags = []
clang_no_opts = compiler.cc(self)
self.cflags = cflags
self.ldflags = ldflags
run.run(clang_no_opts[polybench_opts, compiler_args, "-o", self.name +
".no-opts", "-lm"])
return polybench_opts
[docs] def compile(self):
self.download()
polybench_opts = CFG["projects"]["polybench"]
verify = bool(polybench_opts["verify"])
workload = str(polybench_opts["workload"])
tar('xfz', self.src_file)
src_dir_name = "polybench-c-{0}".format(self.version)
src_dir = local.cwd / src_dir_name
src_sub = src_dir / self.path_dict[self.name] / self.name
src_file = src_sub / (self.name + ".c")
utils_dir = src_dir / "utilities"
polybench_opts = [
"-DPOLYBENCH_USE_C99_PROTO", "-D" + str(workload),
"-DPOLYBENCH_USE_RESTRICT"
]
if verify:
polybench_opts = self.compile_verify([
"-I", utils_dir, "-I", src_sub, utils_dir / "polybench.c",
src_file, "-lm"
], polybench_opts)
clang = compiler.cc(self)
run.run(
clang["-I", utils_dir, "-I", src_sub, polybench_opts, utils_dir /
"polybench.c", src_file, "-lm", "-o", self.name])
[docs] def run_tests(self, runner):
def filter_stderr(stderr_raw, stderr_filtered):
"""Extract dump_arrays_output from stderr."""
with open(stderr_raw, 'r') as stderr:
with open(stderr_filtered, 'w') as stderr_filt:
stderr_filt.writelines(
get_dump_arrays_output(stderr.readlines()))
polybench_opts = CFG["projects"]["polybench"]
verify = bool(polybench_opts["verify"])
binary = local.cwd / self.name
opt_stderr_raw = binary + ".stderr"
opt_stderr_filtered = opt_stderr_raw + ".filtered"
runner(wrapping.wrap(binary, self))
filter_stderr(opt_stderr_raw, opt_stderr_filtered)
if verify:
binary = local.cwd / (self.name + ".no-opts")
noopt_stderr_raw = binary + ".stderr"
noopt_stderr_filtered = noopt_stderr_raw + ".filtered"
with local.env(BB_IS_BASELINE=True):
runner(wrapping.wrap(binary, self))
filter_stderr(noopt_stderr_raw, noopt_stderr_filtered)
diff_cmd = diff[noopt_stderr_filtered, opt_stderr_filtered]
runner(diff_cmd, retcode=0)
[docs]class Correlation(PolyBenchGroup):
NAME = 'correlation'
[docs]class Covariance(PolyBenchGroup):
NAME = 'covariance'
[docs]class TwoMM(PolyBenchGroup):
NAME = '2mm'
[docs]class ThreeMM(PolyBenchGroup):
NAME = '3mm'
[docs]class Atax(PolyBenchGroup):
NAME = 'atax'
[docs]class BicG(PolyBenchGroup):
NAME = 'bicg'
[docs]class Doitgen(PolyBenchGroup):
NAME = 'doitgen'
[docs]class Mvt(PolyBenchGroup):
NAME = 'mvt'
[docs]class Gemm(PolyBenchGroup):
NAME = 'gemm'
[docs]class Gemver(PolyBenchGroup):
NAME = 'gemver'
[docs]class Gesummv(PolyBenchGroup):
NAME = 'gesummv'
[docs]class Symm(PolyBenchGroup):
NAME = 'symm'
[docs]class Syr2k(PolyBenchGroup):
NAME = 'syr2k'
[docs]class Syrk(PolyBenchGroup):
NAME = 'syrk'
[docs]class Trmm(PolyBenchGroup):
NAME = 'trmm'
[docs]class Cholesky(PolyBenchGroup):
NAME = 'cholesky'
[docs]class Durbin(PolyBenchGroup):
NAME = 'durbin'
[docs]class Gramschmidt(PolyBenchGroup):
NAME = 'gramschmidt'
[docs]class Lu(PolyBenchGroup):
NAME = 'lu'
[docs]class LuDCMP(PolyBenchGroup):
NAME = 'ludcmp'
[docs]class Trisolv(PolyBenchGroup):
NAME = 'trisolv'
[docs]class Deriche(PolyBenchGroup):
NAME = 'deriche'
[docs]class FloydWarshall(PolyBenchGroup):
NAME = 'floyd-warshall'
[docs]class Nussinov(PolyBenchGroup):
NAME = 'nussinov'
[docs]class Adi(PolyBenchGroup):
NAME = 'adi'
[docs]class FDTD2D(PolyBenchGroup):
NAME = 'fdtd-2d'
[docs]class Jacobi1D(PolyBenchGroup):
NAME = 'jacobi-1d'
[docs]class Jacobi2Dimper(PolyBenchGroup):
NAME = 'jacobi-2d'
[docs]class Seidel2D(PolyBenchGroup):
NAME = 'seidel-2d'
[docs]class Heat3D(PolyBenchGroup):
NAME = 'heat-3d'