57 Commits
Author SHA1 Message Date
owen 187c902b7a Remove CPU telemetry (background temperature/clock speed sampling)
The background thread that sampled CPU temperature and clock speed
during a run relied on undocumented, OS-specific interfaces: raw
AppleSMC keys on macOS, WMI ACPI thermal zones on Windows, and
/sys/class/thermal or /sys/class/hwmon on Linux. Testing on Apple
Silicon showed the SMC key scan can silently switch between different
physical sensors mid-run, producing discontinuous jumps in reported
temperature, and live per-core clock speed was never obtainable on
macOS through any public API. Disable the feature entirely rather
than ship unreliable data: drop the telemetry monitor thread, its
platform-specific sensor backends, and the telemetry field from
upload payloads. The pre-run background system-activity check
(--no-system-check) is unrelated and untouched.

Bump FB_VERSION to 0.4.2.
2026-07-21 13:53:28 -05:00
owenandClaude Sonnet 5 ec7e75e105 Fix CPU telemetry temperature/clock speed on Windows and macOS
sample_cpu_temperature() only ever had a Linux implementation, so
Windows and macOS runs recorded empty temperature data points for
every sample. sample_cpu_clock_mhz() on both platforms read a static
nominal frequency once (Windows: the ~MHz registry value; macOS: the
hw.cpufrequency sysctl) instead of a live reading, so clock speed
showed as a constant throughout the benchmark.

Windows: temperature now queries the ACPI thermal zone over WMI
(MSAcpi_ThermalZoneTemperature), and clock speed reads live per-core
frequency via CallNtPowerInformation(ProcessorInformation). Both are
XP-compatible (verified via mingw cross-compile with the existing
windows-i386 XP toolchain/PE checks).

macOS: temperature reads the SMC directly (AppleSMC user client),
checking known CPU sensor keys across Intel and Apple Silicon
(M1-M5). There is no live-frequency API on macOS at all (Apple
Silicon has none, and hw.cpufrequency was always a fixed nominal
value even on Intel), so clock speed now reports as unavailable
instead of a misleading constant.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PcL8rcwwBeD6W3fZFCRLss
2026-07-21 01:13:33 -05:00
owen dcc77408c0 Merge branch 'feature-usage-graphs'
Adds CPU telemetry recording (temperature and clock speed) during
benchmark runs, uploaded alongside results. Workload phase recording
was tried and then removed after it was found to distort scores;
telemetry now samples at 2/sec.
2026-07-21 00:30:51 -05:00
owen 31ec0f67e0 Drop workload phase recording and slow telemetry sampling to 2/sec
The telemetry thread's per-core /sys scan was contending with the
timed benchmark passes, and could corrupt the workload-size
calibration step, causing run-to-run swings of up to 4x. Removing
phase recording and dropping the sample rate from 4/sec to 2/sec
brings runs back to <5% variance.
2026-07-21 00:29:39 -05:00
owen 042c839751 Record benchmark workload phases 2026-07-20 22:54:57 -05:00
owen 920092333f Sample CPU telemetry every quarter second 2026-07-20 22:47:39 -05:00
owen 913cfe3726 Record CPU telemetry during benchmarks 2026-07-20 22:36:13 -05:00
owen 7e5cbcde9c Preserve Windows XP compatibility in core detection 2026-07-20 19:11:45 -05:00
owen 36aad77a87 Merge v0.4.0 workload changes 2026-07-20 19:10:17 -05:00
owen c48328324c Reduce benchmark test duration to 0.4 seconds 2026-07-20 19:10:07 -05:00
owen 801fe88fbd weee 2026-07-20 18:15:02 -05:00
owenandClaude Opus 4.8 c35ec1451f Fix a few things that were throwing off benchmark scores
Two of the workloads (Native Integer Math and Memory Bandwidth) were
plain C rather than assembly, so the compiler's auto-vectorizer got to
decide how fast they ran. Newer Clang basically tripled the integer
number and blew up the STREAM triad by ~3x, which meant the same chip
landed all over the place depending on how it was built. Pinned both to
scalar codegen so GCC and Clang line up again.

