"""
PAPI based experiments.
These types of experiments (papi & papi-std) need to instrument the
project with libbenchbuild support to work.
"""
from benchbuild.experiment import RuntimeExperiment
import benchbuild.extensions as ext
from benchbuild.utils.actions import Step
[docs]class Calibrate(Step):
NAME = "CALIBRATE"
DESCRIPTION = "Calibrate libpapi measurement functions."
[docs]class Analyze(Step):
NAME = "ANALYZE"
DESCRIPTION = "Analyze the experiment after completion."
[docs]class PapiScopCoverage(RuntimeExperiment):
"""PAPI-based dynamic SCoP coverage measurement."""
NAME = "papi"
[docs] def actions(self):
"""Do the postprocessing, after all projects are done."""
actions = super(PapiScopCoverage, self).actions()
# FIXME: Still required?
# def run_pprof_analyze():
# from benchbuild.utils.cmd import pprof_analyze
#
# with local.env(BB_EXPERIMENT=self.name,
# BB_USE_DATABASE=1,
# BB_USE_FILE=0,
# BB_USE_CSV=0):
# pprof_analyze()
#
# actions.extend([
# Analyze(self, run_pprof_analyze),
# ])
return actions
[docs] def actions_for_project(self, project):
"""
Create & Run a papi-instrumented version of the project.
This experiment uses the -jitable flag of libPolyJIT to generate
dynamic SCoP coverage.
"""
project.ldflags = project.ldflags + ["-lpjit", "-lpprof", "-lpapi"]
project.cflags = [
"-O3", "-Xclang", "-load", "-Xclang", "LLVMPolyJIT.so",
"-mllvm", "-polli",
"-mllvm", "-polli-instrument",
"-mllvm", "-polli-no-recompilation",
"-mllvm", "-polly-detect-keep-going"]
project.compiler_extension = \
ext.RunWithTimeout(ext.ExtractCompileStats(project, self))
project.runtime_extension = \
ext.RunWithTime(
ext.RuntimeExtension(project, self, config={'jobs': 1}))
def evaluate_calibration(e):
from benchbuild.utils.cmd import pprof_calibrate
papi_calibration = e.get_papi_calibration(project, pprof_calibrate)
e.persist_calibration(project, pprof_calibrate, papi_calibration)
actns = self.default_runtime_actions(project)
actns.append(Calibrate(self, evaluate_calibration))
return self.default_runtime_actions(project)
[docs]class PapiStandardScopCoverage(PapiScopCoverage):
"""PAPI Scop Coverage, without JIT."""
NAME = "papi-std"
[docs] def actions_for_project(self, project):
"""
Create & Run a papi-instrumented version of the project.
This experiment uses the -jitable flag of libPolyJIT to generate
dynamic SCoP coverage.
"""
project.ldflags = project.ldflags + ["-lpjit", "-lpprof", "-lpapi"]
project.cflags = [
"-O3", "-Xclang", "-load", "-Xclang", "LLVMPolyJIT.so",
"-mllvm", "-polli",
"-mllvm", "-polli-instrument",
"-mllvm", "-polli-no-recompilation",
"-mllvm", "-polly-detect-keep-going"]
project.compiler_extension = \
ext.RunWithTimeout(ext.ExtractCompileStats(project, self))
project.runtime_extension = \
ext.RunWithTime(
ext.RuntimeExtension(project, self, config={'jobs': 1}))
def evaluate_calibration(e):
from benchbuild.utils.cmd import pprof_calibrate
papi_calibration = e.get_papi_calibration(project, pprof_calibrate)
e.persist_calibration(project, pprof_calibrate, papi_calibration)
actns = self.default_runtime_actions(project)
actns.append(Calibrate(self, evaluate_calibration))
return self.default_runtime_actions(project)