From 385033bd11996db066357b85b00f27005d0e87a5 Mon Sep 17 00:00:00 2001 From: Sam James Date: Tue, 13 Feb 2024 21:04:44 +0000 Subject: [PATCH] CycleClock: Add support for Alpha architecture (#1753) * Add support for Alpha architecture As documented, the real cycle counter is unsafe to use here, because it is a 32-bit integer which wraps every ~4s. Use gettimeofday instead, which has a limitation of a low-precision real-time-clock (~1ms), but no wrapping. Passes test suite. Support parsing /proc/cpuinfo on Alpha tabular_test: add a missing DoNotOptimize call --- src/cycleclock.h | 9 +++++++++ src/sysinfo.cc | 4 ++++ test/user_counters_tabular_test.cc | 3 +++ 3 files changed, 16 insertions(+) diff --git a/src/cycleclock.h b/src/cycleclock.h index 931bba14..eff563e7 100644 --- a/src/cycleclock.h +++ b/src/cycleclock.h @@ -218,6 +218,15 @@ inline BENCHMARK_ALWAYS_INLINE int64_t Now() { uint64_t pcycle; asm volatile("%0 = C15:14" : "=r"(pcycle)); return static_cast(pcycle); +#elif defined(__alpha__) + // Alpha has a cycle counter, the PCC register, but it is an unsigned 32-bit + // integer and thus wraps every ~4s, making using it for tick counts + // unreliable beyond this time range. The real-time clock is low-precision, + // roughtly ~1ms, but it is the only option that can reasonable count + // indefinitely. + struct timeval tv; + gettimeofday(&tv, nullptr); + return static_cast(tv.tv_sec) * 1000000 + tv.tv_usec; #else // The soft failover to a generic implementation is automatic only for ARM. // For other platforms the developer is expected to make an attempt to create diff --git a/src/sysinfo.cc b/src/sysinfo.cc index 04d64dc5..786bb1b4 100644 --- a/src/sysinfo.cc +++ b/src/sysinfo.cc @@ -513,7 +513,11 @@ int GetNumCPUs() { std::cerr << "failed to open /proc/cpuinfo\n"; return -1; } +#if defined(__alpha__) + const std::string Key = "cpus detected"; +#else const std::string Key = "processor"; +#endif std::string ln; while (std::getline(f, ln)) { if (ln.empty()) continue; diff --git a/test/user_counters_tabular_test.cc b/test/user_counters_tabular_test.cc index 3e8fb1bf..ffd3c099 100644 --- a/test/user_counters_tabular_test.cc +++ b/test/user_counters_tabular_test.cc @@ -63,6 +63,9 @@ ADD_CASES(TC_CSVOut, {{"%csv_header," void BM_Counters_Tabular(benchmark::State& state) { for (auto _ : state) { + // This test requires a non-zero CPU time to avoid divide-by-zero + auto iterations = state.iterations(); + benchmark::DoNotOptimize(iterations); } namespace bm = benchmark; state.counters.insert({