1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
https://bugs.gentoo.org/922877
https://github.com/google/benchmark/pull/1753
From cdd4a6d48077a78d07e3b7f165383f6d5052108c Mon Sep 17 00:00:00 2001
From: Sam James <sam@gentoo.org>
Date: Fri, 2 Feb 2024 21:38:11 -0500
Subject: [PATCH 1/3] CycleClock: 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.
Signed-off-by: Sam James <sam@gentoo.org>
---
src/cycleclock.h | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/src/cycleclock.h b/src/cycleclock.h
index 931bba146..eff563e7f 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<double>(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<int64_t>(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
From b1bec2fa5aed335b5be78720a9812cf27baf9df6 Mon Sep 17 00:00:00 2001
From: Sam James <sam@gentoo.org>
Date: Fri, 2 Feb 2024 21:46:06 -0500
Subject: [PATCH 2/3] sysinfo: support parsing /proc/cpuinfo on Alpha
And also, bail out if unable to parse /proc/cpuinfo. This will
preemptively alert users on platforms that need custom code for parsing
/proc/cpuinfo.
Signed-off-by: Sam James <sam@gentoo.org>
---
src/sysinfo.cc | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/sysinfo.cc b/src/sysinfo.cc
index 04d64dc5b..786bb1b41 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;
From 17f2f35e1ce650b4f8596a5c5df6a050588136c5 Mon Sep 17 00:00:00 2001
From: Sam James <sam@gentoo.org>
Date: Fri, 2 Feb 2024 21:49:24 -0500
Subject: [PATCH 3/3] tabular_test: add a missing DoNotOptimize call
Signed-off-by: Sam James <sam@gentoo.org>
---
test/user_counters_tabular_test.cc | 3 +++
1 file changed, 3 insertions(+)
diff --git a/test/user_counters_tabular_test.cc b/test/user_counters_tabular_test.cc
index 3e8fb1bf0..ffd3c0992 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({
|