Skip to main content

Machine capability detection and compute normalization

Project description

coren

Compute and resource normalization.

Measures what your machine can do. Built for irohds -- to tell you whether a computation is faster to run locally or fetch from the network.

Any two machines looking at the same function can independently agree on how much work it requires (an almost deterministic op count). Each machine knows its own capabilities (benchmarked once at startup). The verdict is local arithmetic: compare estimated compute time against estimated fetch time.

Integration into irohds, a decentralized memoization system for scientific computing, was the initial reason for making this package. It is also useful as a standalone tool for roofline analysis, ETL buffer sizing, and build parallelism decisions.

Install

uv add coren

Or from source:

uv run maturin develop --features python

Usage

from coren import FnCost, MachCap

# Describe the work (deterministic, same on every machine)
cost = FnCost.sort(1_000_000, 64, 64_000_000)

# Measure this machine (benchmarks run once, cached)
cap = MachCap.read()

# Get the answer
v = cap.verdict(cost)
print(v)  # "compute (saves 0.712s)" or "fetch (saves 2.3s)"

if v.should_fetch():
    download_result()
else:
    compute_locally()

How it works

Two layers:

FnCost describes a function's resource requirements in absolute physical units. Four integers: ops (total arithmetic operations), mem_bytes (memory traffic), peak_mem (peak RAM footprint), result_bytes (output size). These are properties of the algorithm and its inputs. Bitwise identical on every machine.

MachCap describes what this machine can do. Measured via micro-benchmarks (FMA throughput, STREAM triad, disk sequential I/O) and OS queries (NIC link speed, battery state, core count, RAM). Produces a roofline model: peak ops/s and memory bandwidth.

The verdict compares estimated compute time (from the roofline model) against estimated fetch time (result_bytes / NIC bandwidth). The score is the difference in seconds: positive means fetch is faster, negative means compute is faster. Infinity means one option is impossible (no RAM, or no network).

FnCost constructors

FnCost.new(ops, mem_bytes, peak_mem, result_bytes)   raw values
FnCost.scan(n_bytes, result_bytes)                   linear scan
FnCost.sort(n, item_bytes, result_bytes)             merge sort
FnCost.hash(n_bytes)                                 crypto hash
FnCost.matmul(m, n, k, result_bytes)                 dense GEMM
FnCost.etl(rows, row_bytes, ops_per_row, result_bytes)  row processing
FnCost.copy(size)                                    file copy (ops=0)

Combinators

a.then(b)    # sequential: ops sum, peak_mem = max, result = b's output
a + b        # same as then
a.par(b)     # parallel: ops = max, peak_mem sums, result sums
a.repeat(k)  # k iterations, peak_mem unchanged

Normalizing wall-clock measurements

When a function is executed and you only know the wall-clock time (not the algorithmic complexity), MachCap.normalize() converts the measurement into a FnCost suitable for local verdict computation.

WARNING: normalize() output is NOT deterministic across machines. Different machines produce different ops/mem_bytes values for the same function. Do NOT use normalize()-produced FnCost as cache keys, content addresses, or any identifier that must match across peers. For cache keys, use the static constructors (sort, hash, matmul, etc.) or FnCost.new() with values derived from the function's definition and parameters.

cost = cap.normalize(compute_ns=15_000_000_000, peak_mem=4_000_000_000, result_bytes=500_000_000)
# cost is a safe overestimate, suitable for verdict() but NOT for cache keys

CLI

$ coren
coren  [desktop]
  cores                    8p / 16l
  frequency                3600 MHz

  roofline (measured)
    peak (all cores)       89.2 GFLOPS
    mem bandwidth          38.1 GB/s
    disk bandwidth         1.52 GB/s
    ridge point            2.34 ops/byte

  verdicts (what should this machine do?)
    task                       ops         Q         R    score       neck action
    sort 1M x 64B          200.0M     1.2GB    10.0MB   -0.712   memory compute
    matmul 1k^3              2.0G    22.9MB    10.0MB   -0.779  compute compute

$ coren --json   # machine-readable output

Rust

use coren::{FnCost, MachCap};

let cost = FnCost::sort(1_000_000, 64, 64_000_000);
let cap = MachCap::read(".");
let v = cap.verdict(&cost);

if v.should_fetch() {
    // download from peer
} else {
    // compute locally
}

License

MIT OR Apache-2.0

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

coren-0.1.3.tar.gz (864.5 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

coren-0.1.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (405.2 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

coren-0.1.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (379.9 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

File details

Details for the file coren-0.1.3.tar.gz.

File metadata

  • Download URL: coren-0.1.3.tar.gz
  • Upload date:
  • Size: 864.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.11

File hashes

Hashes for coren-0.1.3.tar.gz
Algorithm Hash digest
SHA256 06fe89a0ead1fc2a9147ff580144e045e392d6b4a047108c2698285740857156
MD5 05babc62edda3a89ce0147e70b4c6b97
BLAKE2b-256 fedb18c8d5bae96cd99038ec489e6dfb898cb486442f6a3e202698feb1cef246

See more details on using hashes here.

File details

Details for the file coren-0.1.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for coren-0.1.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9918c586bfe471cc35fc14a59f175788820ccc479579132e581646e2f4c085df
MD5 3c49762cba78c8b70b228ac411ab374f
BLAKE2b-256 291b06bb10cb05e07e4b6417257c0b6071629610e66049763a714268b1f8841c

See more details on using hashes here.

File details

Details for the file coren-0.1.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for coren-0.1.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 321c4de0db3b72e1255469f22a81c03616d1f66a1b4f4c24b960a8deb4344fe7
MD5 c37f8072637c2c1cef0a567110261bf8
BLAKE2b-256 5849892df94adfc1dacb1cdd8c850a22c2c1787172e755e30334c56ec6f8adf2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page