Skip to content

Commit 6ec6461

Browse files
committed
Split ray tracing AS build benchmark into disaggregated BLAS Build (MTris/s), BLAS Update (MTris/s), and TLAS Build (MInst/s) throughput metrics
1 parent 04e8524 commit 6ec6461

6 files changed

Lines changed: 37 additions & 19 deletions

File tree

cpp_src/benchmarks/IBenchmark.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class IBenchmark {
1616
virtual const char *GetName() const = 0;
1717
virtual std::vector<std::string> GetAliases() const { return {}; }
1818
virtual const char *GetMetric() const { return "TFLOPS"; }
19+
virtual const char *GetMetric(uint32_t config_idx) const { return GetMetric(); }
1920
virtual bool IsSupported(const DeviceInfo &info,
2021
IComputeContext *context = nullptr) const = 0;
2122
virtual void Setup(IComputeContext &context,

cpp_src/benchmarks/RayASBuildBench.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -257,16 +257,22 @@ void RayASBuildBench::Teardown() {
257257
}
258258

259259
BenchmarkResult RayASBuildBench::GetResult(uint32_t config_idx) const {
260-
return {1, buildTimes.at(config_idx)};
260+
uint64_t ops = (config_idx == 1) ? numInstances : numPrimitives;
261+
return {ops, buildTimes.at(config_idx)};
261262
}
262263

263264
const char *RayASBuildBench::GetName() const { return "RayASBuild"; }
264265
const char *RayASBuildBench::GetComponent(uint32_t config_idx) const {
265266
return "Ray Tracing";
266267
}
267-
const char *RayASBuildBench::GetMetric() const { return "ms/op"; }
268+
const char *RayASBuildBench::GetMetric(uint32_t config_idx) const {
269+
if (config_idx == 1) return "MInst/s";
270+
return "MTris/s";
271+
}
268272
const char *RayASBuildBench::GetSubCategory(uint32_t config_idx) const {
269-
return "AS Build Performance";
273+
if (config_idx == 0) return "BLAS Build";
274+
if (config_idx == 1) return "TLAS Build";
275+
return "BLAS Update";
270276
}
271277

272278
std::string RayASBuildBench::GetConfigName(uint32_t config_idx) const {

cpp_src/benchmarks/RayASBuildBench.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class RayASBuildBench : public IBenchmark {
1919
BenchmarkResult GetResult(uint32_t config_idx) const override;
2020
const char *GetName() const override;
2121
const char *GetComponent(uint32_t config_idx) const override;
22-
const char *GetMetric() const override;
22+
const char *GetMetric(uint32_t config_idx) const override;
2323
const char *GetSubCategory(uint32_t config_idx) const override;
2424
std::string GetConfigName(uint32_t config_idx) const override;
2525

cpp_src/core/BenchmarkRunner.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ void BenchmarkRunner::run(const std::vector<std::string> &benchmarks_to_run) {
426426
context->getBackend());
427427
result_data.deviceName = info.name;
428428
result_data.benchmarkName = bench_name;
429-
result_data.metric = bench->GetMetric();
429+
result_data.metric = bench->GetMetric(i);
430430
result_data.operations =
431431
bench_result.operations * total_invocations;
432432
result_data.time_ms = total_time_ms;
@@ -548,7 +548,7 @@ void BenchmarkRunner::run(const std::vector<std::string> &benchmarks_to_run) {
548548
result_data.backendName = "System";
549549
result_data.deviceName = "Host CPU";
550550
result_data.benchmarkName = bench_name;
551-
result_data.metric = bench->GetMetric();
551+
result_data.metric = bench->GetMetric(i);
552552
result_data.operations =
553553
bench_result.operations * total_invocations;
554554
result_data.time_ms = total_time_ms;

cpp_src/core/ResultFormatter.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -214,11 +214,13 @@ void ResultFormatter::print() {
214214
} else {
215215
value = (static_cast<double>(res.operations) /
216216
(res.time_ms / 1000.0));
217-
int precision = 2;
218-
if (res.metric == "GIS/s" || res.metric == "GRays/s") {
219-
value /= 1e9;
220-
if (res.metric == "GRays/s")
221-
precision = 3;
217+
int precision = 2;
218+
if (res.metric == "GIS/s" || res.metric == "GRays/s") {
219+
value /= 1e9;
220+
if (res.metric == "GRays/s")
221+
precision = 3;
222+
} else if (res.metric == "MTris/s" || res.metric == "MInst/s") {
223+
value /= 1e6;
222224
}
223225
valStr = formatDouble(value, precision);
224226
unit = " " + res.metric;

gpubench-gui/src/main.rs

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,9 @@ struct GPUBenchApp {
201201
gpu_int4_matrix: f32,
202202

203203
gpu_rt_anyhit: f32,
204-
gpu_rt_as_build: f32,
204+
gpu_rt_blas_build: f32,
205+
gpu_rt_blas_update: f32,
206+
gpu_rt_tlas_build: f32,
205207
gpu_rt_incoherent: f32,
206208
gpu_rt_intersect: f32,
207209
gpu_rt_divergence: f32,
@@ -287,7 +289,9 @@ impl Application for GPUBenchApp {
287289
gpu_int4_vector: 0.0,
288290
gpu_int4_matrix: 0.0,
289291
gpu_rt_anyhit: 0.0,
290-
gpu_rt_as_build: 0.0,
292+
gpu_rt_blas_build: 0.0,
293+
gpu_rt_blas_update: 0.0,
294+
gpu_rt_tlas_build: 0.0,
291295
gpu_rt_incoherent: 0.0,
292296
gpu_rt_intersect: 0.0,
293297
gpu_rt_divergence: 0.0,
@@ -534,7 +538,9 @@ impl Application for GPUBenchApp {
534538
},
535539
"ray_tracing": {
536540
"any_hit": self.gpu_rt_anyhit,
537-
"as_build": self.gpu_rt_as_build,
541+
"blas_build_mtris_sec": self.gpu_rt_blas_build,
542+
"blas_update_mtris_sec": self.gpu_rt_blas_update,
543+
"tlas_build_minst_sec": self.gpu_rt_tlas_build,
538544
"incoherent": self.gpu_rt_incoherent,
539545
"intersect": self.gpu_rt_intersect,
540546
"divergence": self.gpu_rt_divergence,
@@ -797,7 +803,9 @@ impl Application for GPUBenchApp {
797803
metric_row("RayAnyHit", "AnyHit", self.gpu_rt_anyhit, "GRays/s", "Tests intersection performance against geometry with alpha-testing (transparency) enabled. Stresses the GPU's ability to evaluate shaders during ray traversal."),
798804
metric_row("RayIncoherent", "Incoherent", self.gpu_rt_incoherent, "GRays/s", "Tests performance when rays bounce in completely random directions, causing high cache misses. Simulates complex global illumination and path tracing."),
799805
metric_row("RayPayload", "Payload", self.gpu_rt_payload, "GRays/s", "Tests the impact of carrying large blocks of data (payloads) along with the ray, which stresses the register usage and VRAM bandwidth of the compute units."),
800-
metric_row("RayASBuild", "AS Build", self.gpu_rt_as_build, "ms", "Measures the time required to build the Acceleration Structure (BVH) for a complex scene. Lower is better. Crucial for dynamic or destructible environments."),
806+
metric_row("RayASBuild", "BLAS Build", self.gpu_rt_blas_build, "MTris/s", "Measures BVH construction speed for bottom-level static geometry (1 Million Triangles). Higher is better."),
807+
metric_row("RayASBuild", "BLAS Update", self.gpu_rt_blas_update, "MTris/s", "Measures BVH update/refit speed for bottom-level dynamic geometry (1 Million Triangles). Higher is better."),
808+
metric_row("RayASBuild", "TLAS Build", self.gpu_rt_tlas_build, "MInst/s", "Measures top-level instantiation speed for scene-graph organization (10,000 Instances). Higher is better."),
801809
metric_row("RayProcedural", "Procedural", self.gpu_rt_procedural, "GRays/s", "Measures intersection speed against mathematically defined geometry (like spheres or curves) rather than explicit triangles. Useful for advanced rendering engines."),
802810
].spacing(12).into();
803811

@@ -904,6 +912,8 @@ impl GPUBenchApp {
904912
value /= 1e9;
905913
} else if res.metric == "TFLOPS" || res.metric == "TOPS" {
906914
value /= 1e12;
915+
} else if res.metric == "MTris/s" || res.metric == "MInst/s" {
916+
value /= 1e6;
907917
}
908918

909919
if res.backendName == "Native" || res.backendName == "System" {
@@ -950,10 +960,9 @@ impl GPUBenchApp {
950960
}
951961
"Ray Tracing" => {
952962
if res.subcategory == "Alpha-Tested Geometry" { self.gpu_rt_anyhit = self.gpu_rt_anyhit.max(value); }
953-
if res.subcategory == "AS Build Performance" {
954-
if self.gpu_rt_as_build == 0.0 { self.gpu_rt_as_build = value; }
955-
else { self.gpu_rt_as_build = self.gpu_rt_as_build.min(value); }
956-
}
963+
if res.subcategory == "BLAS Build" { self.gpu_rt_blas_build = self.gpu_rt_blas_build.max(value); }
964+
if res.subcategory == "BLAS Update" { self.gpu_rt_blas_update = self.gpu_rt_blas_update.max(value); }
965+
if res.subcategory == "TLAS Build" { self.gpu_rt_tlas_build = self.gpu_rt_tlas_build.max(value); }
957966
if res.subcategory == "Incoherent Traversal" { self.gpu_rt_incoherent = self.gpu_rt_incoherent.max(value); }
958967
if res.subcategory == "Intersection tests" { self.gpu_rt_intersect = self.gpu_rt_intersect.max(value); }
959968
if res.subcategory == "Material Divergence" || res.subcategory == "Execution Divergence" { self.gpu_rt_divergence = self.gpu_rt_divergence.max(value); }

0 commit comments

Comments
 (0)