gizlang:machine
What this machine is: its CPU's instruction-set features, the CPUs this process may use, the caches they share and the memory nodes, detected at run time by the runtime, never inferred from a model name. Code that sizes its work to the hardware (a hash table to a cache, a kernel to its vector width, a pool to its CPUs) reads it here.
One cap rules every choice: GIZLANG_CPU sets the x86-64 level code runs at, and the features stop at that level, so a kernel or a compiled unit chosen from them never uses more. GIZLANG_THREADS lowers threads as it lowers Task.parallel's pool.
import * as Machine from "gizlang:machine";Types
Cache
type Cache = { level: i64; bytes: i64; cpus: Vec<i64>; }One cache that a set of CPUs share (data or unified; instruction caches are left out).
level:i64bytes:i64cpus:Vec<i64>
Node
type Node = { bytes: i64; cpus: Vec<i64>; }One memory node and its CPUs. A node with no CPUs is memory far from every core (CXL memory, a device's).
bytes:i64cpus:Vec<i64>
Machine
type Machine = { arch: string; features: Vec<string>; level: i64; cpus: Vec<i64>; threads: i64; caches: Vec<Cache>; nodes: Vec<Node>; }The CPU, caches and memory nodes of the machine that the program runs on.
arch:string— "x86-64", "aarch64" or "generic".features:Vec<string>— As LLVM names them ("avx2", "avx512f", "sve2"), at most those oflevel.level:i64— The x86-64 level code runs at: 4 (AVX-512), 3 (AVX2), 2 (the baseline); 0 on another architecture.cpus:Vec<i64>— The CPUs this process may run on (its affinity).threads:i64— The threads Task.parallel runs on: affinity, the container's CPU quota and GIZLANG_THREADS.caches:Vec<gizlang_machine.Cache>— Each cache instance once, smallest level first as the kernel lists them.nodes:Vec<gizlang_machine.Node>
Functions
machine
function machine(): MachineThis machine. The runtime reads it once per process; each call parses that text again (microseconds).
Effects: fail, read.
cpuList
function cpuList(text: string): Vec<i64>"0-7,16-23" as its CPUs.
Effects: fail.
Methods
Machine.has
function Machine.has(self: Machine, feature: string): boolWhether the CPU has FEATURE (an LLVM name), within the level code runs at.
Effects: fail.
Machine.cacheShare
function Machine.cacheShare(self: Machine, level: i64): i64The bytes of the cache of LEVEL that one core of this process may count on: over each instance, its bytes over the usable cores that share it, the least of them; 0 when no cache of LEVEL is known. CPUs that share a first-level cache (SMT siblings) are one core. A hash table or a partition sized to it stays in that cache while every core works on its own.
Effects: fail.
Machine.lastLevel
function Machine.lastLevel(self: Machine): i64The highest cache level known (3 on most servers), or 0.
Effects: fail.
Machine.groups
function Machine.groups(self: Machine): Vec<Vec<i64>>The usable CPUs that share each last-level cache (an AMD CCD, an Intel socket), in the kernel's order. Threads of one group share that cache; data that crosses groups goes through memory.
Effects: fail.