libcpucycles: Download

To download and unpack the latest version of libcpucycles:

    wget -m https://cpucycles.cr.yp.to/libcpucycles-latest-version.txt
    version=$(cat cpucycles.cr.yp.to/libcpucycles-latest-version.txt)
    wget -m https://cpucycles.cr.yp.to/libcpucycles-$version.tar.gz
    tar -xzf cpucycles.cr.yp.to/libcpucycles-$version.tar.gz
    cd libcpucycles-$version

Then install.

### Archives and changelog (reverse chronological)

`libcpucycles-20260105.tar.gz` browse

Bigger split of RDPMC-based counters to handle not just `perf` sometimes incorrectly returning index 0 on Intel but also AMD not supporting fixed-function counter `0x40000001`. New `amd64-perfpmcff` tries fixed-function counter `0x40000001` within `perf`; `amd64-perfpmc` now goes back to trying index returned by `perf`; `amd64-pmcff` (renamed from `amd64-pmc`) tries fixed-function counter `0x40000001` outside `perf`.

Add `orderbump` mechanism, for example to prefer `tsc` more systematically over `tscasm`.

`libcpucycles-20251226.tar.gz` browse

Split `amd64-pmc`, `arm64-pmc`, `riscv32-rdcycle`, and `riscv64-rdcycle` into `perf` and non-`perf` versions, with the `perf` versions tried first. Hopefully the `perf` versions will also eliminate the need to install kernel modules for `amd64-pmc` and `arm64-pmc`.

For `amd64-pmc`, always use fixed-function cycle counter `(1<<30)|1`. This works around a bug in, e.g., kernel 6.1.0 `perf` incorrectly returning index 0 for E-cores.

For all `perf`-based counters, use `PERF_FLAG_FD_CLOEXEC` if it is available.

For `*tsc*` counters, return invariant TSC frequency if that is clear from CPUID information. Thanks to Tee-Kiah Chia for the suggestion and a prototype patch.

Add internal `ticks_close()`, most importantly for closing `perf` descriptors. (An alternative would be to unify the `perf` handling inside a single `perf_event_open` in `wrapper` conditioned on Linux, but this raises the question of how to handle `perf` platform variations such as `arm64-pmc` needing `3` in `config1`.)

Increase penalty for `EXTEND32` counters. (It might be better to directly benchmark the extension.)

Increase penalty for fixed-frequency counters, including RDTSC when it is known to be invariant.

For `wrapper`, use `sigjmp_buf` instead of `jmp_buf`.

Document requirements on `/sys/devices/cpu*/rdpmc` and `/proc/sys/kernel/perf_user_access`. Add `cpucycles-open` abstraction.

Update `configure`: recognize a few more x86 synonyms; `--no-` instead of `--no`; support `configure.log`.

Support `$DESTDIR` in `install`. Thanks to Robert Clausecker for the suggestion.

`libcpucycles-20250925.tar.gz` browse

For `perfevent`, try all combinations of disabling exclude-kernel and disabling exclude-hv, to handle platforms where cycle counters cannot handle one or both of those.

For `perfevent`, do `DISABLE` and `ENABLE` around counter read (suggested by Jim Apple) to (hopefully) handle Graviton 3. But skip this if a setup test seems to work without it.

Recognize `sun4v` as `sparc64`.

Add support for `loong64`.

Eliminate various compiler warnings.

For `cpucycles-info`, print interquartile mean (iqm) rather than median.

Say "sometimes" in documentation for enabling cycle counters in ARM via kernel modules.

Change HTML style, in particular for better usability on phones.

`libcpucycles-20240318.tar.gz` browse

Port to MacOS X: handle missing `-lrt`, and handle differences in shared-library naming.

Include `cpucycles-info` man page.

`libcpucycles-20240114.tar.gz` browse

Add `arm32-1176` counter.

Allow slop 0.2 rather than 0.1 for `FINDMULTIPLIER`.

Improve platform detection.

Port to FreeBSD.

Use blue boldface during compilation for "skipping option that did not compile".

`doc/install.md`: headings; note manual pages.

Add `doc/license.md`.

Update HTML style for better tt visibility and copy-paste.

`libcpucycles-20230115.tar.gz` browse

Update actual `cpucycles_version` behavior to match documentation.

`libcpucycles-20230110.tar.gz` browse

`doc/api.md`: Document `cpucycles_version()`.

Add `s390x-stckf` counter.

`cpucycles/default-perfevent.c`: Read into `int64_t` instead of `long long`. Add comment explaining issues with `PERF_FORMAT_TOTAL_TIME_RUNNING`.

`configure`: Improve `uname` handling.

`doc/api.md`: Update description of default frequency.

`libcpucycles-20230105.tar.gz` browse

Initial release.

Version: This is version 2026.01.05 of the "Download" web page.