[libc-commits] [libc] a964f2e - [libc] Improve Benchmark UI (#99796)
via libc-commits
libc-commits at lists.llvm.org
Sun Jul 21 14:40:05 PDT 2024
Author: jameshu15869
Date: 2024-07-21T16:40:01-05:00
New Revision: a964f2e8a1e98d5ac1fa379ec52b6713ae5cb48a
URL: https://github.com/llvm/llvm-project/commit/a964f2e8a1e98d5ac1fa379ec52b6713ae5cb48a
DIFF: https://github.com/llvm/llvm-project/commit/a964f2e8a1e98d5ac1fa379ec52b6713ae5cb48a.diff
LOG: [libc] Improve Benchmark UI (#99796)
This PR changes the output to resemble Google Benchmark. e.g.
```
Running Suite: LlvmLibcIsAlNumGpuBenchmark
Benchmark | Cycles | Min | Max | Iterations | Time (ns) | Stddev | Threads |
-----------------------------------------------------------------------------------------------------
IsAlnum | 92 | 76 | 482 | 23 | 86500 | 76 | 64 |
IsAlnumSingleThread | 87 | 76 | 302 | 20 | 72000 | 49 | 1 |
IsAlnumSingleWave | 87 | 76 | 302 | 20 | 72000 | 49 | 32 |
IsAlnumCapital | 89 | 76 | 299 | 17 | 78500 | 52 | 64 |
IsAlnumNotAlnum | 87 | 76 | 303 | 20 | 76000 | 49 | 64 |
```
Added:
Modified:
libc/benchmarks/gpu/CMakeLists.txt
libc/benchmarks/gpu/LibcGpuBenchmark.cpp
libc/benchmarks/gpu/LibcGpuBenchmark.h
Removed:
################################################################################
diff --git a/libc/benchmarks/gpu/CMakeLists.txt b/libc/benchmarks/gpu/CMakeLists.txt
index 29e27724e1ab3..69518acff3a5d 100644
--- a/libc/benchmarks/gpu/CMakeLists.txt
+++ b/libc/benchmarks/gpu/CMakeLists.txt
@@ -7,7 +7,7 @@ function(add_benchmark benchmark_name)
"BENCHMARK"
"" # Optional arguments
"" # Single value arguments
- "LINK_LIBRARIES" # Multi-value arguments
+ "LINK_LIBRARIES;DEPENDS" # Multi-value arguments
${ARGN}
)
@@ -20,6 +20,9 @@ function(add_benchmark benchmark_name)
LINK_LIBRARIES
LibcGpuBenchmark.hermetic
${BENCHMARK_LINK_LIBRARIES}
+ DEPENDS
+ libc.src.stdio.printf
+ ${BENCHMARK_DEPENDS}
${BENCHMARK_UNPARSED_ARGUMENTS}
)
get_fq_target_name(${benchmark_name} fq_target_name)
@@ -55,6 +58,7 @@ add_unittest_framework_library(
libc.src.__support.fixedvector
libc.src.time.clock
libc.benchmarks.gpu.timing.timing
+ libc.src.stdio.printf
)
add_subdirectory(src)
diff --git a/libc/benchmarks/gpu/LibcGpuBenchmark.cpp b/libc/benchmarks/gpu/LibcGpuBenchmark.cpp
index c926d8efd7db2..59de18c20417d 100644
--- a/libc/benchmarks/gpu/LibcGpuBenchmark.cpp
+++ b/libc/benchmarks/gpu/LibcGpuBenchmark.cpp
@@ -7,6 +7,7 @@
#include "src/__support/GPU/utils.h"
#include "src/__support/fixedvector.h"
#include "src/__support/macros/config.h"
+#include "src/stdio/printf.h"
#include "src/time/gpu/time_utils.h"
namespace LIBC_NAMESPACE_DECL {
@@ -73,10 +74,16 @@ struct AtomicBenchmarkSums {
};
AtomicBenchmarkSums all_results;
+const char *header_format_string =
+ "Benchmark | Cycles | Min | Max | Iterations | "
+ "Time | Stddev | Threads |\n";
+const char *output_format_string =
+ "%-20s |%8ld |%8ld |%8ld |%11ld |%9ld %2s |%9ld |%9d |\n";
+
+constexpr auto GREEN = "\033[32m";
+constexpr auto RESET = "\033[0m";
void print_results(Benchmark *b) {
- constexpr auto GREEN = "\033[32m";
- constexpr auto RESET = "\033[0m";
BenchmarkResult result;
cpp::atomic_thread_fence(cpp::MemoryOrder::RELEASE);
@@ -92,21 +99,51 @@ void print_results(Benchmark *b) {
all_results.samples_sum.load(cpp::MemoryOrder::RELAXED) / num_threads;
result.total_iterations =
all_results.iterations_sum.load(cpp::MemoryOrder::RELAXED) / num_threads;
- result.total_time =
+ const uint64_t duration_ns =
all_results.time_sum.load(cpp::MemoryOrder::RELAXED) / num_threads;
+ const uint64_t duration_us = duration_ns / 1000;
+ const uint64_t duration_ms = duration_ns / (1000 * 1000);
+ uint64_t converted_duration = duration_ns;
+ cpp::string time_unit;
+ if (duration_ms != 0) {
+ converted_duration = duration_ms;
+ time_unit = cpp::string("ms");
+ } else if (duration_us != 0) {
+ converted_duration = duration_us;
+ time_unit = cpp::string("us");
+ } else {
+ converted_duration = duration_ns;
+ time_unit = cpp::string("ns");
+ }
+ result.total_time = converted_duration;
+ // result.total_time =
+ // all_results.time_sum.load(cpp::MemoryOrder::RELAXED) / num_threads;
cpp::atomic_thread_fence(cpp::MemoryOrder::RELEASE);
- log << GREEN << "[ RUN ] " << RESET << b->get_name() << '\n';
- log << GREEN << "[ OK ] " << RESET << b->get_name() << ": "
- << result.cycles << " cycles, " << result.min << " min, " << result.max
- << " max, " << result.total_iterations << " iterations, "
- << result.total_time << " ns, "
- << static_cast<uint64_t>(result.standard_deviation)
- << " stddev (num threads: " << num_threads << ")\n";
+ LIBC_NAMESPACE::printf(
+ output_format_string, b->get_test_name().data(), result.cycles,
+ result.min, result.max, result.total_iterations, result.total_time,
+ time_unit.data(), static_cast<uint64_t>(result.standard_deviation),
+ num_threads);
+}
+
+void print_header() {
+ LIBC_NAMESPACE::printf("%s", GREEN);
+ LIBC_NAMESPACE::printf("Running Suite: %-10s\n",
+ benchmarks[0]->get_suite_name().data());
+ LIBC_NAMESPACE::printf("%s", RESET);
+ LIBC_NAMESPACE::printf(header_format_string);
+ LIBC_NAMESPACE::printf(
+ "---------------------------------------------------------------------"
+ "--------------------------------\n");
}
void Benchmark::run_benchmarks() {
uint64_t id = gpu::get_thread_id();
+
+ if (id == 0)
+ print_header();
+
gpu::sync_threads();
for (Benchmark *b : benchmarks) {
diff --git a/libc/benchmarks/gpu/LibcGpuBenchmark.h b/libc/benchmarks/gpu/LibcGpuBenchmark.h
index 29d7ba8b0a132..c07fab9ccfbe3 100644
--- a/libc/benchmarks/gpu/LibcGpuBenchmark.h
+++ b/libc/benchmarks/gpu/LibcGpuBenchmark.h
@@ -81,17 +81,20 @@ BenchmarkResult benchmark(const BenchmarkOptions &options,
class Benchmark {
const cpp::function<uint64_t(void)> func;
- const cpp::string_view name;
+ const cpp::string_view suite_name;
+ const cpp::string_view test_name;
const uint8_t flags;
public:
- Benchmark(cpp::function<uint64_t(void)> func, char const *name, uint8_t flags)
- : func(func), name(name), flags(flags) {
+ Benchmark(cpp::function<uint64_t(void)> func, char const *suite_name,
+ char const *test_name, uint8_t flags)
+ : func(func), suite_name(suite_name), test_name(test_name), flags(flags) {
add_benchmark(this);
}
static void run_benchmarks();
- const cpp::string_view get_name() const { return name; }
+ const cpp::string_view get_suite_name() const { return suite_name; }
+ const cpp::string_view get_test_name() const { return test_name; }
protected:
static void add_benchmark(Benchmark *benchmark);
@@ -107,16 +110,16 @@ class Benchmark {
#define BENCHMARK(SuiteName, TestName, Func) \
LIBC_NAMESPACE::benchmarks::Benchmark SuiteName##_##TestName##_Instance( \
- Func, #SuiteName "." #TestName, 0)
+ Func, #SuiteName, #TestName, 0)
#define SINGLE_THREADED_BENCHMARK(SuiteName, TestName, Func) \
LIBC_NAMESPACE::benchmarks::Benchmark SuiteName##_##TestName##_Instance( \
- Func, #SuiteName "." #TestName, \
+ Func, #SuiteName, #TestName, \
LIBC_NAMESPACE::benchmarks::BenchmarkFlags::SINGLE_THREADED)
#define SINGLE_WAVE_BENCHMARK(SuiteName, TestName, Func) \
LIBC_NAMESPACE::benchmarks::Benchmark SuiteName##_##TestName##_Instance( \
- Func, #SuiteName "." #TestName, \
+ Func, #SuiteName, #TestName, \
LIBC_NAMESPACE::benchmarks::BenchmarkFlags::SINGLE_WAVE)
#endif
More information about the libc-commits
mailing list