in crates/ratchet-core/src/gpu/buffer_allocator/allocator.rs [168:205]
fn calculate_usage_records(
execution_order: &[&Tensor],
) -> FxHashMap<TensorId, TensorUsageRecord> {
let mut records =
FxHashMap::with_capacity_and_hasher(execution_order.len(), Default::default());
let topo_len = execution_order.len() - 1;
for (iter, t) in execution_order.iter().rev().enumerate() {
if t.resolved() {
continue;
}
for source in t.op().srcs() {
if source.resolved() {
continue;
}
let true_source = Self::determine_tensor_source(source);
records
.entry(true_source.id())
.or_insert_with(|| TensorUsageRecord {
id: None,
producer: None,
last_consumer: topo_len - iter,
#[cfg(debug_assertions)]
last_consumer_id: t.id(),
size: true_source.num_bytes(),
});
}
if let Some(record) = records.get_mut(&t.id()) {
record.id = Some(t.id());
record.producer = Some(topo_len - iter);
}
}
//filter records with no producer
//TODO: Warning: could be a bug here
records.retain(|_, v| v.producer.is_some());
records
}