Also stopped run_test from keeping only the fastest repeat -- it was
rewarding one lucky pass and hiding the normal run-to-run wobble. It
averages the repeats now.

And core detection was just wrong on a couple platforms. Windows was
handing back logical processors as physical cores (so an 8c/16t part
showed up as 16 cores), and Linux boxes where /proc/cpuinfo doesn't
carry topology (PowerPC, ARM) fell back to the thread count too -- a
176-thread POWER8 claimed 176 cores. Windows now counts real cores via
GetLogicalProcessorInformationEx, and Linux falls back to sysfs
thread-sibling groups, which also handles Apple Silicon's per-cluster
core_id numbering.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 14:54:20 -05:00
owen 6e21ee3574 package non-Linux releases as zip 2026-07-20 13:29:52 -05:00
owen 7a4ca7eca7 fixes 2026-07-20 13:19:11 -05:00
owen 27833003ce changes 2026-07-19 21:41:34 -05:00
owen 59b158b1c9 Move benchmark scoring to the server 2026-07-19 19:22:21 -05:00
owen 290344ae5b Add little-endian PowerPC kernels 2026-07-19 18:28:48 -05:00
owen fead8446b2 Use HTTP for result uploads 2026-07-19 17:59:35 -05:00
owen 298ad2a0f6 Always return a claim code after uploads 2026-07-19 17:22:34 -05:00
owen 5768958fbb Restore macOS background sampling declarations 2026-07-19 17:06:52 -05:00
owen d574960655 Publish temporary macOS build diagnostics 2026-07-19 17:04:39 -05:00
owen a358c8e8f5 Harden cross-platform release packaging 2026-07-19 17:02:36 -05:00
owen 4dba40e8d3 Expose macOS release build diagnostics 2026-07-19 17:00:28 -05:00
owen 2dc8244057 Fix macOS ARM64 release detection 2026-07-19 16:58:46 -05:00
owen 9a13869052 Release 0.2.1 with expanded hardware detection 2026-07-19 16:54:18 -05:00
owen e8f701a43b Forgot that static linking breaks OpenSSL and therefore uploads, back to dynamic until I can think of a fix. Will work on it later 2026-07-19 11:17:39 -05:00
owen 25bb0e3591 Limit release smoke checks to native runners 2026-07-18 23:39:04 -05:00
owen 6f45323f7d Fix Linux ARM64 release upload crash 2026-07-18 23:22:56 -05:00
owen 9271c9417b static linux builds 2026-07-18 23:02:49 -05:00
owen e585f509ac release 0.2.0 2026-07-18 22:42:08 -05:00
owen 413dd3eb84 prelim PPC64be/PPC32be ASM testing, to be refined later 2026-07-18 21:04:37 -05:00
Owen Rummage 6ab1968aab Merge pull request #2 from owenrummage/owen-refactor
alright, 5hrs of refactoring and remaking it because I was tired of t…
2026-07-18 18:06:06 -05:00
owen d14fb980bb alright, 5hrs of refactoring and remaking it because I was tired of the AI code breaking 2026-07-18 18:04:56 -05:00
owen 5f1a2b2cea Add pre-benchmark system activity checks 2026-07-18 12:09:26 -05:00
owen cefa9021ec Support Windows result uploads via WinHTTP
Windows builds previously stubbed out --upload entirely. WinHTTP handles
TLS and certificate verification against the system trust store natively,
so unlike the POSIX path this needs no OpenSSL/embedded CA bundle - just
-lwinhttp, a system DLL that ships with Windows.
2026-07-18 07:38:24 -05:00
owen 9d9dbeccae Remove dist/ build output from version control
Release binaries are built fresh by CI (.github/workflows/release.yml)
and attached to GitHub releases; checked-in binaries here were just
stale build output, not something the release pipeline reads.
2026-07-18 07:05:34 -05:00
owen 8ae7c6ecf9 Fix TLS upload failures by embedding a CA trust bundle
SSL_CTX_set_default_verify_paths() only works if OpenSSL's compiled-in
default CA path happens to exist on the machine running the binary -
a path baked in wherever OpenSSL was built, not where the release
binary ends up. That almost never matched an end user's machine
(no such path on stock macOS; Linux distros disagree on the
location), so --upload failed with a TLS/certificate error on nearly
every machine except the one that built the release binaries.

