Skip to content

Commit 592917d

Browse files
committed
Use heaptrack to obtain memory data from non-gcvs experiments
1 parent 10bcbc6 commit 592917d

File tree

2 files changed

+446
-37
lines changed

2 files changed

+446
-37
lines changed

build.py

Lines changed: 51 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import benchmarks
1212
from artefacts import *
1313

14+
REBENCH_DATA = "results.data"
15+
1416
HS_MAP = {
1517
"ripgrep": {
1618
"heapsize-s": "32M",
@@ -236,11 +238,11 @@ def _missing_(cls, value):
236238
exp = cls.__name__.lower()
237239

238240
for member in cls:
239-
if f"{exp}-rc" in value:
241+
if f"rc" in value:
240242
return cls.RC
241-
elif f"{exp}-arc" in value:
243+
elif f"arc" in value:
242244
return cls.RC
243-
elif f"{exp}-{member.value}" in value:
245+
elif f"{member.value}" in value:
244246
return member
245247
elif "default" in value:
246248
return cls.GC
@@ -270,17 +272,16 @@ class PremOpt(ExperimentProfile):
270272
@classmethod
271273
@property
272274
def measurements(cls):
273-
return [Measurement.PERF, Measurement.METRICS]
275+
return [Measurement.PERF, Measurement.METRICS, Measurement.HEAPTRACK]
274276

275277
@classmethod
276278
def _missing_(cls, value):
277-
exp = cls.__name__.lower()
278-
279-
for member in cls:
280-
if f"{exp}-{member.value}" in value:
281-
return member
282-
elif "default" in value:
283-
return cls.OPT
279+
if value == "default":
280+
return cls.OPT
281+
else:
282+
for member in cls:
283+
if member.value in value:
284+
return member
284285
return None
285286

286287
@property
@@ -444,13 +445,6 @@ def __repr__(self):
444445
def latex(self) -> str:
445446
return f"\\{self.name.replace('-','')}"
446447

447-
@property
448-
def results(self):
449-
from results import SuiteData
450-
451-
results = SuiteData(self)
452-
return results
453-
454448
def raw_data(self, measurement) -> Path:
455449
return RESULTS_DIR / self.name / measurement.value / "results.data"
456450

@@ -890,9 +884,7 @@ def gauge_adapter(self) -> str:
890884
return {"AlloyAdapter": "alloy_adapter.py"}
891885

892886
def run(self, c, pexecs, config):
893-
self.results.parent.mkdir(parents=True, exist_ok=True)
894-
if self.measurement == Measurement.HEAPTRACK:
895-
(self.results.parent / "heaptrack").mkdir(parents=True, exist_ok=True)
887+
self.results_dir.mkdir(parents=True, exist_ok=True)
896888

897889
rebench_cmd = [
898890
str(REBENCH_EXEC),
@@ -937,8 +929,20 @@ def configurations(self, only_installed=False, only_missing=False):
937929
return executors
938930

939931
@property
940-
def results(self) -> Path:
941-
return RESULTS_DIR / self.suite.name / self.measurement.value / "results.data"
932+
def results_dir(self) -> Path:
933+
return RESULTS_DIR / self.suite.name / self.measurement.value
934+
935+
@property
936+
def results(self) -> [Path]:
937+
938+
if self.measurement == Measurement.PERF:
939+
return {self.results_dir / REBENCH_DATA}
940+
else:
941+
return set(
942+
f
943+
for f in self.results_dir.rglob("*")
944+
if f.name != REBENCH_DATA and not f.is_dir()
945+
)
942946

943947
@property
944948
def experiment(self):
@@ -947,6 +951,10 @@ def experiment(self):
947951
assert all([x.experiment == expected for x in self.profiles])
948952
return self.profiles[0].experiment
949953

954+
@property
955+
def profile_class(self):
956+
return self.profiles[0].__class__
957+
950958
@property
951959
def name(self) -> str:
952960
return f"{self.suite.name}-{self.experiment}-{self.measurement.value}"
@@ -996,16 +1004,17 @@ def bin(self) -> str:
9961004

9971005
@property
9981006
def run_env(self):
999-
libgc = str(cfg.alloy.install_prefix / "lib" / "libgc.so")
1007+
libgc = Path("/home/jake/research/bdwgc/out/libgc.so")
10001008
env = {
10011009
"DISPLAY": ":99",
1002-
"LD_PRELOAD": libgc,
1010+
"LD_PRELOAD": str(libgc),
10031011
}
1012+
env["RESULTS_DIR"] = str(self.results_dir)
1013+
env["HT_PATH"] = str(HEAPTRACK.path)
1014+
if self.metric == Measurement.HEAPTRACK:
1015+
env["USE_HT"] = "true"
10041016
if self.metric == Measurement.METRICS:
1005-
env["GC_LOG_DIR"] = str(self.metrics_data)
1006-
elif self.metric == Measurement.HEAPTRACK:
1007-
env["GC_HEAPTRACK_DIR"] = str(self.heaptrack_dir)
1008-
env["HEAPTRACK_PATH"] = str(HEAPTRACK.path)
1017+
env["USE_MT"] = "true"
10091018

10101019
if self.id == "heapsize-s":
10111020
env["GC_INITIAL_HEAP_SIZE"] = HS_MAP[self.suite.name]["heapsize-s"]
@@ -1023,12 +1032,10 @@ def run_env(self):
10231032
return env
10241033

10251034
@property
1026-
def metrics_data(self) -> Path:
1027-
return self.experiment.results.parent / f"{self.id}"
1028-
1029-
@property
1030-
def heaptrack_dir(self) -> Path:
1031-
return self.experiment.results.parent / self.id
1035+
def results_dir(self) -> Path:
1036+
dir = self.experiment.results_dir / self.id
1037+
dir.mkdir(parents=True, exist_ok=True)
1038+
return dir
10321039

10331040
@property
10341041
def build_dir(self) -> Path:
@@ -1101,7 +1108,7 @@ def run(self, c, pexecs):
11011108

11021109
def remove(self):
11031110
for e in self.experiments:
1104-
e.results.unlink(missing_ok=True)
1111+
e.results_dir.unlink(missing_ok=True)
11051112

11061113
def alloy_variants(self, only_installed=False, only_missing=False):
11071114
l = [cfg.alloy for cfg in self.configurations()]
@@ -1144,7 +1151,7 @@ def config(self) -> Path:
11441151
"executions": [
11451152
cfg.rebench_name for cfg in executors if cfg.experiment == e
11461153
],
1147-
"data_file": str(e.results),
1154+
"data_file": str(e.results_dir / REBENCH_DATA),
11481155
}
11491156

11501157
bm_part[e.suite.name] = {
@@ -1190,6 +1197,13 @@ def all(cls, pexecs: int = 30) -> "Experiments":
11901197
profiles = [GCVS, PremOpt, Elision, HeapSize]
11911198
return cls(pexecs, [e for p in profiles for e in p.experiments(pexecs)])
11921199

1200+
@property
1201+
def results(self):
1202+
results = set()
1203+
for e in self.experiments:
1204+
results.update(e.results)
1205+
return results
1206+
11931207

11941208
@dataclass
11951209
class RebenchConfig:

0 commit comments

Comments
 (0)