benchmarks/libcpucycles: report actual CPU frequency if supported

This uses sched_getcpu(2) to find the CPU we are scheduled on and then
cpufreq(4) to find the frequency of that CPU.  The caller is responsible
for pinning the thread to one CPU and/or disabling frequency scaling if
a consistent result is required.
This commit is contained in:
Robert Clausecker 2024-11-20 13:44:21 +01:00
parent 2ea3beede0
commit 05515f1759
2 changed files with 46 additions and 3 deletions

View file

@ -1,6 +1,6 @@
PORTNAME= libcpucycles PORTNAME= libcpucycles
DISTVERSION= 20240318 DISTVERSION= 20240318
PORTREVISION= 1 PORTREVISION= 2
CATEGORIES= benchmarks devel CATEGORIES= benchmarks devel
MASTER_SITES= https://cpucycles.cr.yp.to/ MASTER_SITES= https://cpucycles.cr.yp.to/

View file

@ -1,6 +1,19 @@
--- cpucycles/wrapper.c.orig 2024-10-29 18:59:34 UTC --- cpucycles/wrapper.c.orig 2024-03-18 00:15:33 UTC
+++ cpucycles/wrapper.c +++ cpucycles/wrapper.c
@@ -26,7 +26,7 @@ void cpucycles_tracesetup(void) @@ -16,6 +16,12 @@
#include <inttypes.h>
#include <signal.h>
#include <setjmp.h>
+
+#ifdef __FreeBSD__
+#include <sched.h>
+#include <sys/sysctl.h>
+#endif
+
#include "cpucycles.h"
#include "cpucycles_internal.h"
@@ -26,7 +32,7 @@ void cpucycles_tracesetup(void)
tracesetup = 1; tracesetup = 1;
} }
@ -9,3 +22,33 @@
static void crash(int s) static void crash(int s)
{ {
@@ -81,6 +87,21 @@ static double osfreq(void)
if (s > 0) return result;
}
+#ifdef __FreeBSD__
+ {
+ int freq;
+ size_t len = sizeof freq;
+ char *freqctl;
+
+ if (asprintf(&freqctl, "dev.cpu.%d.freq", sched_getcpu())) {
+ if (sysctlbyname(freqctl, &freq, &len, NULL, 0) == 0) {
+ free(freqctl);
+ return 1e6 * freq;
+ } else
+ free(freqctl);
+ }
+ }
+#else
f = fopen("/sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed", "r");
if (f) {
s = fscanf(f,"%lf",&result);
@@ -163,6 +184,7 @@ static double osfreq(void)
pclose(f);
if (result) return 1000000.0 * result;
}
+#endif /* defined(__FreeBSD__) */
x = getenv("cpucyclespersecond");
if (x) {