张量
全景里那次 a.matmul(&b, &mut engine) 的 a 是一个 TypedTensor<f64>。这一部分讲它本身:类型里装了什么,[2, 3] 的六个数在内存里怎么排,这块内存归谁、什么时候被复制、用完去哪。engine 把调用送进 CPU 之后的事,在 CPU 后端。
代码在两个 crate 里。tenferro-tensor-core(src/ 2040 行,不含测试)只剩与存储无关的元数据:dtype 标签、标量 trait、秩、TensorLayout。tenferro-tensor(src/ 26273 行,不含测试)放所有带存储的张量:types.rs 一个文件 11680 行,TypedTensor、Tensor、各种视图都在里面;storage/ 4849 行(不含 storage/tests/)是分配组的所有权内核。tenferro-runtime 再把这些类型原样转出(tenferro_runtime::TypedTensor 就是同一个类型)。
- 数据模型:
DType由一张标量表展开;TypedTensor<T, R, D>的R是秩(DynRank或Rank<N>,后者可以t[[i, j]]),D是 0.8.0 新加的表示(Host、Gpu、默认的Dynamic),只有Host能clone;HostTensor删了;动态Tensor是七个TypedTensor的枚举,互转不复制;TypedTensor<f64>280 字节。 - 列主序与视图:拥有型张量只有紧凑列主序一种布局;行主序缓冲区交给
from_vec_col_major仍静默算错,from_vec_row_major显式重排一次;transpose_view、slice_view、reshape_view只换布局、不分配;CPU 引擎在这里接上 strided-rs;几种桥接方式的实测开销。 - 存储与所有权:普通张量直接持有一个
Vec,只有进了分配组或来自后端缓冲区的才带AllocationGroup;视图借用、duplicate复制、移动不复制;CPU 引擎的输出 drop 时经弱引用回收器回池;分配编号属于设备侧,Apple 共享内存已删除,CUDA 只读源码。
flowchart TB vec["Vec f64"] --> ctor["from_vec_col_major"] ctor --> typed["TypedTensor T R D"] typed -->|from_typed| dynt["Tensor"] dynt -->|into_typed| typed typed --> layout["形状与步长"] typed --> place["Placement"] typed -->|Host 支| hostv["Vec 加回收器"] typed -->|Group 支| group["AllocationGroup"] typed -->|as_view| view["TypedTensorView"] view -->|to_contiguous| typed
第一页回答「它是什么类型」,第二页回答「数怎么排」,第三页回答「内存归谁」。eager 和 traced 两种张量(EagerTensor、TracedTensor)是在这层之上的句柄,分别在 eager AD 和 TracedTensor 讲。
💬 关联讨论
发起讨论加载中...