pub struct NodeCaps {
pub addr: String,
pub os: String,
pub cores: usize,
pub ram_total: u64,
pub ram_avail: u64,
pub disk_free: u64,
pub devices: Vec<DeviceInfo>,
pub gflops: f64,
pub io_mbps: f64,
}Expand description
A node’s measured hardware profile.
Fields§
§addr: StringAddress the coordinator reaches this node’s worker at (host:port).
os: StringOS string (macos, linux).
cores: usizeLogical CPU cores.
ram_total: u64Total / currently-available host RAM (bytes).
ram_avail: u64§disk_free: u64Free disk at the checkpoint location (bytes).
devices: Vec<DeviceInfo>Compute devices, CPU first.
gflops: f64Rough sustained matmul throughput (GFLOP/s, f32) from a micro-bench.
io_mbps: f64Rough disk read throughput (MB/s) from a micro-bench (0 if not measured).
Implementations§
Source§impl NodeCaps
impl NodeCaps
Sourcepub fn accel_mem(&self) -> u64
pub fn accel_mem(&self) -> u64
Best (non-CPU) accelerator memory ceiling, else host RAM — the largest a
stage can occupy on this node’s device. A GPU that reports a positive
mem_bytes (discrete VRAM, or an APU’s GTT / GPU-addressable system RAM)
caps the stage even when it is “unified”: an amdgpu APU shares system RAM
but the kernel bounds GPU access at GTT, so we must honor it. Devices with
no meaningful ceiling (Apple Metal, mem_bytes == 0) fall through to RAM.
Sourcepub fn gflops_for(&self, dev: Device) -> f64
pub fn gflops_for(&self, dev: Device) -> f64
Measured throughput of dev specifically, falling back to the node’s
headline figure when that device was not benched.
Costing a stage by Self::gflops — the node’s fastest device — is
only right when the stage runs there, and it need not: the device is
picked for its memory ceiling (or pinned by hand in the config). On an
M4 Pro the CPU’s AMX benches ~1100 GFLOP/s against Metal’s ~540, so a
node placed on Metal and costed on the headline is priced at twice the
throughput it will deliver.
Trait Implementations§
Source§impl<'de> Deserialize<'de> for NodeCaps
impl<'de> Deserialize<'de> for NodeCaps
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Auto Trait Implementations§
impl Freeze for NodeCaps
impl RefUnwindSafe for NodeCaps
impl Send for NodeCaps
impl Sync for NodeCaps
impl Unpin for NodeCaps
impl UnsafeUnpin for NodeCaps
impl UnwindSafe for NodeCaps
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more