Embed the Mozilla CA root bundle (src/ca_bundle.h) as a fallback trust
source, tried alongside the system's own default paths so locally-
trusted/corporate CAs still work where present. Windows is unaffected
since TLS is stubbed out there already.

Bump to 0.1.5-hotfix2.
2026-07-18 07:03:04 -05:00
owen 72043eb956 Add Windows support and windows-amd64/windows-i386 release binaries
The x86-64 kernels were written to the System V ABI only; on Windows's
different calling convention they silently read garbage args and ran in
near-constant time regardless of iteration count. Each public kernel now
gets a small ABI-translating thunk (WIN64_THUNK) on Windows so the kernel
bodies stay single-source. i386 also needed underscore-prefixed symbol
names to match Windows's cdecl convention. Verified end-to-end under Wine,
including determinism across repeated runs.

Also fixes CPU-core detection (sysconf isn't available under MinGW) and
adds memory/CPU-brand detection for the Windows system-info banner.
2026-07-18 06:48:40 -05:00
owen 0c31675c52 Bump version to 0.1.5 2026-07-18 06:02:30 -05:00
owen ad5791bbb7 Add authenticated uploads and rename fossmark to fossbench
Uploads can now be attributed to a fossbench.net profile: set
FOSSBENCH_TOKEN and the client sends it as a Bearer token, which the
server auto-approves and links to the account. Anonymous, pending-review
upload stays the default when no token is set. New --upload/--noupload
flags skip the interactive prompt for scripted runs, and the client
reports HTTP 401/422 distinctly from other failures. The token is never
printed or logged.

Also renames the project and its internal identifiers (FM_/fm_ macros
and symbols, source filenames, binary output names) from fossmark to
fossbench, matching the actual product name. The "fossmark_version"
field in the upload payload is left as-is, since it's the server API's
fixed contract field, not this client's own name.
2026-07-18 06:02:24 -05:00
owen 357e6f0d6d Rewrite i386 backend as hand-written assembly
Replaces the C fallback (borrowed from PowerPC) with dedicated i386
assembly for all nine kernels, matching the amd64/arm64 convention.
Fixes two real bugs found and verified on physical Pentium 4 hardware:
scalar FP silently running on x87 instead of SSE2, and fm_int_math
calling __udivdi3 on every iteration of the highest-weighted test
because the C compiler didn't know its 0xdeadbeef divisor fits in 32
bits. Real-hardware SINGLECORE/MULTICORE scores go from 425/448 to
539/581.
2026-07-18 04:35:03 -05:00
owen 136b417cf8 Add Pentium 4 Linux support 2026-07-17 19:43:26 -05:00
owen 7f33d448c7 Fix DNS uploads in Linux release builds 2026-07-17 19:32:03 -05:00
owen e2b8887dd4 Include machine model in benchmark uploads 2026-07-17 19:29:46 -05:00
owen 28b3ac266b Support legacy Intel macOS loaders 2026-07-17 18:51:31 -05:00
owen 0662bfe52d Stop publishing incompatible PPC64 binaries 2026-07-17 18:30:21 -05:00
owen 438cc58b02 Add PPC64 iMac G5 build support 2026-07-17 18:21:31 -05:00
owen 7e2360c104 remove API token requirement from uploads 2026-07-17 17:30:21 -05:00
owen aaae64e97c link libatomic in static PPC32 release 2026-07-17 17:22:49 -05:00
owen 03a51d9456 add HTTPS uploads and static release builds 2026-07-17 17:19:31 -05:00