Skip to content

Commit 1cb99eb

Browse files
committed
[GR-66890] Add PE microbenchmark.
PullRequest: graal/21379
2 parents 442b499 + 70ccc93 commit 1cb99eb

33 files changed

+3470
-1964
lines changed

truffle/ci/ci.jsonnet

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@
3333
["cd", "./compiler"],
3434
["mx", "build" ],
3535
["mx", "hsdis", "||", "true"],
36-
]
36+
],
37+
notify_groups:: ["truffle"],
38+
upload:: ["bench-uploader.py", "${BENCH_RESULTS_FILE_PATH}"],
3739
},
3840

3941
local simple_tool_maven_project_gate = truffle_common + {
@@ -138,7 +140,7 @@
138140
],
139141
timelimit: "3:00:00",
140142
teardown: [
141-
["bench-uploader.py", "${BENCH_RESULTS_FILE_PATH}"],
143+
self.upload,
142144
],
143145
},
144146

@@ -149,6 +151,14 @@
149151
],
150152
},
151153

154+
local truffle_compiler_benchmark = bench_common + {
155+
name: self.name_prefix + 'truffle-compiler-benchmark-' + self.truffle_jdk_name + '-' + self.os + '-' + self.arch,
156+
run+: [
157+
["mx", "--java-home", "$JAVA_HOME", "benchmark", "truffle:*", "--results-file", "${BENCH_RESULTS_FILE_PATH}", "--", "--jvm", "java-home", "--", "org.graalvm.truffle.compiler.benchmark", "-prof", "org.graalvm.truffle.compiler.benchmark.CompilationTimingsProfiler"],
158+
self.upload,
159+
],
160+
},
161+
152162
local tier1 = common.tier1 + {
153163
name_prefix: "gate-",
154164
timelimit: "0:30:00"
@@ -244,7 +254,10 @@
244254

245255
# Truffle Benchmarks
246256
[linux_amd64 + tier3 + jdk_latest_labs + jmh_benchmark_test],
247-
[bench_hw.x52 + bench + jdk_latest_labs + jmh_benchmark]
257+
[bench_hw.x52 + bench + jdk_latest_labs + jmh_benchmark],
258+
259+
# Truffle compilation benchmarks
260+
[linux_amd64 + bench + jdk_latest_graalvm_ce + truffle_compiler_benchmark],
248261
]),
249262
builds: utils.add_defined_in(_builds, std.thisFile),
250263
}

truffle/mx.truffle/mx_truffle.py

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,91 @@ def subgroup(self):
9090

9191
def extraVmArgs(self):
9292
extraVmArgs = super(JMHRunnerTruffleBenchmarkSuite, self).extraVmArgs()
93-
# com.oracle.truffle.api.benchmark.InterpreterCallBenchmark$BenchmarkState needs DefaultTruffleRuntime
93+
# org.graalvm.truffle.benchmark.InterpreterCallBenchmark$BenchmarkState needs DefaultTruffleRuntime
9494
extraVmArgs.append('--add-exports=org.graalvm.truffle/com.oracle.truffle.api.impl=ALL-UNNAMED')
95+
# org.graalvm.truffle.compiler.benchmark.* needs OptimizedTruffleRuntime
96+
extraVmArgs.append('--add-exports=org.graalvm.truffle.runtime/com.oracle.truffle.runtime=ALL-UNNAMED')
9597
return extraVmArgs
9698

99+
def rules(self, out, benchmarks, bmSuiteArgs):
100+
result = super().rules(out, benchmarks, bmSuiteArgs)
101+
result_file = self.get_jmh_result_file(bmSuiteArgs)
102+
suite_name = self.benchSuiteName(bmSuiteArgs)
103+
result.extend([
104+
JMHJsonCompilationTimingRule(result_file, suite_name, "pe-time"),
105+
JMHJsonCompilationTimingRule(result_file, suite_name, "compile-time"),
106+
JMHJsonCompilationTimingRule(result_file, suite_name, "code-install-time"),
107+
])
108+
return result
109+
110+
class JMHJsonCompilationTimingRule(mx_benchmark.JMHJsonRule):
111+
def __init__(self, filename, suite_name, metric_name):
112+
super().__init__(filename, suite_name)
113+
self.metric_name = metric_name
114+
115+
def parse(self, text):
116+
r = []
117+
with open(self._prepend_working_dir(self.filename)) as fp:
118+
for result in json.load(fp):
119+
benchmark = self.getBenchmarkNameFromResult(result)
120+
metric = result.get("secondaryMetrics", {}).get(self.metric_name)
121+
if metric is None:
122+
return []
123+
124+
unit = JMHJsonCompilationTimingRule.standardize_unit(metric["scoreUnit"])
125+
126+
template = {
127+
"bench-suite" : self.suiteName,
128+
"benchmark" : self.shortenPackageName(benchmark),
129+
"metric.unit": unit,
130+
"metric.score-function": "id",
131+
"metric.better": "lower",
132+
"metric.type": "numeric",
133+
# full name
134+
"extra.jmh.benchmark" : benchmark,
135+
}
136+
137+
if "params" in result:
138+
# add all parameter as a single string
139+
template["extra.jmh.params"] = ", ".join(["=".join(kv) for kv in result["params"].items()])
140+
# and also the individual values
141+
for k, v in result["params"].items():
142+
template["extra.jmh.param." + k] = str(v)
143+
144+
for k in self.getExtraJmhKeys():
145+
extra_value = None
146+
if k in result:
147+
extra_value = result[k]
148+
template["extra.jmh." + k] = str(extra_value)
149+
150+
151+
summary_datapoint = template.copy()
152+
summary_datapoint.update({
153+
"metric.name": self.metric_name,
154+
"metric.value": float(metric["score"])
155+
})
156+
r.append(summary_datapoint)
157+
158+
score_percentiles = metric.get("scorePercentiles")
159+
if score_percentiles:
160+
distribution_metric_name = f"{self.metric_name}-distribution"
161+
for percentile, score in score_percentiles.items():
162+
percentile_datapoint = template.copy()
163+
percentile_datapoint.update({
164+
"metric.name": distribution_metric_name,
165+
"metric.value": float(score),
166+
"metric.percentile": float(percentile)
167+
})
168+
r.append(percentile_datapoint)
169+
return r
170+
171+
@staticmethod
172+
def standardize_unit(unit: str) -> str:
173+
if unit.endswith("/op"):
174+
# JMH emits timings "per operation", e.g., "ms/op". Drop the suffix.
175+
return unit[:-len("/op")]
176+
return unit
177+
97178
mx_benchmark.add_bm_suite(JMHRunnerTruffleBenchmarkSuite())
98179
#mx_benchmark.add_java_vm(mx_benchmark.DefaultJavaVm("server", "default"), priority=3)
99180

0 commit comments

Comments
 (0)